需要在Contiki中使用mmem的示例吗

需要在Contiki中使用mmem的示例吗,c,heap-memory,contiki,cooja,C,Heap Memory,Contiki,Cooja,我正在开发用于COOJA模拟器的代码。对于所有动态内存分配,我都使用了malloc()。当模拟运行时,COOJA微尘会定期重新启动,最后我得到一个错误,它告诉我原因是我正在使用malloc() 我正在考虑使用Contiki的特定内存分配类“mmem”。我找不到任何使用它的例子。下面是一个示例,我使用malloc()将内存分配给名为sent的字符串 如何使用malloc()替换为使用mmem而不是malloc() 从 以下是如何使用托管内存分配器的示例: #include "contiki.h"

我正在开发用于COOJA模拟器的代码。对于所有动态内存分配,我都使用了
malloc()
。当模拟运行时,COOJA微尘会定期重新启动,最后我得到一个错误,它告诉我原因是我正在使用
malloc()

我正在考虑使用Contiki的特定内存分配类“mmem”。我找不到任何使用它的例子。下面是一个示例,我使用
malloc()
将内存分配给名为
sent
的字符串

如何使用
malloc()
替换为使用
mmem
而不是
malloc()

以下是如何使用托管内存分配器的示例:

 #include "contiki.h"
 #include "lib/mmem.h"

 static struct mmem mmem;

 static void
 test_mmem(void)
 {
   struct my_struct {
     int a;
   } my_data, *my_data_ptr;

   if(mmem_alloc(&mmem, sizeof(my_data)) == 0) {
     printf("memory allocation failed\n");
   } else {
     printf("memory allocation succeeded\n");
     my_data.a = 0xaa;
     memcpy(MMEM_PTR(&mmem), &my_data, sizeof(my_data));
     /* The cast below is safe only if the struct is packed */
     my_data_ptr = (struct my_struct *)MMEM_PTR(&mmem);
     printf("Value a equals 0x%x\n", my_data_ptr->a);
     mmem_free(&mmem);
   }
 }
上面的例子展示了一个管理内存 图书馆可以使用。在第4行,我们分配了一个变量mmem 标识要分配的托管内存对象。在…上 第13行,我们使用mmem变量作为mmem_alloc()的参数 为sizeof(my_数据)字节的结构分配空间。如果 分配成功后,我们从现有结构复制值 进入分配的结构,由MMEM_PTR(&MMEM)指向。 然后,分配结构的各个成员可以由 如第行所示,将MMEM_PTR(&MMEM)类型转换为struct my_struct* 20请注意,只有在结构已打包的情况下,cast才是安全的。托管内存最终在第21行通过调用 mmem_free()

编辑:

根据粘贴在注释中的代码,无需使用
malloc
mmem
-模块。只需在堆栈上分配。或许可以试试这样的方式:

/* Allocate memory on the stack */
char sent[120];

/* Manipulate strings */
strncpy(sent , "reqid" , 5); 
strncat(sent, "|", 1); 

/* Send UDP packet */
uip_udp_packet_send(mcast_conn, sent, strlen(sent)); 

/* Print out string sent */
printf(" (msg: %s)\n", sent); 
编辑2:


还有。

为什么不在堆栈上分配120个字节呢?在我的例子中,字符和字符串之间会有很多转换,我对此不感兴趣。我想我不明白。如果您预先知道分配大小(示例代码建议),为什么不在堆栈上分配呢?低资源设备上的嵌入式开发和动态分配通常以碎片化结束,这会导致耗尽,这可能是导致崩溃的原因。就连康蒂基的文档也提到了这一点。尽管如此,我假设您已经阅读了本指南:?我不确定是否完全理解您所指的解决方案。你能解释一下我如何在堆栈上分配吗?老实说,我不明白你所说的“堆栈”是什么意思。堆栈与堆是C编程中的一个核心概念,我很难在这里用600个字符来解释它。基本上不是
char*sent=malloc(120)你做
字符发送[120]等等。实际上我看到了这个例子。为了澄清这个问题,我在这里插入了我的代码:`struct my_struct{char*sent;}my_data,*my_data\u ptr;strncpy(我的数据已发送,“请求ID”,5);strncat(my_data.sent,“|”,1);memcpy(MMEM_PTR(&MMEM),&my_数据,sizeof(my_数据));my_data_ptr=(struct my_struct*)MMEM_ptr(&MMEM);uip_udp_数据包发送(mcast_conn,my_data_ptr->sent,strlen(my_data_ptr->sent));printf(“(消息:%s)\n”,我的数据\u ptr->已发送);mmem_free(&mmem);`我希望在输出中看到“mg:reqid |”,但输出为NULL。我想知道我哪里做错了。@mahshid你能编辑你的问题以包含你尝试过的代码吗?您缺少对
mmem_init()
mmem_alloc(…)
的调用,我想。。。?我再次建议您尝试使用静态分配,而不是动态分配,原因在我的其他评论中提到(碎片导致内存耗尽)。对于错误的表示,我很抱歉,我尝试了几次,但我无法理解它是如何工作的。我添加了mmem_init()和mmem_allocate(),但仍然是一样的<代码>C结构my_结构{char*sent;}my_数据,*my_数据\u ptr;mmem_init();mmem_alloc(&mmem,120);strncpy(我的数据已发送,“请求ID”,5);strncat(my_data.sent,“|”,1);memcpy(MMEM_PTR(&MMEM),&my_数据,sizeof(my_数据));my_data_ptr=(struct my_struct*)MMEM_ptr(&MMEM);uip_udp_数据包发送(mcast_conn,my_data_ptr->sent,strlen(my_data_ptr->sent));printf(“(消息:%s)\n”,我的数据\u ptr->已发送);mmem_免费(&mmem)@mahshid我已经用一些代码更新了我的答案,我认为这些代码可以替代。我没有任何东西运行Contiki,因此我无法自己测试它,但我认为您不需要发布的
mmem
-模块。
/* Allocate memory on the stack */
char sent[120];

/* Manipulate strings */
strncpy(sent , "reqid" , 5); 
strncat(sent, "|", 1); 

/* Send UDP packet */
uip_udp_packet_send(mcast_conn, sent, strlen(sent)); 

/* Print out string sent */
printf(" (msg: %s)\n", sent);