contiki系统分析四:内存分配
contiki有三种分配内存的方式。
memb 内存块分配器,在contiki中使用最频繁
mmem 管理内存分配器,很少去使用
标准C库的malloc的栈内存分配器,在contiki这种受限系统中使有最危险。
有下列的API:
MEMB(name, structure, num) : 定义memory block.
void memb_init(struct memb *m) : 初始化memory block.
void *memb_alloc(struct memb *m) : 分配memory block.
int memb_free(struct memb *m, void *ptr) : 释放memory block.
int memb_inmemb(struct memb *m, void *ptr) : 判断ptr传入的地址是否是memory block.
MEMB做了哪些事情
mmem(managed memory allocator)
实现的文件是core/lib/mmem.c及对应的头文件.
中间涉及一个结构体:
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)); printf("Value a equals 0x%x\n", ((struct my_struct *)MMEM_PTR(&mmem))->a); mmem_free(&mmem); } }
示例代码,没有分析的必要了.这种操作在中断,多线程及抢占式的代码存在的情况下,极不安全.所以一般只是在contiki的进程中使用.如果获取分配的内存地址,只能用MMEM_PTR()这个宏.
在contiki系统中,可以在platform下面的初始化代码时提供mmem_init.
platform/iris/contiki-iris-main.c有对应的例子.可以看一下.
总结
第三种分配内存的方法即C库里的malloc, calloc等函数.但是在contiki内存受限.不会分配到连续的内存,而且也要开足heap区间.对contiki来说,不是一个好的选择.
memb的话,属于静态的分配内存.mmem属于动态分配内存.
但是现在的contiki系统中通用的做法是静态分配内存.好的方法应该是动态去分配.