首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

contiki系统分析4:内存分配

2013-03-28 
contiki系统分析四:内存分配contiki有三种分配内存的方式。memb 内存块分配器,在contiki中使用最频繁mmem

contiki系统分析四:内存分配


contiki有三种分配内存的方式。


memb 内存块分配器,在contiki中使用最频繁

mmem 管理内存分配器,很少去使用

标准C库的malloc的栈内存分配器,在contiki这种受限系统中使有最危险。


memb的内存分配器


有下列的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系统中通用的做法是静态分配内存.好的方法应该是动态去分配.


热点排行