我正在开发代码,以便在COOJA模拟器中使用。我将malloc()用于所有动态分配。在模拟运行时,COOJA节点会定期重新启动,最后我得到一个错误,告诉我原因是使用了malloc。我正在考虑使用Contiki的特定内存分配类“ mmem”。我找不到使用它的任何示例。这是一个示例,其中我使用malloc将内存分配给名为“ sent”的字符串。您能帮我用mmem代替malloc吗?
char *sent;
sent = (char*)malloc(120);
strncpy(sent , "example" , 7);
strncat(sent , "|", 1);
答案 0 :(得分:1)
以下是如何使用托管内存分配器的示例:
#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()。
。
编辑:
根据您粘贴在注释中的代码,无需使用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:
Here is a page on heap vs stack.和here is a stackoverflow question about dynamic allocation on embedded devices and the problems it involves。