lwip内存池:
文件:memp.c memp.h memp_std.h
# define lwip _ mempool _ declare (name,num,size,desc ) )。
lwip _ declare _ memory _ aligned (memp _ memory _ # # name # # base,((num ) ) ) memp_sizememp_align_size
lwip _ mempool _ declare _ stats _ instance (memp _ stats # # name ) )。
staticstructmemp * memp _ tab _ # # name;
conststructmemp _ descmemp _ # # name={
DECLARE_LWIP_MEMPOOL_DESC(desc )
lwip _ mempool _ declare _ stats _ reference (memp _ stats _ # # name ) )。
LIP_mem_align_size(size ),
(num )、
memp_memory_ ## name ## base,
memp_tab ## name
(;
#definelwip_mempool(name,num,size,desc ) lwip _ mempool _ declare (name,num,size,desc ) )。
#include “lwip/priv/memp_std.h”
上面的memp.c声明描述符base为各种内存池中的每个内存池记录了num个内存池基地址。 因此,在编译时分配了内存的就是全局变量。
conststructmemp _ desc * constmemp _ pools [ memp _ max ]={
#definelwip_mempool(name,num,size,desc ) memp_ ## name,
#include “lwip/priv/memp_std.h”
(;
将各种内存池的描述符地址设置为数组。
/* *内存池描述符* /
struct memp_desc {
#ifdefined(lwip_debug )|lwip _ stats _ display
/** Textual description /
const char desc;
/Element size */
u16_t size;
#if! MEMP_MEM_MALLOC
/** Number of elements */
u16_t num;
/* *基础地址* /
u8_t *base;
/* * firstfreelementofeachpool.elementsformalinkedlist.* /
结构图* * tab; /指向此类可用内存池的链表头
#endif/MEMP_MEM_MALLOC */
(;
//*
initializecustommemorypool.related functions : memp _ malloc _ pool,memp _ free _ pool @ paramdescpooltoinitialize
*/
void
memp _ init _ pool (conststructmemp _ desc * desc ) )。
{
int i;
结构图*图; *desc-tab=NULL;
MEMP=(structMEMP ) lwip _ mem _ align (desc-base;
#if MEMP_MEM_INIT
/force memset on pool memory /
memset(memp,0,(size_t ) desc-num * (memp _ size desc-size ) );
#endif
/createalinkedlistofmempelements * /
for(I=0; i desc-num; I ) {
memp-next=*desc-tab;
*desc-tab=memp;
/* castthroughvoid* togetridofalignmentwarnings */memp=(structmemp * ) void * () u8_t * ) mempmemp_sizedesc }
}
memp_init_pool将总共num个分配的内存池空间初始化为链表。
如上所述,将初始化分配的内存,使链表末尾的next指针指向NULL。
分配的pool将从链表中删除,tab再次指向空链表的头部。
如果是free pool,则重新添加到链表中。