STM32學習堆和棧(三)

2021-07-09 14:52:29 字數 1279 閱讀 6177

可程式設計內存在基本上分為這樣的幾大部分:靜態儲存區、堆區和棧區。他們的功能不同,對他們使用方式也就不同。

靜態儲存區:內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。它主要存放靜態資料、全域性資料和常量。

棧區:在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。

堆區:亦稱動態記憶體分配。程式在執行的時候用malloc或new申請任意大小的記憶體,程式設計師自己負責在適當的時候用free或delete釋放記憶體。動態記憶體的生存期可以由我們決定,如果我們不釋放記憶體,程式將在最後才釋放掉動態記憶體。 但是,良好的程式設計習慣是:如果某動態記憶體不再使用,需要將其釋放掉,否則,我們認為發生了記憶體洩漏現象。

按照這個說法,我在.s檔案裡面設定了:

heap_size equ 0x00000000

也就是,沒有任何動態記憶體分配。

這樣,記憶體=靜態儲存區+棧區了。

不存在堆!!!

因為我沒有用malloc來動態分配記憶體。

因此,前面提到的一切堆區,其實就是靜態儲存區。

另外,經過測試,確實是這樣。

stm32的記憶體分配,應該分為兩種情況。

1,使用了系統的malloc。

2,未使用系統的malloc。

第一種情況(使用malloc):

stm32的記憶體分配規律:

從0x20000000開始依次為:靜態儲存區+堆區+棧區

第二種情況(不使用malloc):

stm32的記憶體分配規律:

從0x20000000開始依次為:靜態儲存區+棧區

第二種情況不存在堆區。

所以,一般對於我們開發板例程,實際上,沒有所謂堆區的概念,而僅僅是:靜態儲存區+棧區。

無論哪種情況,所有的全域性變數,包括靜態變數之類的,全部儲存在靜態儲存區。

緊跟靜態儲存區之後的,是堆區(如沒用到malloc,則沒有該區),之後是棧區。

上圖是stm32的記憶體對映圖,其中**區是從0x0800 0000開始的,他的結束位址是0x0800 0000加上實際晶元的flash大小,他的ram的起始位址是0x2000 0000,然後結束位址依然是加上晶元實際的ram大小。

STM32的堆與棧

首先我們來認識一下堆與棧的含義 1 棧區 stack 由編譯器自動分配和釋放,存放函式的引數值 區域性變數的值等,其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配和釋放,若程式設計師不釋放,程式結束時可能由作業系統 分配方式類似於資料結構中的鍊錶。3 全域性區 靜態區 sta...

Stm32學習(三)Systick的學習

1.systick定時器 systick定時器,是乙個簡單的定時器,對於cm3,cm4核心晶元,都有systick定時器。systick定時器常用來做延時,或者實時系統的心跳時鐘。這樣可以節省mcu資源,不用浪費乙個定時器。比如ucos中,分時復用,需要乙個最小的時間戳,一般在stm32 ucos系...

關於STM32堆疊方面知識點

最近弄json,發現經常的堆溢位,然後找問題。因為對stm32堆疊問題沒有深刻認識,就花時間好好研究下了堆疊並且做了驗證 1.棧位址區間確定 首先找到啟動檔案,我的啟動檔案在startup stm32f40xx.s,一般的啟動檔案也都在startup stm32f x.s檔案裡 initial sp...