OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6568|回复: 2

求问__attribute__((at(0x08040000)))这种写法为什么会增加padding(内存对齐)

[复制链接]

33

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2019-11-13
在线时间
39 小时
发表于 2021-4-12 11:58:29 | 显示全部楼层 |阅读模式
1金钱
如题,求问__attribute__((at(0x08040000)))这种写法为什么会增加padding(内存对齐)
第一种写法如下:
__align(32) const float SV[Buffer_Size]__attribute__((at(0x08040000)));
空间占据如下:
Program Size: Code=50666 RO-data=1308770 RW-data=952 ZI-data=9824

第二种写法如下:
__align(32) const float SV[Buffer_Size];
空间占据如下:
Program Size: Code=50666 RO-data=1098878 RW-data=952 ZI-data=9824  

SV数组占据空间超过1M,所以想要存在flash里面。
现在出现的问题在于可以看到加上“__attribute__”声明之后,存储在flash里面的RO-data占据了更多的空间。
(即使不用“__attribute__”声明,由于有const声明,数组肯定存在flash里面,到那时没弄懂“__attribute__”声明为什么会增加padding)

查看.map文件可以看到

多出来的一部分,主要来自于padding,求问大佬这个是为什么,感谢!!!。




最佳答案

查看完整内容[请看2#楼]

当没有这个数组的时候,你的程序只有50k,那么编译器从0x08000000开始摆,摆到0~50k地址空间就可以了,所以总占用50k(程序); 当有这个数组,只使用__align(32)语法对齐,编译器会在原来的基础上,把你这个数组按32字节对齐,紧挨着前面的50k存放,所以总占用空间近似于50k(程序)+1M(数组大小); 当这个数组又强制要求必须从0x08040000地址开始摆(即__attribute__((at(0x08040000)))),那么编译器只得将这个数组从256k起 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2021-4-12 11:58:30 | 显示全部楼层
当没有这个数组的时候,你的程序只有50k,那么编译器从0x08000000开始摆,摆到0~50k地址空间就可以了,所以总占用50k(程序);
当有这个数组,只使用__align(32)语法对齐,编译器会在原来的基础上,把你这个数组按32字节对齐,紧挨着前面的50k存放,所以总占用空间近似于50k(程序)+1M(数组大小);
当这个数组又强制要求必须从0x08040000地址开始摆(即__attribute__((at(0x08040000)))),那么编译器只得将这个数组从256k起始地址开始摆,51k~255k就没有任何东西可放了,所以就是padding填充,最终总占用空间近似于50k(程序)+1M(数组大小)+200k(padding填充)。


但是这个padding是虚的,当你程序增长时,或者有小于200k的const数组时,编译器自然会把它们放在这里的,对应的padding就会自动减少了。
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

33

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2019-11-13
在线时间
39 小时
 楼主| 发表于 2021-4-12 14:33:13 | 显示全部楼层
xkwy 发表于 2021-4-12 14:17
当没有这个数组的时候,你的程序只有50k,那么编译器从0x08000000开始摆,摆到0~50k地址空间就可以了,所以 ...

感谢大佬~
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-28 03:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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