關鍵詞:STM32CubeIDE, Heap, 堆, __sbrk
問題描述
近日接到一客戶需求,其欲在 STM32CubeIDE 中指定堆(Heap)的地址到某一專用的RAM 中。
問題分析
STM32CubeIDE 生成的工程中,默認的堆棧配置示意圖如圖 1 所示:
解決方法
通過 STM32CubeIDE 生成的工程中,會默認生成 sysmem.c。這個文件中的
__sbrk_heap_end 指針默認賦值為 NULL,我們只需要更改這個指針為目標地址即可達到期望。
例如:默認配置是“static uint8_t *__sbrk_heap_end = NULL;”我們希望將堆的地址分配到 0x20001000 為起始的空間上,可以這樣做:
“static uint8_t *__sbrk_heap_end = (uint8_t*)0x20001000;”
注意:由于堆(heap)向上增長,棧(stack)向下增長,所以在手動更改堆的起始地址時,如果定義的堆和棧空間存在重疊區域,STM32CubeIDE 無法識別這種情形,用戶應當避免這樣的設置。
驗證
在 STM32CubeIDE 生成的串口打印的工程,然后按照上面示例修改 sysmem.c 中的__sbrk_heap_end 參數。
可以看到 heap_pointer 指針通過 malloc 申請到的地址,已經指向了目標 RAM 范圍內了。
注意,這里我們在 0x20001000 開始的位置申請了 10 個字節的空間,理論上heap_pointer 應當從 0x20001000 開始計算,但是由于 malloc 在申請的地址時,會占用 8個字節用來存儲狀態等信息,所以 heap_pointer 指針從 0x20001008 開始。這是STM32CubeIDE 使用了 newlib 庫來實現 malloc 的機制所致,不影響用戶的使用。
-
存儲
+關注
關注
13文章
4314瀏覽量
85846 -
RAM
+關注
關注
8文章
1368瀏覽量
114697 -
工程
+關注
關注
0文章
165瀏覽量
27861
原文標題:工程師筆記 |STM32CubeIDE 實用技巧之配置 Heap 空間
文章出處:【微信號:STM32_STM8_MCU,微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論