問題描述
近日接到一客戶需求,其欲在 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 的機制所致,不影響用戶的使用。
來源:STM32單片機
審核編輯:湯梓紅
-
RAM
+關注
關注
8文章
1368瀏覽量
114701 -
STM32
+關注
關注
2270文章
10900瀏覽量
356044 -
串口
+關注
關注
14文章
1554瀏覽量
76522 -
指針
+關注
關注
1文章
480瀏覽量
70564
發布評論請先 登錄
相關推薦
STM32CubeIDE入門教程 STM32CubeIDE安裝使用教程
![<b class='flag-5'>STM32CubeIDE</b>入門教程 <b class='flag-5'>STM32CubeIDE</b>安裝使用教程](https://file.elecfans.com//web2/M00/46/F4/pYYBAGKXCM6AV5jGAAxPkBro6Ok723.png)
STM32CubeIDE SWV功能介紹
![<b class='flag-5'>STM32CubeIDE</b> SWV功能介紹](https://file.elecfans.com/web2/M00/17/A0/poYBAGFme7yALxotAAAhvjYHoH8415.png)
STM32CubeIDE使用
![<b class='flag-5'>STM32CubeIDE</b>使用](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32CubeIDE的MCU開發
![<b class='flag-5'>STM32CubeIDE</b>的MCU開發](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32CUBEIDE(1)----安裝
![<b class='flag-5'>STM32CUBEIDE</b>(1)----安裝](https://file.elecfans.com/web2/M00/7D/72/pYYBAGN8Kp-AcNXaAADcCR2hxBY834.jpg)
STM32CubeIDE實用技巧之仿真帶外擴FLASH的工程
![<b class='flag-5'>STM32CubeIDE</b><b class='flag-5'>實用技巧</b><b class='flag-5'>之</b>仿真帶外擴FLASH的工程](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論