st微控制器的堆疊 記憶體分布

2021-10-10 04:20:54 字數 968 閱讀 7021

記憶體分布在微控制器程式設計中至關重要,尤其是rtos的多執行緒環境,堆疊溢位時則會出現程式出錯、卡死、跑飛等現象。

堆:動態記憶體管理所用的記憶體,都是屬於"堆"

棧:一般來說棧空間會設定成乙個固定大小的空間,比如在stm32彙編引導檔案內有一項stack_size 後面的數值就是設定的棧空間的大小,棧空間在執行時儲存區域性變數、函式跳轉時現場資料等,如果某乙個函式內定義了乙個很大的區域性陣列或者遞迴函式深度過深都會造成棧空間不足,因此可能會覆蓋掉一部分「堆」中的資料,造成程式出錯卡死等問題。

堆疊在stm32記憶體中的分布(工程使用keil編譯)

採用.s檔案中的預設設定,棧0x400、堆0x200。

檢視編譯的map檔案,ram佔0x1a68byte,棧頂指標指向0x200000x1668

對應**

如圖可看出

堆的空間在0x2000 1468到0x2000 1668。

棧的空間在0x2000 1668到0x2000 1a68。

經實驗:

沒有動態記憶體管理的微控制器程式,定義堆空間大小為0x10程式也能正常執行。

包含stdlib.**件後,使用malloc();函式動態申請記憶體所獲取的就是這裡分配的堆位址。所以如果不用動態記憶體管理,可將堆空間減小甚至改為0.

堆空間修改:基本用不到,可以設定小一點。

棧空間修改:iar 和 keil都在彙編引導檔案內修改

51微控制器 堆疊

堆疊的作用是用在呼叫子程式或中斷程式時保護現場,因為51微控制器的暫存器是十分有限的,而相對來說普通資料儲存器更充足,通過入棧將暫存器中的內容臨時儲存到堆疊中 普通資料儲存器 這是乙個用時間換取空間的程式設計方式。51微控制器的堆疊是向上生長的,就是堆疊不為空時,棧底位址小於棧頂位址,當將資料入棧時...

51微控制器中的堆疊

在51微控制器中,堆疊 push 分為入棧和出棧 pop 遵循 先進後出,後進先出 的原則。堆疊可以看似乙個臨時儲存資料的暫存器。特點是儲存的資料不變,一般用來儲存中斷開始位址,和使用者所需要自己設定的資料。在使用時要現在片內ram中初始化,即給sp 堆疊指標乙個空間位址 然後按照先進後出恩,後進先...

微控制器位址空間,堆疊理解

data 可定址片內ram 0x00 0x7f bdata 可位定址片內ram idata 可定址片內ram,允許訪問全部內部ram 0x00 0xff padata 分頁定址訪問片外ram xdata 可定址片外ram 0x0000 0xffff code 程式儲存區微控制器儲存器分rom跟ram...