大家好!這篇是分享stm32單片機(jī)基礎(chǔ)知識的第6篇。主要記錄基于keil+stm32 生成的map文件的簡單介紹。這篇文章參考了大量網(wǎng)上的資料,結(jié)合我個人的理解,對這塊知識進(jìn)行了一個梳理。介紹的不是特別具體,難免也存在紕漏之處。如有不妥之處,還請后臺留言,進(jìn)行指正。
以下是今天分享內(nèi)容的概要
一、什么是map文件
二、map文件的內(nèi)容介紹
三、map文件的用處
四、如何生成map文件
五、如何在keil5打開map文件
一、什么是map文件
map文件是通過編譯器編譯之后,集程序、數(shù)據(jù)及IO空間的一種映射文件。
二、map文件的內(nèi)容介紹
map文件內(nèi)容分類
從上面輸出配置可以看得出來map文件大概包含了哪些信息。map文件將其分為如下五大類:
1、節(jié)區(qū)的跨文件引用(Section Cross References)
這部分主要是不同文件中函數(shù)的調(diào)用關(guān)系。
舉下圖的第一句要表達(dá)的意思是,stm32f4xx_adc.c 中的函數(shù)ADC_DeInit 調(diào)用了stm32f4xx_rcc.c中的函數(shù)RCC_APB2PeriphResetCmd;
2、刪除無用節(jié)區(qū)(Removing Unused input ps from the image)
這部分列出了在鏈接過程它發(fā)現(xiàn)工程中未被引用的節(jié)區(qū),這些未被引用的節(jié)區(qū)將會被刪除(指不加入到*.axf 文件,不是指在*.o 文件刪除),這樣可以防止這些無用數(shù)據(jù)占用程序空間。
3、映射符號表(Image Symbol Table (Local Symbols Global Symbols)
Image Symbol Table:映射符號表,這個表列出了被引用的各個符號在存儲器中的具體地址、占據(jù)的空間大小等信息。
Symbols分為兩大類
1.Local Symbols局部
2.Global Symbols全局
內(nèi)容要點(diǎn)
1.Symbol Name:符號名稱
2.Value:存儲對應(yīng)的地址;
大家會發(fā)現(xiàn)有0x0800xxxx、0x2000xxxx這樣的地址。
0x0800xxxx指存儲在FLASH里面的代碼、變量等。
0x2000xxxx指存儲在內(nèi)存RAM中的變量Data等。
3.Ov Type:符號對應(yīng)的類型
符號類型大概有幾種:Number、Section、Thumb Code、Data等;
細(xì)心的朋友會發(fā)現(xiàn):全局、靜態(tài)變量等位于0x2000xxxx的內(nèi)存RAM中。
4.Size:存儲大小
這個容易理解,我們懷疑內(nèi)存溢出,可以查看代碼存儲大小來分析。
5.Object(Section):段目標(biāo)
這里一般指所在模塊(所在源文件)。
如下圖所示:
4、存儲器映像索引(Memory Map of the image)
映像文件可以分為加載域(Load Region)和運(yùn)行域(Execution Region) 。
加載域就是程序在 Flash 中的實(shí)際存儲,而運(yùn)行域是芯片上電后的運(yùn)行狀態(tài)。下圖中標(biāo)①為加載域,標(biāo)②為運(yùn)行域。
5、映像組件大小(Image component sizes)
這部分包含了各個使用到的*.o 文件的空間匯總信息、整個工程的空間匯總信息以及占用不同類型存儲器的空間匯總信息,它們分類描述了具體占據(jù)的 Code、 RO-data、 RW-data及 ZI-data 的大小,并根據(jù)這些大小統(tǒng)計出占據(jù)的 ROM 總空間。
Code:指代碼的大?。籖o-data:指除了內(nèi)聯(lián)數(shù)據(jù)(inline data)之外的常量數(shù)據(jù);RW-data:指可讀寫(RW)、已初始化的變量數(shù)據(jù);ZI-data:指未初始化(ZI)的變量數(shù)據(jù);
提醒:A.Code、Ro-data:位于FLASH中;B.RW-data、ZI-data:位于RAM中;C.RW-data已初始化的數(shù)據(jù)會存儲在Flash中,上電會從FLASH搬移至RAM。
關(guān)系如下:RO Size = Code + RO DataRW Size = RW Data + ZI DataROM Size = Code + RO Data + RW Data
三、map文件的用處
在遇到內(nèi)存越界,或溢出的情況,可以分析map文件,來查找問題。通過map文件可以知道函數(shù)大小,入口地址等一些重要信息。
四、如何生成map文件
上面的紅色方框中可以對各個輸出項(xiàng)打勾,打勾的即可輸出相應(yīng)的內(nèi)容。其要表達(dá)的含義如下所示:
Memory Map:內(nèi)存映射Callgraph:圖像映射Symbols:符號Cross Reference:交叉引用Size Info:大小信息Totals Info:統(tǒng)計信息Unused Section Info:未調(diào)用模塊信息Veneers Info:裝飾信息
五、如何在keil5打開map文件
可以右擊“Target”,在彈出菜單中點(diǎn)擊 Open Map File。也可以直接雙擊Target。
隨后就會打開Map文件,如下圖所示: