一般 MCU 包含的儲存空間有:片內 Flash 與片內 RAM,RAM 相當於記憶體,Flash 相當於硬碟。編譯器會將一個程式分類為好幾個部分,分別儲存在 MCU 不同的儲存區。
Keil 工程在編譯完之後,會有相應的程式所佔用的空間提示資訊,如下所示:
linking...
Program Size: Code=48008 RO-data=5660 RW-data=604 ZI-data=2124
After Build - User command \#1: fromelf --bin.\\build\\rtthread-stm32.axf--output rtthread.bin
".\\build\\rtthread-stm32.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed: 00:00:07
上面提到的 Program Size 包含以下幾個部分:
1)Code:程式碼段,存放程式的程式碼部分;
2)RO-data:只讀資料段,存放程式中定義的常量;
3)RW-data:讀寫資料段,存放初始化為非 0 值的全域性變數;
4)ZI-data:0 資料段,存放未初始化的全域性變數及初始化為 0 的變數;
編譯完工程會生成一個.map
的檔案,該檔案說明了各個函式佔用的尺寸和地址,在檔案的最後幾行也說明了上面幾個欄位的關係:
Total RO Size (Code + RO Data) 53668 ( 52.41kB)
Total RW Size (RW Data + ZI Data) 2728 ( 2.66kB)
Total ROM Size (Code + RO Data + RW Data) 53780 ( 52.52kB)
1)RO Size 包含了 Code 及 RO-data,表示程式佔用 Flash 空間的大小;
2)RW Size 包含了 RW-data 及 ZI-data,表示執行時佔用的 RAM 的大小;
3)ROM Size 包含了 Code、RO-data 以及 RW-data,表示燒寫程式所佔用的 Flash 空間的大小;