在使用keil開發STM32應用程序時,點擊Build后在Build Output窗口中經常會有如下信息:
<ignore_js_op>
以前一直好奇這幾個參數和實際使用的STM32芯片中Flash和SRAM的對應關系,於是上網搜了一圈,做如下總結:
- 這些參數的單位是Byte
- 圖中幾個參數分別代表
- Code:代碼的大小
- RO:常量所占空間
- RW:程序中已經初始化的變量所占空間
- ZI:未初始化的static變量和全局變量以及堆棧所占的空間
- 上述參數和芯片Flash以及SRAM的對應關系是
- Flash占用大小=Code+RO+RW
- SRAM占用大小=RW+ZI
不知道有沒有人會像我一樣好奇為什么RW參數同時參與了Flash和SRAM占用量的計算。這是因為Flash部分的屬性是Read-Only的,而SRAM雖然是Read-Write但里面數據不能掉電保存,所以只能把已經初始化的值保存到ROM里,上電后再拷貝到SRAM中進行讀寫操作,即兩部分都需要留出RW變量所占用的空間。這里給出的解釋比較詳細,在此我參照着用STM32F407ZGT6圖解一下。
STM32F407ZGT6的Flash大小為1MB,SRAM大小為(128KB+64KB)。這里SRAM之所以分開表示是因為在芯片內部前面的128KB和后面的64KB地址不是連續的,后面的64KB在ST官方叫做CCM (core coupled memory) ,據說是由內核直接訪問的,不能由外設訪問(見原帖2樓)。下面給出的示意圖中只標出了前面的128KB的SRAM空間。紅色部分表示STM32F407ZGT6提供的Flash和SRAM大小。
<ignore_js_op>
結合上圖說下STM32F407ZGT6的啟動過程(采用Cortex-M4、Cortex-M3內核的芯片基本都是這個過程):上電后首先從 0x00000000(映射到0x08000000,這里只考慮從內部Flash啟動)處獲得中斷向量表,然后在運行用戶代碼之前會在標號2處有一段引導代碼負責把存在Flash中的初始化變量的值Copy到SRAM中對應的變量位置(標號3),之后把ZI區全部清零(標號4),之后才正式開始運行用戶代碼(標號5)。