1

我目前正在玩CSR 1000 chip,我想分配内存。我尝试使用malloc,但编译器告诉我:

未定义对“malloc”的引用

我认为这是因为gcc使用-nostdlib参数运行

所以请有CSR uEnergy SDK经验的人告诉我为什么我不能分配内存,我应该怎么做?

4

3 回答 3

1

我对这个芯片有三个月的经验。

malloc 函数位于标准 C 库中,通常在桌面软件开发或嵌入式 linux 中可用。但这是一个小型且资源有限的嵌入式芯片。没有标准的 C 库。

如果您浏览 uEnergy SDK 安装目录,如下所示:C:\uEnergy_SDK-2.0.0\doc\reference\html\index.html。单击顶部的模块标签。您会发现在“C 标准库 API”部分下,CSR 提供​​了一些模仿标准 C 库子集的函数。不幸的是,没有像 malloc 这样的方法。

通常,当您使用小型嵌入式系统时,通常没有动态内存分配。但是,对于通常是事件驱动的 RF 应用程序,通常会提供一个简单的动态内存分配功能,因此操作系统可以将传入的数据包交给您的应用程序。我使用了 TI 的 CC2430 及其 Zigbee 堆栈。它们提供函数 osal_mem_alloc 和 osal_mem_free,模仿标准 C 库中的 malloc 和 free。

根据我使用这两种芯片的经验,我发现 CSR 比 TI 更具保护性,就像 iOS 与 Android 一样。您不知道他们使用什么 MCU,除非他们告诉您它是 16 位 RISC。

我怀疑他们在内部有动态内存分配,但您的应用程序无法使用这些功能。射频数据包由操作系统在 AppProcessLmEvent 函数中交给您,您可以从那里通过 p_event_data 指针获取数据。您不必解除分配它,因为一旦您处理完该事件,操作系统就会为您执行此操作。

所以回到你的问题,你可以分配内存,所以你只需保留一块内存作为全局数组并处理它。

希望这可以帮助。

于 2013-03-01T01:08:57.887 回答
1

如果有一个与该芯片捆绑在一起的 SDK,它提供了内存分配的基本例程,然后使用这些,或者您可以编写自己的分配器或使用现有的网络分配器(有些摆弄)。

作为一个快速的解决方案,您可以使用修改后的链接描述文件或使用 gcc 'section' 属性(更多here)在内存中标记一个区域,然后将其用作 malloc 分配器中的堆区域。

一个非常简单的分配器不会保留任何会计信息,例如页眉/页脚,而是一个接一个地线性分配区域(在这种情况下,释放本质上是一个无操作),这不会让你走得太远,但你会能够运行简单的程序。

您可能想要更复杂的东西,您还可以考虑实现某种内存池或任何标准分配算法。

如果我重新调用正确的话,Dennis Ritchie 和 Brian Kernighan 的经典著作 The C Programming Language 提供了一个简单的内存分配器。你可能想看看那个。

于 2012-09-12T13:51:58.123 回答
0

添加#include <malloc.h>到文件的头部

于 2012-09-12T14:04:32.750 回答