使用keil编译工程生成hex的时候,会给出程序的大小和所占的内存。那么到底是怎么看这些信息的呢?
Code:为程序代码部分;
RO-Data:表示程序定义的常量及 const 型数据;
RW-Data:表示已经初始化的静态变量,变量有初值;
ZI-Data:表示未初始化的静态变量,变量无初值。
#define DATA (0x10000000) /* RO-Data */
char const GcChar = 5; /* RO-Data */
char GcStr[] = "string."; /* RW-Data */
char GcZero; /* ZI-Data */
其中,
ROM(Flash) Size = Code+RO-Data+RW-Data;
RAM Size = RW-Data+ZI-Data;
为什么上述的 RW-Data 既占用 Flash 又占用 RAM 么,变量不是放在 RAM 中的么,为
什么会占用 Flash?因为 RW 数据不能像 ZI 那样“无中生有”的, ZI 段数据只要求其所在
的区域全部初始化为零,所以只需要程序根据编译器给出的 ZI 基址及大小来将相应的 RAM
清零。但 RW 段数据却不这样做,所以编译器为了完成所有 RW 段数据赋值,其先将 RW 段
的所有初值,先保存到 Flash 中,程序执行时,再 Flash 中的数据搬运到 RAM 中,所以 RW
段即占用 Flash 又占用 RAM,且占用的空间大小是相等的。
内容参考自《周立功分散加载文件浅释》