參考閱讀: 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
二、具體含義:
- Code 是代碼占用的空間。【對(duì)應(yīng)MCU的Flash區(qū)】
- RO-data 是(Read Only)只讀常量的大小,如const修飾類(lèi)型?!緦?duì)應(yīng)MCU的Flash區(qū)】
- RW-data 是(Read Write) 可讀可寫(xiě)變量,就是初始化時(shí)候就已經(jīng)賦值了的變量。【對(duì)應(yīng)MCU的SRAM區(qū)】
- 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ū)】
三、解讀
- RW + ZI就是你的程序總共使用的RAM字節(jié)數(shù)。
- 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)行不含變量的代碼。