ARM中ZI-data段和RW-data段
最近使用Keil写代码时,碰到了几个现象,现在汇总一下
初始情况:
Program Size: Code=51988 RO-data=5560 RW-data=592 ZI-data=3064
1、只定义全局变量,不使用,不占用内存空间
在下面情况下都是使用了全局变量的。
2、 定义并初始化全局变量为0 占用ZI-Data区域
Program Size: Code=52000 RO-data=5560 RW-data=592 ZI-data=3072
在map文件也可以看出占用ZI-Data区域
3、定义并初始化全局变量非0 占用RW-Data区域
Program Size: Code=52000 RO-data=5560 RW-data=596 ZI-data=3068
map文件也可以看出占用RW-Data区域
4、增加的是一个int8的数据为什么,size增加不是1
与数据对齐以及段对齐有关有关:ARM是32位的,同时定义段时会有对齐操作
对比两个map文件
RW-Data: 全局初始化非0的大于全局初始化为0的4字节,包括:变量本身,Pad(补齐)处的3(6-3)字节
ZI-Data: 全局初始化为0的大于全局初始化非0的4字节,包括:变量本身,Pad(补齐)处的3(13-10)字节
那么如何确定是由于对齐影响的呢:在全局变量初始化非0情况下,增加一个全局变量非0的变量
Program Size: Code=52004 RO-data=5560 RW-data=596 ZI-data=3068
其Map文件
总的RW-data不变,总的Pad减1,main的RWdada加1
5、定义的全局变量为0,但增加的是RW-Data段大小?
与–bss_threshold=num 编译选项有关
默认是当定义变量小于8字节时,编译器优化,变量位于RW-Data段,只有大于8字节数据变量才位于ZI-Data段
初始化大小:
Program Size: Code=51988 RO-data=5560 RW-data=760 ZI-data=2904
定义小于8字节数据大小:
Program Size: Code=52000 RO-data=5560 RW-data=764 ZI-data=2900
定义大于8字节数据大小:
Program Size: Code=52008 RO-data=5560 RW-data=760 ZI-data=3032
修改–bss_threshold=0 可以得到1-4中的结果