【发布时间】: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