首页 > 编程知识 正文

lwip协议栈源码详解,内存池实现

时间:2023-05-04 20:18:25 阅读:163155 作者:1995

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,则重新添加到链表中。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。