Keil 編譯內(nèi)存信息:Program size: Code, RO-data, RW-data, ZI-data

參考閱讀: MCU存儲(chǔ)區(qū)分

一、Keil編譯的Program Size

用keil編譯程序后會(huì)打印對(duì)應(yīng)的內(nèi)存分配信息,例如 Program Size: Code=12612 RO-data=1456 RW-data=152 ZI-data=48176

...省略...
linking...
Program Size: Code=12612 RO-data=1456 RW-data=152 ZI-data=48176  
FromELF: creating hex file...
".\Objects\ToyCar.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed:  00:00:12

二、具體含義:

  1. Code 是代碼占用的空間。【對(duì)應(yīng)MCU的Flash區(qū)】
  2. RO-data 是(Read Only)只讀常量的大小,如const修飾類(lèi)型?!緦?duì)應(yīng)MCU的Flash區(qū)】
  3. RW-data 是(Read Write) 可讀可寫(xiě)變量,就是初始化時(shí)候就已經(jīng)賦值了的變量。【對(duì)應(yīng)MCU的SRAM區(qū)】
  4. ZI-data 是(Zero Initialize) 沒(méi)有初始化的可讀寫(xiě)變量的大小,就是程序中用到的變量并且被系統(tǒng)初始化為0的變量的字節(jié)數(shù),keil編譯器默認(rèn)是把你沒(méi)有初始化的變量都賦值一個(gè)0,這些變量在程序運(yùn)行時(shí)是保存在RAM中的?!緦?duì)應(yīng)MCU的SRAM區(qū)】

三、解讀

  1. RW + ZI就是你的程序總共使用的RAM字節(jié)數(shù)。
  2. Total ROM Size (Code + RO Data + RW Data)這是所寫(xiě)的程序占用的ROM的字節(jié)總數(shù),也就是說(shuō)程序下載到 ROM flash 中的大小。為什么Rom中還要存RW,因?yàn)榈綦姾驲AM中所有數(shù)據(jù)都丟失了,每次上電RAM中的數(shù)據(jù)是被重新賦值的,每次這些固定的值就是存儲(chǔ)在Rom中的,為什么不包含ZI段呢,是因?yàn)閆I數(shù)據(jù)都是0,沒(méi)必要包含,只要程序運(yùn)行之前將ZI數(shù)據(jù)所在的區(qū)域一律清零即可。包含進(jìn)去反而浪費(fèi)存儲(chǔ)空間。

MCU執(zhí)行過(guò)程是先將RW從ROM中搬到RAM中,因?yàn)镽W是變量,變量不能存在ROM中。然后將ZI所在的RAM區(qū)域全部清零,因?yàn)閆I區(qū)域并不在Image中,所以需要程序根據(jù)編譯器給出的ZI地址及大小來(lái)將相應(yīng)得RAM區(qū)域清零。ZI中也是變量,同理:變量不能存在ROM中。ROM中的指令完成了這兩項(xiàng)工作后C程序才能正常訪(fǎng)問(wèn)變量。否則只能運(yùn)行不含變量的代碼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容