STM32學習筆記之堆疊空間

2021-07-22 23:00:52 字數 1367 閱讀 3387

1.堆和棧大小

定義大小在startup_stm32f2xx.s

stack_size      equ     0x00000400

area    stack, noinit, readwrite, align=3

stack_mem       space   stack_size

__initial_sp

; heap configuration

;   heap size (in bytes) <0x0-0xffffffff:8>;

heap_size       equ     0x00000200

area    heap, noinit, readwrite, align=3

__heap_base

2.堆和棧位置

通過map檔案可知(在目標工程欄-->>雙擊工程名,就會在keil檔案顯示框出現map檔案)

heap                                     0x200106f8   section      512  startup_stm32f2xx.o(heap)

stack                                    0x200108f8   section     1024  startup_stm32f2xx.o(stack)

__heap_base                              0x200106f8   data           0  startup_stm32f2xx.o(heap)

__heap_limit                             0x200108f8   data           0  startup_stm32f2xx.o(heap)

__initial_sp                             0x20010cf8   data           0  startup_stm32f2xx.o(stack)

顯然 cortex-m3資料可知:__initial_sp是堆疊指標,它就是flash的0x8000000位址前面4個位元組(它根據堆疊大小,由編譯器自動生成)

顯然堆和棧是相鄰的。

3.堆和棧空間分配

顯然如果依次定義變數

先定義的棧變數的記憶體位址比後定義的棧變數的記憶體位址要大

先定義的堆變數的記憶體位址比後定義的堆變數的記憶體位址要小 

4.堆和棧變數

棧:臨時變數,退出該作用域就會自動釋放

堆:malloc變數,通過free函式釋放

另外:堆疊溢位,編譯不會提示,需要注意

STM32學習筆記之 attribute

stm32也會遇到這樣的絕對定位的問題如下 uint8 t uart rx buf 1024 attribute at 0x20001000 就是將串列埠接收的資料定位到ram中起始位址為0x20001000 絕對定位要麼定位到flash 要麼定位到ram,這裡我們將定位在flash進行說明。mdk...

STM32學習筆記

剛到公司實習,要學習stm32開發,boss給了一塊戰艦開發板,讓我自己寫乙個功能要用在公司的產品上。難啊。以前根本沒接觸過stm32,只能一步一步慢慢來,利用晚上利用週末惡補一下。哎,算是為了大學前兩年還債吧。一 跑馬燈實驗 gpio輸出 實驗環境 keil4 實驗平台 戰艦stm32開發板 gp...

stm32學習筆記

開漏模式輸出 輸出暫存器上的 0 啟用 n mos,而輸出暫存器上的 1 將埠 置於高阻狀態 p mos從 被啟用 推挽模式輸出 輸出暫存器上的 0 啟用 n mos,而輸出暫存器上的 1 將啟用 p mos。上拉輸入 輸入高電平,然後接乙個 上拉電阻 保護作用 讀取此時的引腳電平為高電平 下拉輸入...