Keil 編譯器編譯生成Program Size: Code=XX RO-data=XX RW-data=XX ZI-data=XX 含義
在使用Keil編譯器編譯時,最後都會打印出資訊:Program Size: Code=XX RO-data=XX RW-data=XX ZI-data=XX,我這裡實際列印資訊如下:
Program Size: Code=5688 RO-data=424 RW-data=48 ZI-data=1832
今天來詳細講解一下這段資訊的含義。
一段程式碼包括程式碼段、只讀常量資料、可讀可寫變數等。上述資訊就代表了編譯完後,程式碼、只讀常量、可讀寫變數(初始化的變數)和未初始化的變數所佔空間的大小。在工程中的.map檔案最後會看到如下資訊:
Code (inc. data) RO Data RW Data ZI Data Debug 5688 300 424 48 1832 524169 Grand Totals 5688 300 424 48 1832 524169 ELF Image Totals 5688 300 424 48 0 0 ROM Totals ============================================================================== Total RO Size (Code + RO Data) 6112 ( 5.97kB) Total RW Size (RW Data + ZI Data) 1880 ( 1.84kB) Total ROM Size (Code + RO Data + RW Data) 6160 ( 6.02kB) ==============================================================================
(1)Code (inc. data): 包含程式碼和資料兩部分。(參考官方文件:Shows how many bytes are occupied by code. In this image, there are 3712 bytes of code.This includes 1580 bytes of inline data (inc. data), for example, literal pools, and short strings.)儲存在FLASH中。
-Code:即程式碼部分;
-inline data:比如literal pools(文字池) 和short strings(短字串)。此部分一般忽略。
(2)RO-data: 表示程式中的只讀常量資料。比如const型別的資料 (除inline data之外的只讀資料)。儲存在FLASH中。
(3)RW-data: 表示可讀寫變數的資料大小,即程式中已經初始化的變數大小。 儲存在FLASH中。初始化時RW-data從flash拷貝到SRAM。
(4)ZI-data: 表示程式中已定義但未初始化或者初始化值為0的變數大小。(編譯器會預設把沒有賦值的變數自動賦值為0)。儲存在SRAM中。ZI-data不會被算做程式碼裡因為不會被初始化。
從上表最後一欄看一看到:
RO Size =Code + RO Data //只讀資料大小 = 程式碼大小 + 只讀資料大小
RW Size = RW Data + ZI Data //讀寫資料大小 = 可讀寫資料(已初始化)大小 + 未初始化變數大小
ROM Size = Code + RO Data + RW Data //整個程式碼所佔ROM空間(佔用FLASH空間)大小
即,燒寫到FLASH的被佔用的空間為:ROM Size = Code + RO Data + RW Data
程式執行時晶片RAM佔用空間為:RW Size = RW Data + ZI Data
之所以將RW Data存在ROM(FLASH)中,是因為晶片掉電後,RAM中資料丟失,再次開機後需要對已經初始化的變數重新初始化,所以,已經初始化的變數(RW Data)需要放在ROM(FLASH)中儲存,以確保重新上電時能夠進行初始化。而 ZI Data本身就沒有初始化,或者初始化為0,重新上電時,晶片會將ZI Data區域清零,所以沒有必要將ZI Data放在ROM(FLASH)中,那樣會浪費記憶體空間。
參考:https://blog.csdn.net/yuleicqut/article/details/50933441
https://blog.csdn.net/qq_15232177/article/details/53067438
因水平有限,如文中存在錯誤,請大家在評論區批評指標。歡迎大家在評論區討論。
轉載請註明出處。