最近弄json,發現經常的堆溢位,然後找問題。因為對stm32堆疊問題沒有深刻認識,就花時間好好研究下了堆疊並且做了驗證
1.棧位址區間確定
首先找到啟動檔案,我的啟動檔案在startup_stm32f40xx.s,一般的啟動檔案也都在startup_stm32f***x.s檔案裡
__initial_sp 這個引數是棧頂位址,因為棧的增長是向下增長,所以這個引數我們可以理解為棧的起始位址,我設定的棧尺寸是0x400,所以棧的位址範圍是 __initial_sp ~ (__initial_sp - 0x400),__initial_sp 這個引數是keil編譯**之後計算出來的,有多種方法確定。
2.確定__initial_sp數值
(1)方法:1:編譯**,編譯完成之後,在**所在資料夾裡找到乙個.map的檔案,放入keil
(3)方法3:直接根據rw-data + zi-data
因為sram的基位址是0x20000000,所以上面的位址應該加上基址,也就跟上面吻合了
2.棧的功能
(1)函式中的區域性變數是儲存在棧裡的,確認方法如下
位址為 0x200007a8 在 0x200007b0 ~ 0x200003b0範圍裡,所以在棧裡。
3.堆相關
(1)網上有網友說,全域性變數、靜態變數是放在堆裡的,這個是錯誤的。堆的知識點,回頭有時間我再研究一下。
(2)函式名是存放在flash中的!
4.總結
(1)函式內部區域性變數是放在棧裡面的
(2)函式名是存放在flash中的
(3)如果執行freertos時,在任務裡呼叫函式時,此時這個函式中內部的變數是存放在freertos分配的記憶體中,而不是棧裡
(4)堆只有呼叫malloc時,分配的空間才在堆中
(5)實際使用過程中,函式區域性變數占空空間大於棧分配空間時,會自動占用堆空間,而不會導致程式掛掉
(6)棧的起始點是棧頂,從頂部向下增長
(7)堆是從底部向上增長,堆疊是連線在一起的
STM32的堆與棧
首先我們來認識一下堆與棧的含義 1 棧區 stack 由編譯器自動分配和釋放,存放函式的引數值 區域性變數的值等,其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配和釋放,若程式設計師不釋放,程式結束時可能由作業系統 分配方式類似於資料結構中的鍊錶。3 全域性區 靜態區 sta...
STM32學習堆和棧(三)
可程式設計內存在基本上分為這樣的幾大部分 靜態儲存區 堆區和棧區。他們的功能不同,對他們使用方式也就不同。靜態儲存區 內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。它主要存放靜態資料 全域性資料和常量。棧區 在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結...
STM32之USART的基本知識點
usart又稱為通用同步非同步收發器,是利用分數位元率發生器提供寬範圍的位元率選擇。stm32f10x系列的晶元都提供了功能比較強大的usart串列埠,基本上的串列埠功能都可以通過硬體來實現。usart具有以下比較典型的特徵 1.全雙工非同步通訊 2.單線半雙工通訊 3.傳送方為同步傳輸提供時鐘 4...