Keil/MDK 小知識點:Program size: Code, RO-data , RW-data, ZI-data 解釋(什麼意思)
轉載自:http://blog.csdn.net/yuleicqut/article/details/50933441
MCU 的儲存分配問題
如,我用Keil/MDK 編譯完工程,得到:
Program Size: Code=25648 RO-data=400 RW-data=800 ZI-data=8752
生成.map 檔案copy過來的一段:
(生成的map檔案位於list資料夾下 (KEIL))
==============================================================================
Code (inc. data) RO Data RW Data ZI Data Debug
25648 2554 400 800 8752 441136 Grand Totals
25648 2554 400 324 8752 441136 ELF Image Totals (compressed)
25648 2554 400 324 0 0 ROM Totals
==============================================================================
Total RO Size (Code + RO Data) 26048 ( 25.44kB)
Total RW Size (RW Data + ZI Data) 9552 ( 9.33kB)
Total ROM Size (Code + RO Data + RW Data) 26372 ( 25.75kB)
==============================================================================
網上有很多種解釋,但是感覺都不夠權威,最後我在Keil的幫助文件找到官方的解釋:
如下面截圖所示,
(1) Code(inc.Data) : 包含兩部分,即程式碼和資料
- code,即程式程式碼部分
- inline data. For example, literal pools(文字常量池), and short strings(短字串)等. 這個一般被忽略,請大家注意!!!
(2) RO Data: read-only data,只讀的資料
Shows how many bytes are occupied by read-onlyCode (inc. data)
column. 除inline data 之外的所有隻讀資料。
(3) RW Data: read write data,可讀寫的資料
Shows how many bytes are occupied by read-write data.
(4) ZI Data: zero initialized data,零初始化的可讀寫變數 Shows how many bytes are occupied by zero-initialized data.
keil編譯器預設是把你沒有初始化的變數都賦值一個0。初始化為零,或者未初始化的變數,都儲存於這個區域。
儲存Size:
RO size: Code + RO_data
RW size: RW_data + ZI_data
ROM (minimum)size = Code + RO_data + RW_data (即燒/下載程式到FLASH/ROM時,所佔用的最小空間)
Total ROM Size (Code + RO Data + RW Data)這樣所寫的程式佔用的ROM的位元組總數,也就是說程式所下載到ROM flash 中的大小。為什麼Rom中還要存RW,因為掉電後RAM中所有資料都丟失了,每次上電RAM中的資料是被重新賦值的,每次這些固定的值就是儲存在Rom中的,為什麼不包含ZI段呢,是因為ZI資料都是0,沒必要包含,只要程式執行之前將ZI資料所在的區域一律清零即可。包含進去反而浪費儲存空間。
RAM size: RW Data + ZI Data (即程式執行的時,RAM使用的空間)
一個ARM程式包含3部分:RO段,RW段和ZI段
RO是程式中的指令和常量
RW是程式中的已初始化變數
ZI是程式中的零初始化的變數
由以上3點說明可以理解為:
RO就是readonly,
RW就是read/write,
ZI就是zero