【问题标题】:setting up heap in memory for ARM embedded system为 ARM 嵌入式系统在内存中设置堆
【发布时间】:2014-04-14 13:52:21
【问题描述】:

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

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

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

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

非常感谢。

【问题讨论】:

  • 1) malloc 在这样的系统上是个坏主意...2) newlib 有一个 libcfunc.c 和一个 system something 文件,它们是所有系统接口,包括 malloc,看看那里图找出如何告诉 newlib 你的堆在哪里。编译器不关心也不知道 malloc 是 C 库的东西而不是编译器的东西。
  • @old_timer,不幸的是,newlib 中有许多使用 malloc/free 的标准函数(例如,从 vsnprint 调用的 dtoa、itoa 等一些东西,还有 localtime 等等)。因此,如果您要使用其中任何一个,您至少需要一个小堆。
  • @CraigB 这就是重点,这是裸机,在这样的平台上应该避免使用这些功能。在这样的系统中没有 malloc 的位置,也没有任何依赖它的函数。如果您需要操作系统或没有系统调用就无法生存,那么请找到合适的平台。它们在这样的平台上提供的价值很小,很容易被明智的东西取代。
  • 这是很久以后的事了,但是@old_timer 我明白你在说什么。我们在我们的许多产品中使用了许多不同的功能强大的 STM32 MCU,这些产品运行具有各种功能的非常复杂的固件。因此,对于许多人来说,这不仅仅是一种“裸机”情况。真正的问题是,您是想利用 newlib 提供的所有质量、经过测试的代码,还是编写您自己的所有库并测试和支持它们。 Newlib 对我们来说需要一个 512 字节的堆。 ...并且它基本上一遍又一遍地重复使用相同的内存块而无需分配/释放。

标签: gcc malloc heap-memory stm32 cortex-m3


【解决方案1】:

我在之前的工作中在 cortex-m3 平台上做了类似的事情,也使用了新的 lib。我通过实现_sbrk()/_sbrk_r() 使用的自定义_sbrk()/_sbrk_r() 函数来解决这个问题。您将创建一个与堆所需大小一样大的静态数组,并且您的 _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;
}

【讨论】:

    猜你喜欢
    • 2021-07-21
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    相关资源
    最近更新 更多