首页 > 解决方案 > 需要一个在 Contiki 中使用 mmem 的示例

问题描述

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

我正在考虑使用名为“mmem”的 Contiki 的特定内存分配类。我找不到任何使用它的例子。这是一个示例,其中我曾经malloc()将内存分配给名为sent.

如何替换 using malloc()to usemmem而不是malloc()

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

标签: cheap-memorycontikicooja

解决方案


来自Contiki 的 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-module。只需在堆栈上分配。也许尝试这样的事情:

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

这是关于堆与堆栈的页面。这是关于嵌入式设备上的动态分配及其涉及的问题的stackoverflow问题


推荐阅读