LWIP v2.1.0内存管理之相关宏之间的关系

一)、LWIP内存管理之相关宏之间的关系:

工作比较忙,经常加班搬砖,所以自己写东西的时间就比较少了,而且由于自己是边学边写,自己看源码内容加上消化要一周,然后由于想把文档写好点,所以写东西也要一周,真是太慢了,不过慢不要紧,只要不停下,总有一天能把他写完。那谁不是说时间就像乳沟,挤挤总是有的(我是一个瘦瘦的男生,他么的怎么挤也没有啊)。。。。


总的来说, LWIP 的动态内存管理机制可以有以下三种机制实现:C 运行时库自带的内存管理策略、内存堆(HEAP)管理策略和内存池(POOL)管理策略,他们之间使用以下宏进行管理。

MEM_LIBC_MALLOC: 该宏值定义是否使用C 运行时库自带的存存管理策略,还是使用LWIP模拟的动态内存管理策略。为1表示使用C 运行时库自带的内存管理策略, 为0表示使用LWIP模拟的动态内存管理策略。

LWIP模拟的动态内存管理策略又分为两种实现形式:①、通过内存堆(HEAP)管理策略来实现内存管理(大数组);②、通过内存池(POOL)管理策略来实现内存管理(事先开辟好的内存池,累加成大数组);

MEMP_MEM_MALLOC: 该宏值定义是否使用内存堆(HEAP)管理策略实现内存池分配(即:要从内存池中获取内存时,实际是从内存堆中分配,调用内存堆管理函数实现)。默认情况下为 0,表示不从内存堆中分配,内存池为独立函数实现,与MEM_USE_POOLS只能选择其一。

MEM_USE_POOLS:该宏值定时是否使用内存(POOL)分配策略实现内存堆的分配(即:要从内存堆中获取内存时,实际是从内存池中分配,调用内存池管理函数实现)。默认情况下为 0,表示不使用。与MEMP_MEM_MALLOC只能选择其一。

如果使用MEMP_USE_POOLS还有做以下额外操作:

  1. 新建文件 lwippools.h 中定义宏MEM_USE_POOLS 和 MEM_USE_CUSTOM_POOLS 为 1;
  2. 同时还要开辟一些额外的缓冲池区,如下:

LWIP_MALLOC_MEMPOOL_START

LWIP_MALLOC_MEMPOOL(20, 256)

LWIP_MALLOC_MEMPOOL(10, 512)

LWIP_MALLOC_MEMPOOL(5, 1512)

LWIP_MALLOC_MEMPOOL_END

以上部分的配置可以从mem.c和memp.c文件的结构可以大致看出:

men.c文件结构如下:

#if MEM_LIBC_MALLOC

/* 这里表示使用C库函数实现动态内存管理函数(一般不用) */

#elif MEM_USE_POOLS

/* 这里表示使用内存池管理函数实现动态内存管理函数,调用的函数位于memp.c中,这种方式MEMP_MEM_MALLOC必须为0 */

#else

/* 使用LWIP的内存堆管理函数实现动态内存管理函数 */

#endif

从上面可以看出动态内存管理函数的实现是有三种方式的,MEM_USE_POOLS=1 时mem.c中的LWIP动态内存管理函数是由 memp.c中的池内存管理函数封装而成的;当MEM_USE_POOLS=0 时 mem.c 中的 LWIP 动态内存管理函数是由独立的动态内存堆管理函数构成;不论是用那种方式,对外的接口都是统一的。

 

memp.c中是对内存池的独立管理:

然而内存池的管理又可以分为两种,一种是使用内存堆管理函数实现内存池管理;另一种是使用一套内存池专用的管理实现。这两种的选择由MEMP_MEM_MALLOC定义决定,主要体现在 memp.c中的 memp_init_pool()、do_memp_malloc_pool() 和do_memp_free_pool() 中,当 MEMP_MEM_MALLOC=1 时内存池的申请都是透过调用 mem_ 开头的函数实现的,也就是内存堆管理函数;

由上面两个部分可以看出 MEMP_MEM_MALLOC 和 MEM_USE_POOLS一定不能同时为1,但可以同时为0,如下表所示。

MEMP_MEM_MALLOC

MEM_USE_POOLS

动态内存分配策略

1

1

必须不行(实现的方式变成了相互调用)

1

0

动态内存由内存池管理函数实现(mem.c中的函数实现)

0

1

内存池管理由动态内存函数实现(memp.h中宏定义实现)

0

0

动态内存管理和内存池管理都独立实现(mem.c和memp.c)

 

你可能感兴趣的:(LWIP2.1.0)