LWIP调试心得一----内存管理
关于LWIP协议栈内存管理,以下是本人的粗劣理解,本人能力有限,如有错误之处,虚心接受大家的批评指正;
调试环境:硬件平台stm32f429;lwip版本号:lwip-1.4.1;开发环境:keil5;
下图为图一为本人调试LWIP协议栈过程中抽象出来的简图,此图并非lwip通用结构示意图,仅供参考,下文将对此图进行详细说明;
图一:
一,协议栈内存的初始化:
在系统初始化函数lwip_init(); 中调用了 mem_init(); memp_init();这两个系统函数,完成LWIP主要的内存结构初始化的过程;首先我们来看一下这两个函数的源码:
mem_init(void)
{
struct mem *mem; //创建了一个指向mem结构体类型的指针;
LWIP_ASSERT("Sanity check alignment",
(SIZEOF_STRUCT_MEM & (MEM_ALIGNMENT-1)) == 0);
/* align the heap */
ram = (u8_t *)LWIP_MEM_ALIGN(LWIP_RAM_HEAP_POINTER); //获取内存指针,并将其按指定方式对齐,对齐模式在宏定义中#define MEM_ALIGNMENT 4配置
//#define LWIP_RAM_HEAP_POINTER ram_heap中宏定义,ram_heap指针在调用此函数之前动态申请
/* initialize the start of the heap */
mem = (struct mem *)(void *)ram; // 初始化堆空间的起始地址空间
mem->next = MEM_SIZE_ALIGNED;
mem->prev = 0;
mem->used = 0;
/* initialize the end of the heap */ //初始化堆的结束地址空间
ram_end = (struct mem *)(void *)&ram[MEM_SIZE_ALIGNED];
ram_end->used = 1;
ram_end->next = MEM_SIZE_ALIGNED;
ram_end->prev = MEM_SIZE_ALIGNED;
/* initialize the lowest-free pointer to the start of the heap */
lfree = (struct mem *)(void *)ram; //将堆空间起始地址赋值给lfree指针
MEM_STATS_AVAIL(avail, MEM_SIZE_ALIGNED);
if(sys_mutex_new(&mem_mutex) != ERR_OK) {
LWIP_ASSERT("failed to create mem_mutex", 0);
}
}
memp_init(void)
{
struct memp *memp;
u16_t i, j;
MEMP_STATS_AVAIL(used, i, 0);
MEMP_STATS_AVAIL(max, i, 0);
MEMP_STATS_AVAIL(err, i, 0);
MEMP_STATS_AVAIL(avail, i, memp_num[i]);
}
memp = (struct memp *)LWIP_MEM_ALIGN(memp_memory);
#endif /* !MEMP_SEPARATE_POOLS */
/* for every pool: */
for (i = 0; i < MEMP_MAX; ++i) {
memp_tab[i] = NULL;
#if MEMP_SEPARATE_POOLS
memp = (struct memp*)memp_bases[i];
#endif /* MEMP_SEPARATE_POOLS */
/* create a linked list of memp elements */
for (j = 0; j < memp_num[i]; ++j) {
memp->next = memp_tab[i];
memp_tab[i] = memp;
memp = (struct memp *)(void *)((u8_t *)memp + MEMP_SIZE + memp_sizes[i]
#if MEMP_OVERFLOW_CHECK
+ MEMP_SANITY_REGION_AFTER_ALIGNED
#endif
);
}
}
#if MEMP_OVERFLOW_CHECK
memp_overflow_init();
/* check everything a first time to see if it worked */
memp_overflow_check_all();
#endif /* MEMP_OVERFLOW_CHECK */
}
MEMP_STATS_AVAIL(used, i, 0);
MEMP_STATS_AVAIL(max, i, 0);
MEMP_STATS_AVAIL(err, i, 0);
MEMP_STATS_AVAIL(avail, i, memp_num[i]);
}
#define LWIP_MEMPOOL(name,num,size,desc) MEMP_##name,
#include "lwip/memp_std.h"
MEMP_MAX
}memp_t;