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