内存池(POOL)
LWIP内核在初始化的时候已经为每个数据结构类型都初始化了一定数量的POOL,文件memp.c和memp.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];

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

被折叠的 条评论
为什么被折叠?



