硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6360|回复: 9
收起左侧

[有问必答] ARM数据占用问题

[复制链接]

116

主题

800

回帖

1148

积分

至尊会员

积分
1148
QQ
发表于 2014-10-10 08:38:47 | 显示全部楼层 |阅读模式
如果定义8位  或者 16位的数据,是不是也是需要占用32bit的内存空间?也就是说自动补齐32位, 实际定义8位其实没有节省空间?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
发表于 2014-10-10 10:28:32 | 显示全部楼层
不是的,如果强制设置对齐方式的话,会是这样的。你可以在MDK上用一些数据试试。
回复

使用道具 举报

116

主题

800

回帖

1148

积分

至尊会员

积分
1148
QQ
 楼主| 发表于 2014-10-10 11:39:02 | 显示全部楼层
在mdk上看编译结果是都是按照32位来分配的,不知道是不是需要哪里设置
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
发表于 2014-10-10 11:47:47 | 显示全部楼层
抽空我研究研究,这个我没有怎么研究过。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
发表于 2014-10-10 12:28:42 | 显示全部楼层
刚才试了试,他是这样的,不够四字节的情况下,会做四字节对齐。
比如下面这几种情况就是占用四个字节。
***********************************

uint8_t aa = 10;


int main(void)
{
    aa = 222;
}
************************************

uint8_t aa = 10;
uint8_t bb = 10;
int main(void)
{
    aa = 222;
        bb = 222;
}

************************************

uint8_t aa = 10;uint8_t bb = 10;
uint8_t cc = 10;int main(void)
{    aa = 222;
        bb = 222;        cc = 222;
}

************************************

uint8_t aa = 10;uint8_t bb = 10;
uint8_t cc = 10;uint8_t dd = 10;
int main(void){
    aa = 222;        bb = 222;
        cc = 222;       dd = 222;
}
上面的几种情况,内存使用都是下面这样的:
1.png



再加入一个字节的变量,就是下面这样的,RW !=21,而是24:
1.png


回复

使用道具 举报

116

主题

800

回帖

1148

积分

至尊会员

积分
1148
QQ
 楼主| 发表于 2014-10-10 12:51:57 | 显示全部楼层
这样子分配还合理点,不然就没必要区分8位或者16位数据,

再请教个问题, 在ucos中任务内存空间是乘以4的关系,这个该怎么理解
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
发表于 2014-10-10 13:21:13 | 显示全部楼层

回 jcx0324 的帖子

jcx0324:这样子分配还合理点,不然就没必要区分8位或者16位数据,

再请教个问题, 在ucos中任务内存空间是乘以4的关系,这个该怎么理解 (2014-10-10 12:51) 
这个是硬性要求,因为任务的切换是要做入栈和出栈操作的,入栈和出栈主要是寄存器的保护,这些寄存器都是32位的,所以也得是4字节对齐。
回复

使用道具 举报

116

主题

800

回帖

1148

积分

至尊会员

积分
1148
QQ
 楼主| 发表于 2014-10-10 13:42:06 | 显示全部楼层
我也是这么理解的,感谢解答,谢谢
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
发表于 2014-10-10 13:44:35 | 显示全部楼层

回 jcx0324 的帖子

jcx0324:我也是这么理解的,感谢解答,谢谢 (2014-10-10 13:42) 
还有一个最重要的原因是PUSH和POP操作必须是4字节对齐。
回复

使用道具 举报

116

主题

800

回帖

1148

积分

至尊会员

积分
1148
QQ
 楼主| 发表于 2014-10-10 14:08:46 | 显示全部楼层
那裸机的时候push和pop应该也是一样的,为什么能够智能分配
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-11-1 07:05 , Processed in 1.145328 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表