一)、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还有做以下额外操作:
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) |