一般 MCU 包含的存盤空間有:片內 Flash 與片內 RAM,RAM 相當于記憶體,Flash 相當于硬碟,編譯器會將一個程式分為好幾個部分,分別存盤在 MCU 不同的存盤區,
ROM:即單片機的FLASH,只讀存盤器
RAM:隨機存盤器
Keil 工程在編譯完之后,會有相應的程式所占用的空間提示資訊,如下所示:

Program Size: Code=87556 RO-data=35944 RW-data=4036 ZI-data=61316
除以1024就是KB大小,如87556=85.50KB
上面提到的 Program Size 包含以下幾個部分:
- Code: 代碼段,存放程式的代碼部分;
- RO-data: 只讀資料段,存放程式中定義的常量;
- RW-data: 讀寫資料段,存放程式中定義并且初始化的全域變數和靜態變數;
- ZI-data: 0資料段,存放程式中定義了但沒有初始化的全域變數和靜態變數;
編譯完工程會在 _build 檔案夾里生成一個 .map 的檔案,該檔案說明了各個函式占用的尺寸和地址,在檔案的最后幾行也說明了上面幾個欄位的關系:
Total RO Size (Code + RO Data) 123500 ( 120.61kB)
Total RW Size (RW Data + ZI Data) 65352 ( 63.82kB)
Total ROM Size (Code + RO Data + RW Data) 123812 ( 120.91kB)
- RO Size 包含了 Code 及 RO-data,表示程式占用 Flash 空間的大小;
- RW Size 包含了 RW-data 及 ZI-data,表示運行時占用的 RAM 的大小;
- ROM Size 包含了 Code、RO Data 以及 RW Data,表示燒寫程式所占用的 Flash 空間的大小,
程式運行之前,需要有檔案物體被燒錄到 STM32 的 Flash 中,一般是 bin 或者 hex 檔案,該被燒錄檔案稱為可執行映像檔案,如下面左圖中所示,是可執行映像檔案燒錄到 STM32 后的記憶體分布,它包含 RO 段和 RW 段兩個部分:其中 RO 段中保存了 Code、RO-data 的資料,RW 段保存了 RW-data 的資料,由于 ZI-data 都是 0,所以未包含在映像檔案中,
STM32 在上電啟動之后默認從 Flash 啟動,啟動之后會將 RW 段中的 RW-data(初始化的全域變數)搬運到 RAM 中,但不會搬運 RO 段,即 CPU 的執行代碼從 Flash 中讀取,另外根據編譯器給出的 ZI 地址和大小分配出 ZI 段,并將這塊 RAM 區域清零,如下圖所示;其余RAM空間作為動態記憶體堆使用,

? 由 Leung 寫于 2021 年 4 月 8 日
? 參考:KEIL MDK編譯后的代碼量和RAM使用詳解
KEIL MDK 查看代碼量、RAM的使用情況
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/274121.html
標籤:其他
下一篇:QT顯示呼叫C++編譯的dll
