我正在考虑在我的STM32L151(Cortex M3)中设置一个内存区域,用于在malloc()中使用heap。我正在使用GNU ARM工具链和newlib。我知道如何在链接器脚本中设置堆栈,将堆栈地址分配给SP…并且ARM uC可以通过堆栈指针SP访问堆栈。我的问题是:GNU GCC编译器如何知道堆地址在哪里?我可以在链接器脚本中设置堆,就像我为堆栈所做的那样。但是如何将堆地址信息传递给GCC编译器呢?非常感谢您的光临。
eeq64g8w1#
我在以前的工作中在cortex-m3平台上做了类似的事情,也使用了new lib。我通过实现一个自定义的_sbrk()/_sbrk_r()函数来实现它,malloc()使用了这个函数。您可以为堆创建一个大小与所需大小相同的静态数组,并且_sbrk()/_sbrk_r()函数可以在其中进行调整。例如(为了清楚起见,仅进行最小错误检查):
_sbrk()/_sbrk_r()
malloc()
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; }
字符串
1条答案
按热度按时间eeq64g8w1#
我在以前的工作中在cortex-m3平台上做了类似的事情,也使用了new lib。我通过实现一个自定义的
_sbrk()/_sbrk_r()
函数来实现它,malloc()
使用了这个函数。您可以为堆创建一个大小与所需大小相同的静态数组,并且_sbrk()/_sbrk_r()
函数可以在其中进行调整。例如(为了清楚起见,仅进行最小错误检查):
字符串