gcc ARM嵌入式系统内存堆的建立

6xfqseft  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(159)

我正在考虑在我的STM32L151(Cortex M3)中设置一个内存区域,用于在malloc()中使用heap。
我正在使用GNU ARM工具链和newlib。
我知道如何在链接器脚本中设置堆栈,将堆栈地址分配给SP…并且ARM uC可以通过堆栈指针SP访问堆栈。
我的问题是:GNU GCC编译器如何知道堆地址在哪里?我可以在链接器脚本中设置堆,就像我为堆栈所做的那样。但是如何将堆地址信息传递给GCC编译器呢?
非常感谢您的光临。

eeq64g8w

eeq64g8w1#

我在以前的工作中在cortex-m3平台上做了类似的事情,也使用了new 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;
}

字符串

相关问题