問(wèn)題描述
近日接到一客戶(hù)需求,其欲在 STM32CubeIDE 中指定堆(Heap)的地址到某一專(zhuān)用的RAM 中。
問(wèn)題分析
STM32CubeIDE 生成的工程中,默認(rèn)的堆棧配置示意圖如圖 1 所示:
解決方法
通過(guò) 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)向上增長(zhǎng),棧(stack)向下增長(zhǎng),所以在手動(dòng)更改堆的起始地址時(shí),如果定義的堆和??臻g存在重疊區(qū)域,STM32CubeIDE 無(wú)法識(shí)別這種情形,用戶(hù)應(yīng)當(dāng)避免這樣的設(shè)置。
驗(yàn)證
在 STM32CubeIDE 生成的串口打印的工程,然后按照上面示例修改 sysmem.c 中的__sbrk_heap_end 參數(shù)。
可以看到 heap_pointer 指針通過(guò) malloc 申請(qǐng)到的地址,已經(jīng)指向了目標(biāo) RAM 范圍內(nèi)了。
注意,這里我們?cè)?0x20001000 開(kāi)始的位置申請(qǐng)了 10 個(gè)字節(jié)的空間,理論上heap_pointer 應(yīng)當(dāng)從 0x20001000 開(kāi)始計(jì)算,但是由于 malloc 在申請(qǐng)的地址時(shí),會(huì)占用 8個(gè)字節(jié)用來(lái)存儲(chǔ)狀態(tài)等信息,所以 heap_pointer 指針從 0x20001008 開(kāi)始。這是STM32CubeIDE 使用了 newlib 庫(kù)來(lái)實(shí)現(xiàn) malloc 的機(jī)制所致,不影響用戶(hù)的使用。
來(lái)源:STM32單片機(jī)
審核編輯:湯梓紅
-
RAM
+關(guān)注
關(guān)注
8文章
1392瀏覽量
117519 -
STM32
+關(guān)注
關(guān)注
2293文章
11032瀏覽量
364868 -
串口
+關(guān)注
關(guān)注
15文章
1588瀏覽量
79933 -
指針
+關(guān)注
關(guān)注
1文章
484瀏覽量
71189
發(fā)布評(píng)論請(qǐng)先 登錄
STM32CubeIDE入門(mén)教程 STM32CubeIDE安裝使用教程

STM32CubeIDE使用

STM32CubeIDE的MCU開(kāi)發(fā)

第一個(gè)STM32CubeIDE項(xiàng)目

STM32CubeIDE生成的工程
STM32CUBEIDE(1)----安裝

STM32CubeIDE快速入門(mén)指南

STM32CubeIDE實(shí)用技巧之仿真帶外擴(kuò)FLASH的工程

STM32CubeIDE實(shí)用技巧之配置堆空間

STM32CubeIDE實(shí)用技巧之ld鏈接文件

評(píng)論