网络上搜集整理的资料,非原创!
Keil编译信息中的:Program Size:Code=XX RO-data=XX RW-data=XX ZI-data=XX
其中:
Code: 存储到flash[Rom]中的程序代码。(文本段)
RO-data:(Read Only)只读常量的大小,如const型。(数据段)
RW-data:(Read Write) 初始化了可读写变量的大小。即已初始化为非零的全局变量。 (数据段)
ZI-data:(Zero Initialize) 没有初始化或初始化为0的可读写的变量的大小(不会被算做代码里,因为不会被初始化)。 (BBS段)
ROM(Flash) size = Code+RO-data+RW-data;
RAM size = RW-data+ZI-data
如果一个变量被初始化为0,则该变量的处理方法与未初始化变量一样放在ZI区法域。即ARM C程序中,所有的示初始化变量都会被自动初始化为0。
总结:
1、C中的指令以及常量被编译后是RO类型数据
2、C中的未被始化或初始化为0的变量编译后是ZI类型数据。
3、C中已被初始化成非0的值的变量编译后是RW类型数据
4、以上变量指全局变量,局部变量是以上程序中在栈中分配。
ROM指:NAND Flash,Nor Flash
RAM指:PSRAM,SDRAM,DDRAM
Keil IDE的编译信息在工程文件夹的xx.map文件中,STM32的RAM分区从0x0200 0000开始,静态区、堆、栈。
所有的全局变量,包括静态变量之类的,全部存储在静态存储区。然后是堆区(如没用到malloc,则没有该区),之后是栈区,栈在程序中存储局部变量。
堆栈增长方向
堆在使用时会从低地址往上加,而栈是从__initial_sp开始往下减。