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