lwip内存池

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_SIZE + MEMP_ALIGN_SIZE(size))));

LWIP_MEMPOOL_DECLARE_STATS_INSTANCE(memp_stats
## name)

static struct memp *memp_tab_ ## name;

const struct memp_desc memp_ ## name = {
DECLARE_LWIP_MEMPOOL_DESC(desc)
LWIP_MEMPOOL_DECLARE_STATS_REFERENCE(memp_stats_ ## name)
LWIP_MEM_ALIGN_SIZE(size),
(num),
memp_memory_ ## name ## base,
&memp_tab
## name
};

#define LWIP_MEMPOOL(name,num,size,desc) LWIP_MEMPOOL_DECLARE(name,num,size,desc)
#include “lwip/priv/memp_std.h”

以上在memp.c 声明了各种内存池 每种内存池有num个内存池 基地址由描述符base记录。所以在编译时内存已经分配好了就是全局变量。

const struct memp_desc *const memp_pools[MEMP_MAX] = {
#define LWIP_MEMPOOL(name,num,size,desc) &memp_ ## name,
#include “lwip/priv/memp_std.h”
};
将各种内存池的描述符地址组成数组。

/** Memory pool descriptor */

struct memp_desc {
#if defined(LWIP_DEBUG) || MEMP_OVERFLOW_CHECK || LWIP_STATS_DISPLAY
/** Textual description /
const char desc;
/
Element size */
u16_t size;

#if !MEMP_MEM_MALLOC
/** Number of elements */
u16_t num;

/** Base address */
u8_t *base;

/** First free element of each pool. Elements form a linked list. */
struct memp **tab;/指向此类空闲内存池的链表头
#endif /
MEMP_MEM_MALLOC */
};

/**

  • Initialize custom memory pool.
  • Related functions: memp_malloc_pool, memp_free_pool
  • @param desc pool to initialize
    */
    void
    memp_init_pool(const struct memp_desc *desc)
    {
    int i;
    struct memp *memp;

*desc->tab = NULL;
memp = (struct memp )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
/
create a linked list of memp elements */
for (i = 0; i < desc->num; ++i) {
memp->next = *desc->tab;
*desc->tab = memp;

/* cast through void* to get rid of alignment warnings */
memp = (struct memp *)(void *)((u8_t *)memp + MEMP_SIZE + desc->size  );

}

}
memp_init_pool将已经分配好的内存池空间 一共num个初始化成链表。
如上分配好的内存被初始化为链表 链表尾的next指针指向NULL
如上分配好的内存被初始化为链表 链表尾的next指针指向NULL。
分配出去的pool从链表移除,并将tab指向重新空闲的链表头。
free pool的时候将其重新加入链表头。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值