1. 程式人生 > >Keil編譯後的Code,RO,RW,ZI分別表示什麽以及和芯片Flash、SRAM的對應關系

Keil編譯後的Code,RO,RW,ZI分別表示什麽以及和芯片Flash、SRAM的對應關系

rtex-m3 位置 bsp 部分 mem sram www cor stm32f4

在使用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)。

Keil編譯後的Code,RO,RW,ZI分別表示什麽以及和芯片Flash、SRAM的對應關系