lwIP TCP/IP 协议栈笔记之二: 配置文件 opt.h & lwipopts.h 详解

本文详细介绍了 lwIP 协议栈的配置文件 opt.h 和 lwipopts.h,讲解了如何进行裁剪配置。内容包括基础配置如 NO_SYS、Timers,IPv4相关选项如 ARP、ICMP,Callback-style APIs 对于 RAW、UDP、TCP 的设置,以及 Thread-safe APIs 和 Debugging 相关选项。
摘要由CSDN通过智能技术生成

目录

1. 简介

2. 配置 opt.h 说明

2.1 基础配置(Infrastructure)

NO_SYS

Timers

memcpy

Core locking and MPU

Heap and memory pools

Internal memory pools

SNMP MIB2 callbacks

Multicast(组播)

Threading

Checksum

Hooks(钩子选项)

2.2 IPv4

ARP

IP

ICMP

DHCP

AUTOIP

IGMP

2.3 Callback-style APIs

RAW

DNS

UDP

TCP

2.4 PBUF

2.5 NETIF

2.6 IPv6

2.7 Thread-safe APIs

Netconn

Sockets

2.8 Debugging

Assertion handling(断言检查)

Statistics(状态信息)

Debug messages(调试信息)

Performance(性能测试)


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选项
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值