Keil5中堆棧相關知識

網絡上搜集整理的資料,非原創!

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開始往下減。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章