Bootstrap

ARM中ZI-data段和RW-data段


最近使用Keil写代码时,碰到了几个现象,现在汇总一下


初始情况:
Program Size: Code=51988 RO-data=5560 RW-data=592 ZI-data=3064
在这里插入图片描述

1、只定义全局变量,不使用,不占用内存空间

示例:pandas 是基于NumPy 的一种工,该工具是为了解决数据分析任务而创建的。

在下面情况下都是使用了全局变量的。


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中的结果

;