在使用keil開(kāi)發(fā)STM32應(yīng)用程序時(shí),點(diǎn)擊Build后在Build Output窗口中經(jīng)常會(huì)有如下信息:
以前一直好奇這幾個(gè)參數(shù)和實(shí)際使用的STM32芯片中Flash和SRAM的對(duì)應(yīng)關(guān)系,于是上網(wǎng)搜了一圈,做如下總結(jié):
這些參數(shù)的單位是Byte
圖中幾個(gè)參數(shù)分別代表
Code:代碼的大小
RO:常量所占空間
RW:程序中已經(jīng)初始化的變量所占空間
ZI:未初始化的static和全局變量以及堆棧所占的空間
上述參數(shù)和芯片F(xiàn)lash以及SRAM的對(duì)應(yīng)關(guān)系是
Flash占用大小=Code+RO+RW
SRAM占用大小=RW+ZI
不知道有沒(méi)有人會(huì)像我一樣好奇為什么RW參數(shù)同時(shí)參與了Flash和SRAM占用量的計(jì)算。這是因?yàn)镕lash部分的屬性是Read-Only的,而SRAM雖然是Read-Write但里面數(shù)據(jù)不能掉電保存,所以只能把已經(jīng)初始化的值保存到ROM里,上電后再拷貝到SRAM中進(jìn)行讀寫操作,即兩部分都需要留出RW變量所占用的空間。這里給出的解釋比較詳細(xì),在此我參照著用STM32F407ZGT6圖解一下。
STM32F407ZGT6的Flash大小為1MB,SRAM大小為(128KB+64KB)。這里SRAM之所以分開(kāi)表示是因?yàn)樵谛酒瑑?nèi)部前面的128KB和后面的64KB地址不是連續(xù)的,后面的64KB在ST官方叫做CCM (core coupled memory) ,據(jù)說(shuō)是由內(nèi)核直接訪問(wèn)的,不能由外設(shè)訪問(wèn)(見(jiàn)原帖2樓)。下面給出的示意圖中只標(biāo)出了前面的128KB的SRAM空間。紅色部分表示STM32F407ZGT6提供的Flash和SRAM大小。
結(jié)合上圖說(shuō)下STM32F407ZGT6的啟動(dòng)過(guò)程(采用Cortex-M4、Cortex-M3內(nèi)核的芯片基本都是這個(gè)過(guò)程):上電后首先從0x00000000(映射到0x08000000,這里只考慮從內(nèi)部Flash啟動(dòng))處獲得中斷向量表,然后在運(yùn)行用戶代碼之前會(huì)在標(biāo)號(hào)2處有一段引導(dǎo)代碼負(fù)責(zé)把存在Flash中的初始化變量的值Copy到SRAM中對(duì)應(yīng)的變量位置(標(biāo)號(hào)3),之后把ZI區(qū)域全部清零(標(biāo)號(hào)4),之后才正式開(kāi)始運(yùn)行用戶代碼(標(biāo)號(hào)5)。
對(duì)于詳細(xì)的啟動(dòng)過(guò)程,這個(gè)帖子寫得比較詳細(xì),可以試試~
參考資料:
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
聯(lián)系客服