STM32 中Code、RO-data、RW-data、ZI-data的含义

    使用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,且占用的空间大小是相等的。

 

内容参考自《周立功分散加载文件浅释》

你可能感兴趣的:(STM32 中Code、RO-data、RW-data、ZI-data的含义)