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