STM32分配堆疊空間不足問題原因及解決方法

2021-08-10 07:54:30 字數 1378 閱讀 8703

先說結論,以stm32f103rct6為例,初始的棧空間是1kb,堆空間是512byte。如果動態記憶體分配需求過多時,需要手動調節堆空間。在啟動檔案startup_stm32f103xe.s的開頭就可以設定堆疊空間大小。同樣,在stm32cubemx中也可對堆疊大小進行修改,在project -> settings選項中可以對minimum heap size大小進行更改。擴大之後即可解決堆疊空間不足的問題。

今天在stm32f103rct6上,使用malloc()為鍊錶分配記憶體空間時,忽然遇到一次分配記憶體過多而宕機的問題。查閱官方文件發現此型號的微控制器flash 256kb,ram 48kb。我鍊錶的結構體定義如下:

typedef

struct lnodelnode,*linklist;

uint8_t型別在微控制器中定義為unsigned char即1個位元組,32位系統乙個指標變數為4位元組。由於「記憶體對齊」機制的存在,所以實際上乙個節點分配的記憶體為8位元組。並且通過輸出語句printf("%d",sizeof(*head));列印到串列埠助手顯示的也是8,證明的分析的正確性。

經過測試發現,我最多能建立32個節點,因此我只使用了32*8=256 byte的記憶體空間。與官方文件的48kb的記憶體空間相差太多。

查閱網上的部落格發現,堆疊大小可以在stm32的啟動檔案startup_stm32f103xe.s裡面設定,開頭就有:

stack_size      equ

0x400

heap_size equ

0x200

0x00000400 等於1024位元組所以等於1k

0x00000200 等於512位元組所以等於512 byte

參考部落格:

由於malloc()分配的動態記憶體在堆區域,因此調大堆空間heap_size0xc00,即3072位元組大小。重新測試,發現可以接收到191個節點,這次使用了191*8=1528 byte大小的記憶體空間。由此判斷,使用者可以自由使用的堆空間,大約為堆總空間的一半。超過時系統就會宕機。

注:在stm32cubemx中也可對堆疊大小進行修改,在project -> settings選項中可以對minimum heap size大小進行更改。

STM32學習筆記之堆疊空間

1.堆和棧大小 定義大小在startup stm32f2xx.s stack size equ 0x00000400 area stack,noinit,readwrite,align 3 stack mem space stack size initial sp heap configuratio...

stm32記憶體分配

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

STM32的記憶體分配

使用keil編寫 區域性變數和全域性變數分別存放在什麼地方?在乙個函式內部定義的變數是內部變數,它只在本函式範圍內有效,也就是說只有在本函式內才能使用它們,在此函式以外是不能使用這些變數的,這稱為區域性變數。使用區域性變數注意以下問題 不同函式中可以使用相同名字的變數,它們代表不同的物件,互不干擾。...