Keil中的Code,RO,RW,ZI分别表示什么?
在使用keil開發(fā)STM32應用程序時,點擊Build后在Build Output窗口中經常會有如下信息:
以前一直好奇這幾個參數和實際使用的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地址不是連續(xù)的,后面的64KB在ST官方叫做CCM (core coupled memory) ,據說是由內核直接訪問的,不能由外設訪問(見原帖2樓)。下面給出的示意圖中只標出了前面的128KB的SRAM空間。紅色部分表示STM32F407ZGT6提供的Flash和SRAM大小。
結合上圖說下STM32F407ZGT6的啟動過程(采用Cortex-M4、Cortex-M3內核的芯片基本都是這個過程):上電后首先從0x00000000(映射到0x08000000,這里只考慮從內部Flash啟動)處獲得中斷向量表,然后在運行用戶代碼之前會在標號2處有一段引導代碼負責把存在Flash中的初始化變量的值Copy到SRAM中對應的變量位置(標號3),之后把ZI區(qū)域全部清零(標號4),之后才正式開始運行用戶代碼(標號5)。
對于詳細的啟動過程,這個帖子寫得比較詳細,可以試試~
參考資料:?
http://stackoverflow.com/questions/5430284/rom-and-ram-in-arm?
http://blog.csdn.net/he_ning/article/details/35226125?
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/4027.html?
http://anlx27.iteye.com/blog/1575848
總結
以上是生活随笔為你收集整理的Keil中的Code,RO,RW,ZI分别表示什么?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手把手教你架构3D引擎高级篇系列八
- 下一篇: java web 在线购书商城系统