在ARM嵌入式系统的内存中设置堆

时间:2014-03-11 05:50:46

标签: gcc malloc heap stm32 cortex-m3

我正在考虑在STM32L151(Cortex M3)中设置一个内存区域,以便在malloc()中使用堆。

我正在使用GNU ARM工具链和newlib。

我知道如何在链接描述文件中设置堆栈,将堆栈地址分配给SP ...并且ARM uC可以通过堆栈指针SP访问堆栈。

我的问题是:GNU GCC编译器如何知道堆地址在哪里? 我可以在链接器脚本中设置堆,就像我对堆栈一样。但是我如何将堆地址信息传递给GCC编译器?

非常感谢。

1 个答案:

答案 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;
}