可程式設計內存在基本上分為這樣的幾大部分:靜態儲存區、堆區和棧區。他們的功能不同,對他們使用方式也就不同。
靜態儲存區:內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。它主要存放靜態資料、全域性資料和常量。
棧區:在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。
堆區:亦稱動態記憶體分配。程式在執行的時候用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...