lwip 1. 协议栈内存分配

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;
};
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值