網絡上搜集整理的資料,非原創!
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開始往下減。