LAT1079
Local Application Tips
LAT1079 Rev 1.0 Dec. 2021
STM32CubeIDE 实用技巧之配置 Heap 空间
关键字:STM32CubeIDE Heap 堆, __sbrk
1. 问题描述
近日接到一客户需求,其欲 STM32CubeIDE 中指定堆(Heap)的地址到某一专用的
RAM 中。
2. 问题分析
STM32CubeIDE 生成的工程中,默认的堆栈配置示意图如图 1 所示:
1. STM32CubeIDE 默认的 memory 分布
客户的需求就是想配置堆栈为图 2 的分布状态,这里堆的地址要能够自定义:
2. Memory 的目标分布图
flash
.bss .data
heap
stack
RAM
flash
.bss .data
heap
stack
RAM
LAT1079
LAT1079 - Rev 1.0 page 2/4
3. 解决方法
通过 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 无法识别这种情形,用
户应当避免这样的设置
4. 验证
STM32CubeIDE 生成的串口打印的工程,然后按照上面示例修改 sysmem.c 中的
__sbrk_heap_end 参数。
int main(void)
{
/* USER CODE BEGIN 1 */
uint8_t *heap_pointer = (uint8_t *)malloc(10);
/* USER CODE END 1 */
。。。
/* USER CODE BEGIN 2 */
if(heap_pointer != NULL)
{
printf("heap_pointer address = %x\r\n", heap_pointer);
}else
{
printf("malloc memory failed\r\n");
}
/* USER CODE END 2 */
。。。
}
3. 串口输出指针的地址信息