STM32F1系列 map檔案分析

2021-09-09 05:46:52 字數 2317 閱讀 7565

我們通過學習stm32f1知道,想要優化**就必須知道工程的rom和ram的占用情況。所以,我們就要用到.map檔案,通過分析.map檔案,可以方便檢視工程rom和ram的占用情況,包括單個原始檔甚至每個函式的rom。

問:那.map到底可以分為幾個部分呢?

段(section):描述映像檔案的**和資料塊。

ro:read-only的縮寫,包括ro-data(唯讀資料)和ro-code(**)。

rw:read-write的縮寫,主要是rw-data,rw-data由程式初始化初始值。

zi:zero-initialized的縮寫,主要是zi-data,由程式設計器初始化為0。

.text:與ro-code同義

.constdata:與ro-data同義

.bss:與zi-data同義,通常是指存放未初始化的全域性變數的區域

.data:與rw-data同義

這部分**反映出了各個函式的呼叫關係,比如箭頭就表明了main檔案**段裡就呼叫了led檔案**段裡的led_init函式。

mdk裡面有乙個配置選項,假設沒勾選可以看出編譯器優化了3個冗餘函式,大概50個位元組。接著我們把選項開啟,再全編譯一下看看結果。

這時候就很明顯可以看出編譯器優化了很多沒用到的**了,節省了起碼3258個位元組的空間。所以個人建議以後大家建立工程的時候還是把選項選上吧。

問:什麼是區域性標籤?什麼是全域性標籤?

答:區域性標籤就是在函式內部用static宣告的變數,還有用static宣告的函式,基本上都是屬於區域性標籤;全域性標籤就是不是用static宣告的這種靜態的變數和函式,是auto宣告的全域性變數和c檔案函式就屬於全域性標籤。還有就是彙編檔案裡面的變數如果作用域是本檔案的就是區域性標籤,作用域是全工程的就是全域性標籤。

其實我覺得我們不用很會區分這些,反正就這兩個標號,不在區域性裡就肯定在全域性裡,懂得在.map裡面找就行了。

這個i.這個字首就表示是在某個檔案裡面的某個函式,例如這裡的stm32f10x_it檔案裡面的busfault_handler函式;這個setsysclock要注意一下,為什麼前面用i.字首修飾過的函式,後面又出現一次呢?原來是因為這個函式是用static修飾的乙個區域性標籤函式,用了8個位元組的ram大小,型別屬於m3的thumb指令**。

這裡主要有幾個點,首先就是映像的入口位址0x8000131,然後可以知道載入域的起始位址,大小,最後知道執行域rom和ram的起始位址和大小。

還有要注意的是,在執行映像之前,必須將已初始化的rw資料從rom中複製到ram中的執行位址並建立zi section(初始化為0的變數區)。

問:為什麼要這麼做呢?誰來完成這一步驟呢?

答:因為我們的**是存在flash裡面的,一上電**並不會在rom裡面執行,我們得先把rom裡面的**複製到ram裡面才能執行起來。這一步驟應該是由__main這個函式封裝起來執行的。

總體來說,我們編譯出來的**,code、ro-data和rw-data這幾部分都是存在flash裡面的,然後通過啟動檔案把rw資料複製到ram中執行。

以上就是我對.map檔案的簡單分析,可能有些地方講的不好,請各位大佬指出。謝謝!

STM32F1系列選型參考

意法半導體的stm32f1系列主流mcu滿足了工業 醫療和消費類市場的各種應用需求。憑藉該產品系列,意法半導體在全球arm cortex m核心微控制器領域處於領先地位,同時樹立了嵌入式應用歷史上的里程碑。該系列在整合一流的外設和低功耗 低電壓執行等基礎上實現了高效能,同時還以可接受的 實現了高整合...

STM32F4與STM32F1的區別

作為cortex m3市場的最大佔有者,st公司在2011年又推出基於cortex m4核心的stm32f4系列產品,相對與stm32f1 f2等cortex m3產品,stm32f4最大的優勢,就是新增了硬體fpu單元以及dsp指令,同時,stm32f4的主頻也提高了很多,達到168mhz 可獲得...

STM32F1外部中斷例項

使用外部中斷的基本步驟如下 1.設定好相應的時鐘 2.設定相應的中斷 3.io口初始化 4.把相應的io口設定為中斷線路 要在設定外部中斷之前 並初始化 5.在選擇的中斷通道的響應函式中中斷函式。1 開啟時鐘 void rcc config void 設定相應的時鐘所需要的rcc函式在stm32f1...