修改默认选项时,不要修改opt.h文件,通过lwipopts.h修改。
和内存管理以及TCP发送性能相关的选项
// 为1时使用系统库malloc/free进行内存管理 #ifndef MEM_LIBC_MALLOC #define MEM_LIBC_MALLOC 0 #endif
// 使用mem_malloc/mem_free替代pool内存池管理 // lwip支持使用内存池来管理一些需要经常分配/释放的数据结构 // 例如pcb // 将下面选项置1禁用该特性 // 一般和MEM_LIBC_MALLOC选项一道使用 // 使得所有内存分配都通过系统库进行 #ifndef MEMP_MEM_MALLOC #define MEMP_MEM_MALLOC 0 #endif
// 使用内存池而不是malloc来分配一般性内存 // 此选项需要和MEMP_USE_CUSTOM_POOLS一起使用 #ifndef MEM_USE_POOLS #define MEM_USE_POOLS 0 #endif
// 用于PBUF_ROM和PBUF_REF的pbuf结构数量 // 如果程序主要使用零拷贝方式发送大量数据 // 需要较大数量的该结构 #ifndef MEMP_NUM_PBUF #define MEMP_NUM_PBUF 16 #endif
// PBUF内存池(PBUF_POOL类型的PBUF)中的PBUF数量 #ifndef PBUF_POOL_SIZE #define PBUF_POOL_SIZE 16 #endif
// TCP发送缓冲区大小(已发出但还未收到ACK的最大允许数据量) // 只是设定大小,并不实际分配内存 // 如果你的程序需要发送大量零拷贝数据 // 可以将这个值设大一些
// (因为零拷贝数据“总是在那里”,不占LwIP动态内存)
// 最小不应小于单次调用tcp_write时可能发送的最大数据量
// 调用tcp_write时的参数len若大于tpcb->snd_buf将导致返回ERR_MEM
// (在LwIP代码中,每成功执行一次tcp_write相应减小tpcb->snd_buf,
// 每收到一次ACK相应增加tpcb->snd_buf)
// 考虑到一般系统“隔一个确认”的原则,
// 一般设置为TCP_MSS的2倍或更大的值。 #ifndef TCP_SND_BUF #define TCP_SND_BUF (2 * TCP_MSS) #endif
// MEM_SIZE是一般意义上的动态内存大小 // 如果程序需要进行较大量的拷贝数据发送 // 则需要较大数量的该内存 // 因为所有的拷贝发送数据都需要复制到 // 这种“一般意义”的动态内存中
// PBUF_RAM类型的PBUF即从中分配 #ifndef MEM_SIZE #define MEM_SIZE 1600 #endif
// PBUF内存池中的每个PBUF大小 // 默认值是能放下一个完整的TCP包(包括下层协议头)
// 如果你能确定很少接收全长TCP包,可以使用小一点的值 #ifndef PBUF_POOL_BUFSIZE #define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN+4/*VLAN_TAG*/+4/*CRC*/) #endif
// 在单个pcb中排队的待发pbuf数量上限
// 不应小于 (2 * TCP_SND_BUF/TCP_MSS)
// 考虑以下几点:
// 1. 对于REF/ROM类型的数据,协议头和协议数据是分开存放的,因此每段数据需要两个PBUF
// 2. LwIP可能会将多次tcp_write中的待发数据合并到一起
// (如果每次tcp_write数据量都较小)
// 3. 需要Copy发送的数据,协议头和数据在单一PBUF里面
// 一般用默认值即可 #ifndef TCP_SND_QUEUELEN #define TCP_SND_QUEUELEN ((4 * (TCP_SND_BUF) + (TCP_MSS - 1))/(TCP_MSS)) #endif
// App层发送的超过MSS大小的数据量会被拆分为SEG // 每个SEG内数据量不超过MSS // 每个SEG可能拥有多个pbuf
// 不小于TCP_SND_QUEUELEN #ifndef MEMP_NUM_TCP_SEG #define MEMP_NUM_TCP_SEG 16 #endif