1. LWIP内存管理有两种方案:堆(heap)和池(pool)
堆:堆内存管理机制会根据需要分配的内存大小在空闲的内存块中找到最佳拟合(best fit)的内存区域
LWIP内存堆管理API函数:
//内存堆初始化
void mem_init(void);
//内存堆分配内存
void *mem_malloc(mem_size_t size);
//内存堆释放内存
void mem_free(void *mem);
池:池内存管理机制将内存分配成多个大小不一的内存池,每个内存池中又被分为N个相同大小的内存块。 程序可根据需要使用的内存大小直接到不同的内存池中取用即可。 池内存管理机制分配内存更快,效率更高
LWIP内存池管理API函数:
//内存池初始化
void memp_init(void);
//内存池分配
void *memp_malloc(memp_t type);
//内存池释放
void memp_free(memp_t type, void *mem);
2.网络数据包管理
pbuf就是一个描述协议栈中数据包的数据结构,LWIP 中在 pbuf.c和 pubf.h实现了协议栈数据包管理的所有函数与数据结构
pbuf结构体
//在pbuf.h中定义
struct pbuf {
/** 指向下一个pbuf结构体,每个pbuf存放的数据有限,若应用有大量的数据的话
就需要多个pbuf来存放,可以将同一个数据包的pbuf连接在一起构成一个链表 */
struct pbuf *next;
/** 指向该pbuf真正的数据存储区的首地址。STM32F4内部网络模块收到数据,并
将数据提交给LWIP时,就是将数据存储在payload指定的存储区中;同样在发送数
据的时候将payload指向的存储区数据转给STM32F4的网络模块去发送 */
void *payload;
/** 在接收或发送数据的时候数据会存放在pbuf链表中,tot_Len表示当前pbuf和链
表中后面所有pbuf的数据长度,它们属于一个数据包 */
u16_t tot_len;
/** 当前pbuf总数据的长度 */
u16_t len;
/** 当前pbuf类型,共有四种:PBUF_RAM/PBUF_ROM/PBUF_REF/PBUF_POOL */
u8_t type;
/** 保留位 */
u8_t flags;
/** 该pbuf被引用的次数,当还有其他指针指向这个pbuf的时候ref字段就加一 */
u16_t ref;
};