目录
1. 简介
在lwIP 协议栈简介可知,lwIP 协议栈可以根据需要来裁剪配置,具体裁剪配置就体现在其选项配置文件上,即 opt.h。
为了保持lwIP TCP/IP协议栈中源码的独立性,一般不会直接更改 opt.h ,而是会单独添加一个用户自定义的文件来表明用户自己的配置,即 lwipopts.h 。上述这种,不破坏源文件,而根据用户单独定义文件的方式在lwIP应用中也多次用到。
在lwIP 的 例程中,或应用中,都可以发现lwipopts.h文件,此文件已经约定俗成,故此用户自定义配置就在此处。
lwipopts.h 的参考文件可以去官方例程中获取参考裁剪,当然获取途径不拘泥于此。
2. 配置 opt.h 说明
2.1 基础配置(Infrastructure)
-
NO_SYS
/*
NO_SYS == 1: 无操作系统,无法使用线程安全相关API,只能使用callback-style raw API
须要注意不能一次从多个上下文访问lwIP函数/结构
NO_SYS == 0: 有操作系统
*/
#define NO_SYS 0
-
Timers
/*
LWIP_TIMEERS == 0: 删除对sys_timeout和lwip内部循环定时器的支持。
(仍提供lwip内部循环定时器数组)
(检查NO_SYS_NO_TIMERS是否与旧版本兼容)
*/
#define LWIP_TIMERS 1
/*
LWIP_TIMERS_CUSTOM == 1: 提供自定义的定时器实现,timeouts.h中函数原型等及以下
sys_timeouts_init(), sys_timeout(),
sys_untimeout(), sys_timeouts_mbox_fetch()
*/
#define LWIP_TIMERS_CUSTOM 0
-
memcpy
/**
* @defgroup lwip_opts_memcpy memcpy
* @ingroup lwip_opts_infrastructure
* @{
*/
/* 若实施速度比C库中包含的更快,则覆盖此项 */
#define MEMCPY(dst, src, len) memcpy(dst,src,len)
/* 谨慎覆盖! 如果长度在编译时已知且很小,则某些编译器(例如gcc)可以内联对memcpy()的调用 */
#define SMEMCPY(dst, src, len) memcpy(dst,src,len)
/* 若实施速度比C库中包含的更快,则覆盖此项。 lwIP仅在启用IPv6分段支持时才使用MEMMOVE。 */
#define MEMMOVE(dst, src, len) memmove(dst,src,len)
/* 采用默认配置 */
-
Core locking and MPU
/*
----------- Core locking -----------
*/
/*
MPU(内存保护单元) 兼容:
启用特殊的内存管理机制,通过不将堆栈指针传递给其他线程,使lwip能够在MPU系统上工作
(这会降低性能,因为内存是从池中分配而不是将其保留在堆栈中)
*/
#define LWIP_MPU_COMPATIBLE 0
/*
创建在TCPIP线程操作期间保留的全局互斥锁。
可以通过客户端代码锁定以执行lwIP操作,而无需使用回调更改为TCPIP线程。
请参阅LOCK_TCPIP_CORE()和UNLOCK_TCPIP_CORE()。
您的系统应提供支持优先级倒置的互斥锁以使用它
*/
#define LWIP_TCPIP_CORE_LOCKING 1
/*
LWIP_TCPIP_CORE_LOCKING == 1
使得tcpip_input()也可以获取输入数据包的互斥锁,而不是分配消息并将其传递给tcpip_thread
注意:从中断上下文调用tcpip_input()时,这不起作用!
*/
#define LWIP_TCPIP_CORE_LOCKING_INPUT 0
/*
SYS_LIGHTWEIGHT_PROT == 1
在缓冲区分配,释放和内存分配以及解除分配期间,为某些关键区域启用任务间保护(和任务与中断保护)。
注意:从多个上下文中使用lwIP时需要这样做! 如果你禁用它,你必须确定你在做什么! */
#define SYS_LIGHTWEIGHT_PROT 1
/*
宏/函数,用于检查当前函数调用期间是否满足lwIP的线程/锁定要求。
此宏通常调用在依赖于OS的sys层中实现的函数,并执行以下检查:
不在ISR中(这也应该检查NO_SYS == 1!)
如果LWIP_TCPIP_CORE_LOCKING = 1:保持TCPIP核心锁定
如果LWIP_TCPIP_CORE_LOCKING = 0:从TCPIP线程调用函数
*/
#define LWIP_ASSERT_CORE_LOCKED()
/*
在lwIP TCPIP线程中首次调用。 可以与LWIP_ASSERT_CORE_LOCKED一起使用来检查内核锁定。
实际标识 TCPIP线程的句柄
*/
#define LWIP_MARK_TCPIP_THREAD()
-
Heap and memory pools
/*
---------- Memory options ----------
*/
/*
内存堆(heap)分配策略
MEM_LIBC_MALLOC==1: 使用C库提供的malloc / free / realloc而不是lwip内部分配器。
一般情况,C库的分配策略碎片化比较严重,不适用于嵌入式
*/
#define MEM_LIBC_MALLOC 0
/*
内存池分配策略(是否用内存堆分配策略实现内存池分配)
MEMP_MEM_MALLOC == 1:使用mem_malloc/mem_free而不是lwip内存池分配器。
(堆分配可能比池分配慢得多)
与MEM_USE_POOLS只能选择其一
*/
#define MEMP_MEM_MALLOC 0
/*
MEMP_MEM_INIT == 1:
强制使用memset初始化池内存。 如果池在未初始化的内存部分中移动,则很有用。
这将确保pcbs结构中的默认值在所有条件下都能很好地初始化。
*/
#define MEMP_MEM_INIT 0
/* 字节对齐*/
#define MEM_ALIGNMENT 4
/*
MEM_SIZE:堆内存的大小。 如果应用程序将发送大量需要复制的数据,则应将其设置为高。
*/
#define MEM_SIZE 1600
/*
内存池溢出检查
0: 不检查
1: 释放时检查
2:调用memp_malloc() or memp_free() 检查,有用,但很慢
*/
#define MEMP_OVERFLOW_CHECK 0
/*
内存池健全性检查
MEMP_SANITY_CHECK == 1:在每个memp_free()之后运行一次健全性检查,以确保链表中没有循环。
*/
#define MEMP_SANITY_CHECK 0
/*
堆内存溢出检查
0: 不检查
1: 释放时检查
2:调用mem_malloc() or mem_free() 检查,有用,但很慢
*/
#define MEM_OVERFLOW_CHECK 0
/* 堆内存健全性检查 */
#define MEM_SANITY_CHECK 0
/*
内存堆分配策略(是否用内存池分配策略实现内存堆分配)
MEM_USE_POOLS==1: 使用内存池方式,还必须启用MEMP_USE_CUSTOM_POOLS。
与MEMP_MEM_MALLOC只能选择其一
*/
#define MEM_USE_POOLS 0
/*
MEM_USE_POOLS_TRY_BIGGER_POOL== 1:
如果一个malloc_pool为空,请尝试下一个更大的池 -
警告:这个可能的废物存储器,但它可以使系统更可靠。
*/
#define MEM_USE_POOLS_TRY_BIGGER_POOL 0
/*
MEMP_USE_CUSTOM_POOLS== 1:
是否包含用户文件lwippools.h,该文件定义了lwIP所需的“标准”之外的其他池。
如果将其设置为1,则必须在包含路径中的某个位置使用lwippools.h。
*/
#define MEMP_USE_CUSTOM_POOLS 0
/*
其他上下文释放内存
*/
#define LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 0
参考该博主文章:
https://blog.csdn.net/ZCShouCSDN/article/details/80282907
-
Internal memory pools
/*
协议包缓存数量 PBUF(Packet buffers)
(用于PBUF_ROM和PBUF_REF)。 如果应用程序从ROM(或其他静态存储器)发送大量数据,则应将其设置为高。
*/
#define MEMP_NUM_PBUF 16
/*
Raw 协议控制块数量(需LWIP_RAW选项)
*/
#define MEMP_NUM_RAW_PCB 4
/* UDP协议控制块的数量。 每个活动UDP“连接”一个。 (需LWIP_UDP选项)*/
#define MEMP_NUM_UDP_PCB 4
/* 并发的TCP连接数。 (需要LWIP_TCP选项) */
#define MEMP_NUM_TCP_PCB 5
/* 侦听TCP连接的数量。 (需要LWIP_TCP选项) */
#define MEMP_NUM_TCP_PCB_LISTEN 8
/* 同时排队的TCP段的数量。 (需要LWIP_TCP选项