LwIP 内存配置
前言
LwIP 在 lwipopts.h 和 opt.h 头文件中提供了多个配置选项。用户可以根据不同的性能需求和不同应用的内存限制对协议栈用
到的内存配置进行调节。Opt.h 头文件中包括协议使能和设置,内存设置,调试选项等等。而 Lwipopts.h 头文件中集合了
opt.h 中一些常常需要改动的部分。一般情况下用户对 lwipopts.h 头文件进行修改就可以了。不管是对 lwipopts.h 还是 opt.h
进行修改,都必须保证是在已经对你所改动的内容足够的了解的情况下进行,所做的改动是正确的,否则有可能导致协议栈
不能正常工作,或者效率低下。
LwIP 的内存管理机制
在进行内存配置之前,我们有必要先了解 LwIP 的内存管理机制。
Lwip 动态内存管理
LwIP 中可以使用两种动态内存分配的方法:Heap 和 Pool 的方式。
Heap 的方式,每次都根据你实际需要的大小分配一块内存出来用,用完以后再还回去。
Pool 的方式则是,预先将内存等分成若干份,每次分配时都拿出其中的一块或几块来。假设每等份是 256bytes,而你需要
300bytes 的内存空间,Pool 的方式就会给你分配两个 256bytes 的内存块(一共 512bytes)。虽然有点浪费,但这种方式分
配内存速度很快,非常适合在接收数据时使用。
对于 Heap 的方式,程序默认是使用 LwIP 提供的 mem_malloc/mem_free 进行内存的分配和释放。这种方式下,程序需要预
先分配一段内存空间用来做 heap 分配,这段预留的空间大小通过 MEM_SIZE 定义。
你也可以通过 C 标准库里的 malloc/free 函数进行内存的分配和释放。需要定义宏 MEM_LIBC_MALLOC。
Pbuf 类型
前面说的 Heap 和 Pool 都是 LwIP 动态分配内存的方式。而 LwIP 采用了 pbuf 的形式管理内存中的信息,pbuf 结构既支持动
态内存分配保存信息包内容,也支持让信息包数据驻留在静态存储区。pbufs 可以在一个链表中链接在一起,被称作一个
pbuf 链,这样一个信息包可以跨越几个 pbufs。
LwIP 有三种类型的 pbuf: PBUF_RAM, PBUF_ROM,PBUF_POOL。这三种类型拥有不同的使用目的。
PBUF_RAM 类型的 pbuf 用于应用程序发送的数据被动态生成的情况。在这种情况下,pbuf 系统不仅为应用数据分配内
存,还要给为这些数据预置的包头分配内存。包头大小在编译时是可配置的。MEM_SIZE 定义定义了这类 pbuf 的可用空
间大小。
PBUF_ROM 类型的 pbuf 用于应用程序要发送的数据放置在应用程序管理的存储区的情况。
PBUF_POOL 主要用于网络设备驱动层,因为分配一个 pbuf 的操作可以快速完成,所以非常适合用于中断处理。