我正在考虑在STM32L151(Cortex M3)中设置一个内存区域,以便在malloc()中使用堆。
我正在使用GNU ARM工具链和newlib。
我知道如何在链接描述文件中设置堆栈,将堆栈地址分配给SP ...并且ARM uC可以通过堆栈指针SP访问堆栈。
我的问题是:GNU GCC编译器如何知道堆地址在哪里? 我可以在链接器脚本中设置堆,就像我对堆栈一样。但是我如何将堆地址信息传递给GCC编译器?
非常感谢。
答案 0 :(得分:3)
我在之前的工作中在cortex-m3平台上做了类似的事情,也使用了新的lib。我通过实现_sbrk()/_sbrk_r()
使用的自定义malloc()
函数来解决这个问题。您可以根据堆的需要创建一个大的静态数组,并且_sbrk()/_sbrk_r()
函数将在此范围内进行调整。
例如(为清晰起见,仅进行了最小的错误检查):
static char mem_array[MAX_HEAP_SIZE];
static char *_cur_brk = mem_array;
void *_sbrk_r(struct _reent *reent, ptrdiff_t diff)
{
char *_old_brk = _cur_brk;
if (_cur_brk + diff > MAX_HEAP_SIZE) {
errno = ENOMEM;
return (void *)-1;
}
_cur_brk += diff;
return _old_brk;
}