需要在Contiki中使用mmem的示例

时间:2019-07-20 10:47:21

标签: c heap-memory contiki cooja

我正在开发代码,以便在COOJA模拟器中使用。我将malloc()用于所有动态分配。在模拟运行时,COOJA节点会定期重新启动,最后我得到一个错误,告诉我原因是使用了malloc。我正在考虑使用Contiki的特定内存分配类“ mmem”。我找不到使用它的任何示例。这是一个示例,其中我使用malloc将内存分配给名为“ sent”的字符串。您能帮我用mmem代替malloc吗?

   char *sent;
   sent = (char*)malloc(120);
   strncpy(sent , "example" , 7);
   strncat(sent , "|", 1);

1 个答案:

答案 0 :(得分:1)

来自Contiki’s github Wiki

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

 #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_data)个字节的结构分配空间。如果   分配成功后,我们从现有结构中复制值   进入由MMEM_PTR(&mmem)指向的分配结构。   然后,分配结构的各个成员可以通过   如下所示,将MMEM_PTR(&mmem)的类型转换为struct my_struct *   20.请注意,仅在打包结构时,强制转换才是安全的。最后,通过调用在第21行释放托管内存   mmem_free()。​​

编辑:

根据您粘贴在注释中的代码,无需使用mallocmmem模块。只需在堆栈上分配即可。也许可以尝试这样的事情:

/* 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:

Here is a page on heap vs stack.here is a stackoverflow question about dynamic allocation on embedded devices and the problems it involves