LWIP的内存池

本文介绍了LWIP内核的内存池管理机制,包括memp_t数据类型、memp_tab全局指针数组、memp_sizes全局数组、memp_num数组、memp_desc数组和memp_memory内存池数组。内存池的分配和释放过程简洁高效,适用于固定大小内存的快速分配。同时,文章也提及了内存堆的使用和优缺点。

内存池(POOL)

LWIP内核在初始化的时候已经为每个数据结构类型都初始化了一定数量的POOL,文件memp.cmemp.h就是内存池相关内容。

LWIP内核建立多少内存池依赖于用户系统配置,假如宏定义LWIP_UDP为1,那么编译时与UDP控制块数据结构相关的内存池就会建立(MEMP_UDP_PCB),每种类型的POOL大小都是固定的。

系统在初始化时,会事先在内存中初始化相应的空闲内存空间,如上图所示,系统将所有可用区域以固定的大小为单位进行划分,然后用一个简单的链表将所有空闲块连接起来。由于链表中所有节点的大小相同,所以分配时不需要查找,直接取出第一个节点中的空间分配给用户即可

释放时,也很简单,直接将释放的内存空间插入到对应链表首部即可

memp_t数据类型

memp_t是一个枚举类型变量,用来给每个POOL编号。定义和声明:
 

//memp.h
//定义每种类型的pool
/** Create the list of all memory pools managed by memp. MEMP_MAX represents a NULL pool at the end */
typedef enum {
#define LWIP_MEMPOOL(name,num,size,desc)  MEMP_##name,//用MEMP_##name代替前面的LWIP_MEMPOOL(name,num,size,desc),##name中的name代替LWIP_MEMPOOL(name,num,size,desc)中的name
#include "lwip/priv/memp_std.h" //编译时会将这个头文件里的东西编译进来
  MEMP_MAX
} memp_t;

//lwip-2.1.0\src\core\memp.c
//声明每种类型的pool
#define LWIP_MEMPOOL(name,num,size,desc) LWIP_MEMPOOL_DECLARE(name,num,size,desc)
#include "lwip/priv/memp_std.h"

example:

MEMP_MAX代表枚举变量的个数。

其中name取值(memp_std.h)如下图:

memp_tab全局指针数组

memp_tab作为一个全局指针数组,指向每类POOL的第一给内存块(每类POOL下面有很多同等大小的内存块通过链表连接)。就是要在分配空间的时候从这里取出,释放空间的时候从这个点插入。

定义如下:

//memp.c定义
static struct memp *memp_tab[MEMP_MAX];

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值