stm32啟動原理

2021-10-21 08:25:52 字數 1415 閱讀 5743

非常建議仔細閱讀啟動過程詳解

結論:stm32系統啟動的初始化過程是由彙編開始分配資源,設定函式基礎後開始執行的,在所有匯程式設計序執行後,系統的執行交由專案中的main()函式,並由此開始以c為首的執行過程。這個過程中,很重要的一點是進行了系統執行前的記憶體分配,將硬體記憶體系統(初始時都是靜態區)分割為堆區,棧區,靜態區,其中,堆疊區原本就是從靜態區中分割出來的,在彙編過程中從記憶體區中分割適合大小的位置給堆疊。對於ucos來說,剩餘沒有被分割的記憶體區域(靜態區)就是可以用來做為ucos系統執行的記憶體堆疊基礎。

對於ucos系統,任務切換過程中是將當前任務所使用暫存器裡的數值儲存到記憶體堆疊中,然後切換到另乙個任務中,當切換回當前任務時,從堆疊中取回相應的暫存器數值,從上次執行的地方繼續執行。可以認為ucos系統的核心即對記憶體堆疊的處理。這一部分的理解參考**stm32堆疊與ucos堆疊,其實是兩碼事!,在作者的實驗中,表明了stm32裝置sram對於初始化過程記憶體的分配原理。總結來說,stm32裝置(暫定為stm32c8t6,該裝置有64k的sram,範圍是0x2000 000->0x2000ffff),sram的使用是按照低位址到高位址的方式進行分配,需要注意的是,記憶體分配結束後,沒有用到的部分就不會再進行分配了,所有資源的分配在**編譯結束時就結束了,不存在執行時去分配sram中未使用到的記憶體的情況,在了解這點後再來分析下其分配方式,首先stm32編譯過程產生的靜態/全域性/常量指標從0x2000 0000開始遞增占用記憶體,然後是堆,最後是棧。棧是以高位址向低位址方向增長的結構,也就是有乙個棧頂__initial_sp,棧以該值開始遞減,直到抵達堆疊的分界範圍,再增加就是堆的範圍了,如果執行過程中突破了該範圍即稱堆疊溢位,此外該欄位表明了程式編譯結束後使用的最大記憶體量,程式開始執行後,所有的記憶體位址都不會超過該值,在多數情況下,該值不會指向0x2000 ffff,除非你的裝置編譯的確使用了如此大的記憶體,由此可以知道記憶體分配不會剛好是64k,而是以**編譯的最終結果定下系統最終執行占用的記憶體大小。sram的結構圖可以參照如下

也可增加乙個靜態陣列自己動手測試

在.map檔案中檢視當前棧頂的位址為:0x2000a888

增加乙個靜態資料後,棧頂位址變為:0x2000b888

簡單計算0x2000b888-0x2000a888=4000(hex)=4k,剛好為大小1024的int(4位元組)型別陣列的大小。

參考arm彙編程式設計基礎(一) – arm cpu暫存器

arm中的暫存器(r0-r15)

同時,對於不同任務分配的記憶體空間的利用率,有網友以使用量分析的方式實現記憶體利用率的最大化,參考ucos-iii任務堆疊溢位檢測及統計任務堆疊使用量的方法

STM32 啟動檔案

先來看看啟動 中的偽操作和偽指令 equ 用於定義常量,相當於c中的巨集定義 如stack size equ 0x00000400 define stack size 0x00000400 align 位元組對齊方式 align 3 export 相當於宣告了乙個全域性變數 export vecto...

stm32啟動檔案

這是st提供的3個啟動檔案,分別適用於不同容量的stm32晶元。這三個檔案為 startup stm32f10x ld.s startup stm32f10x md.s startup stm32f10x hd.s 其中,ld.s適用於小容量 產品 md.s適用於中等容量產品 hd適用於大容量產品 ...

STM32啟動模式

stm32三種啟動模式對應的儲存介質均是晶元內建的,它們是 1 使用者快閃儲存器 晶元內建的flash。2 sram 晶元內建的ram區,就是記憶體啦。3 系統儲存器 晶元內部一塊特定的區域,晶元出廠時在這個區域預置了一段bootloader,就是通常說的isp程式。這個區域的內容在晶元出廠後沒有人...