首页 理论教育 Contiki操作系统中的MEMB内存分配器

Contiki操作系统中的MEMB内存分配器

时间:2023-11-20 理论教育 版权反馈
【摘要】:MEMB 内存块分配器方法把内存块划分为固定大小的对象序列,并放置在静态内存中,MEMB内存管理API函数如下所示:MEMB()宏用于声明struct memb 类型的内存块,参数name 用于标识分配的内存块,并在之后用name 作为其他内存块函数使用该内存块的参数,structure 参数指定了该内存块的结构体类型,num 表示内存块包含内存对象的数量。下面的宏MEMB()包含定义静态内存的三条语句。

Contiki操作系统中的MEMB内存分配器

MEMB 库提供了一组内存块管理函数,库函数的声明在头文件memb.h中,内存块操作函数的定义在程序文件memb.c中,这两个文件保存在core/lib/文件夹中。MEMB 内存块分配器方法把内存块划分为固定大小的对象序列,并放置在静态内存中,MEMB内存管理API函数如下所示:

MEMB()宏用于声明struct memb 类型的内存块,参数name 用于标识分配的内存块,并在之后用name 作为其他内存块函数使用该内存块的参数,structure 参数指定了该内存块的结构体类型,num 表示内存块包含内存对象的数量。下面的宏MEMB()包含定义静态内存的三条语句。其中,第一条语句声明存储内存块可容纳对象数量的一维数组CC_CONCAT[],由于该对象的个数被存放在char类型的数组中,所以内存块最多可容纳127个内存对象;第二条语句分配由structure参数引用的num个结构类型的数组。

其中成员size 用于存放结构体大小sizeof(structure)的值,num 是分配的内存对象个数,分配内存对象的总数为memb->size 与memb->num 的成绩,count 指针表示这段内存块是否被使用(0 表示未使用,1 表示已经被使用),内存块的首地址为memb->count。

一旦使用MEMB()函数声明了内存块之后,必须使用函数memb_init()对内存块进行初始化,memb_init()函数使用struct memb类型的参数*m标识内存块,该函数再使用标准C 语言库函数memset()函数初始化分配内存值为0。初始化struct memb 类型的内存块后,可以用内存分配函数memb_alloc()从内存中分配内存对象。使用相同类型struct memb 分配的所有内存对象的大小都相同,内存对象的大小是由宏MEMB()中structure 参数的大小决定的。如果分配内存的操作成功,函数memb_alloc()返回指向已分配内存对象的指针,如果内存块中没有空闲对象可分配,则返回NULL值。(www.xing528.com)

memb_free()函数用于释放之前用memb_alloc()函数分配的对象,内存对象的释放需要两个指针参数:m、ptr。m 用于指向内存块,而ptr 用于指向内存块中的内存对象。用memb_inmemb()函数检查prt 指针是否处于内存块的数据区域内,如果ptr处于m指向的内存块中,则函数memb_inmemb()返回1,如果ptr指向未知的内存,则函数memb_inmemb()返回0。

下面的例子说明了MEMB 内存分配模块的使用方法, 函数open_connection()将为每个套接字socket 标识的新连接分配struct connection 类型变量,当关闭一个连接时,释放为struct connection变量分配的内存块。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈