我正在玩CSR 1000 chip
,我想分配内存。我尝试使用malloc
,但编译器告诉我:
对“malloc”的未定义引用
我认为这是因为gcc
使用-nostdlib
参数
所以请CSR uEnergy SDK
有{{1}}经验的人,告诉我为什么我不能分配内存,以及我应该怎么做呢?
答案 0 :(得分:1)
如果有一个与该芯片捆绑在一起的SDK提供了内存分配的基本例程,那么使用它们,或者你可以编写自己的分配器或使用现有的分配器(有一些小问题)。
作为一种快速解决方案,您可以使用修改后的链接描述文件或使用gcc'section'属性(更多here)在内存中标记一个区域,然后将其用作malloc分配器中的堆竞技场。
一个非常简单的分配器不会保留任何会计信息,例如页眉/页脚,而是线性分配一个接一个的区域(在这种情况下,free-ing本质上是一个no-op),这不会让你走得太远但是你将能够运行简单的程序。
您可能想要更复杂的东西,您也可以考虑实现某种内存池或任何标准分配算法。
如果我正确地重新调用,Dennis Ritchie和Brian Kernighan的经典书籍The C Programming Language提供了一个简单的内存分配器。你可能想看一下。
答案 1 :(得分:0)
将#include <malloc.h>
添加到文件的头部
答案 2 :(得分:0)
我有三个月的芯片使用经验。
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函数,它们模仿malloc并在标准C库中自由。
根据我使用这两种芯片的经验,我发现CSR比TI更具保护性,就像iOS与Android一样。你不知道他们使用什么MCU,除了他们告诉你它是一个16位RISC。
我怀疑他们内部有动态内存分配,但您的应用程序无法使用这些功能。操作系统在AppProcessLmEvent函数中将RF数据包传递给您,从那里通过p_event_data指针获取数据。您不必解除分配,因为操作系统将在您完成处理该事件后为您执行此操作。
回到你的问题,你可以分配内存,这样你就可以保留一块内存作为全局数组并进行处理。
希望这有帮助。