LWIP_简记(2.谈谈具体的配置)

LWIP一句话记住就行:
一项工程,两份配置,三种内存分配,四套操作API,五步初始化,六个"数据流",七个数据结构
-------------------------------------------

上一

篇已经提到了一项工程,粗略的介绍了大纲,以及两份配置,其实要真正弄懂LWIP,还真没那么简单,讲到配置,拿东西可多了,什么协议,TCP,UDP,PPP,IP,ICMP,IGMP…各种xxP,还有各种mem,南瘦香菇.

如果你以为我这里会把所有配置列出来一通分析,那你就大错特错了.
重复造车轮子干嘛.
直接来看:
https://blog.csdn.net/XieWinter/article/details/97885549 //opt.h lwipopts.h
https://blog.csdn.net/XieWinter/article/details/98217525 //perf.h cc.h
非常详细实用,必须给大佬点赞.

虽然我自己不分析,但是我不得不说这很重要,这很重要,这很重要.是后续理解并用好lwip的前提.

所以呢,按照我总结的习惯,还是有几点要拿出来说的:
为了方便记忆和理解,我呢把它分为五大块,基础配置,协议配置(也可以理解为功能配置),API配置,数据结构配置,DEBUG配置.
基础配置

NO_SYS
**Timers**
**memcpy**
Core locking and MPU
Heap and memory pools
Internal memory pools
SNMP MIB2 callbacks
Multicast(组播)
**Threading**
Checksum
Hooks(钩子选项)

一些顾名思义的就不重复讲了,这我强调三个:定时器,内存,线程.
因为后续在分析代码时大家经常会看到的就是超时处理,所以定时器十分重要的.
简单的理解就是用lwip自带的,还是自定义.

/*
    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

而内存更重要,显然三言两语扯不清楚,需要反复的去啃.
https://blog.csdn.net/ZCShouCSDN/article/details/80282907  //反复认真看

线程的话也需要拿出来,因为一般使用LWIP都是在嵌入式系统,一些RTOS中,类似,RTThread,FreeRtos,UCos,NUTTY...(关于这些操作系统,建议大家也去了解一下,因为跟着一个操作系统来学习lwip,理解会更透彻)
我这里直接引用某博主的.

/* TCPIP 主线程名称 /
#define TCPIP_THREAD_NAME “tcpip_thread” /
TCPIP 主线程 栈大小 /
#define TCPIP_THREAD_STACKSIZE 0 /
TCPIP 主线程 优先级 /
#define TCPIP_THREAD_PRIO 1 /
TCPIP 主线程消息的邮箱大小 /
#define TCPIP_MBOX_SIZE 0 /
TCPIP 将其定义为触发监视程序的内容。 /
#define LWIP_TCPIP_THREAD_ALIVE() /
SLIPIF 线程名称 /
#define SLIPIF_THREAD_NAME “slipif_loop” /
SLIPIF 线程 栈大小 /
#define SLIPIF_THREAD_STACKSIZE 0 /
SLIPIF 线程 优先级 /
#define SLIPIF_THREAD_PRIO 1 /
默认 线程名称 /
#define DEFAULT_THREAD_NAME “lwIP” /
默认 线程 栈大小 /
#define DEFAULT_THREAD_STACKSIZE 0 /
默认 线程 优先级 /
#define DEFAULT_THREAD_PRIO 1 /
默认 NETCONN_RAW传入数据包的邮箱大小。 /
#define DEFAULT_RAW_RECVMBOX_SIZE 0 /
默认 NETCONN_UDP传入数据包的邮箱大小。 /
#define DEFAULT_UDP_RECVMBOX_SIZE 0 /
默认 NETCONN_TCP传入数据包的邮箱大小。 /
#define DEFAULT_TCP_RECVMBOX_SIZE 0 /
默认 传入连接的邮箱大小 */
#define DEFAULT_ACCEPTMBOX_SIZE 0

协议配置

IPv4
ARP
IP
ICMP
DHCP
AUTOIP
IGMP
...

不多说,总结一点,要用什么就开什么,开启方法小白都知道:
#define LWIP_xxx 1

API配置
这个很有意思,比如RAW,SOCKET…
也就是我们经常会用到的一些函数,再详细的举个例子就是套接字的创建,绑定,发送,接收,关闭.
详细的可以看我的另一个系列.
https://blog.csdn.net/weixin_37571125/article/details/104820796  //LWIP_socket

数据结构配置

PBUF
NETIF
IPV4
IPv6
Netconn
Sockets
...

没什么可讲的,看推荐的博文吧.

Debug配置

Assertion handling(断言检查)
Statistics(状态信息)
Debug messages(调试信息)
Performance(性能测试)

这个就很重要了,毕竟在开发调试的过程中不要只会自己添加一大推printf.
lwip自带的一些DEBUG功能就很详细了,打开有助于分析数据流向,缩小BUG再那一层.
就是下面这些东东.

/* 调试信息配置 */
#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_ALL
#define LWIP_DBG_TYPES_ON LWIP_DBG_ON
#define ETHARP_DEBUG LWIP_DBG_OFF
#define NETIF_DEBUG LWIP_DBG_OFF
#define PBUF_DEBUG LWIP_DBG_OFF
#define API_LIB_DEBUG LWIP_DBG_OFF
#define API_MSG_DEBUG LWIP_DBG_OFF
#define SOCKETS_DEBUG LWIP_DBG_OFF
#define ICMP_DEBUG LWIP_DBG_OFF
#define IGMP_DEBUG LWIP_DBG_OFF
#define INET_DEBUG LWIP_DBG_OFF
#define IP_DEBUG LWIP_DBG_OFF
#define IP_REASS_DEBUG LWIP_DBG_OFF
#define RAW_DEBUG LWIP_DBG_OFF
#define MEM_DEBUG LWIP_DBG_OFF
#define MEMP_DEBUG LWIP_DBG_OFF
#define SYS_DEBUG LWIP_DBG_OFF
#define TIMERS_DEBUG LWIP_DBG_OFF
#define TCP_DEBUG LWIP_DBG_OFF
#define TCP_INPUT_DEBUG LWIP_DBG_OFF
#define TCP_FR_DEBUG LWIP_DBG_OFF
#define TCP_RTO_DEBUG LWIP_DBG_OFF
#define TCP_CWND_DEBUG LWIP_DBG_OFF
#define TCP_WND_DEBUG LWIP_DBG_OFF
#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF
#define TCP_RST_DEBUG LWIP_DBG_OFF
#define TCP_QLEN_DEBUG LWIP_DBG_OFF
#define UDP_DEBUG LWIP_DBG_OFF
#define TCPIP_DEBUG LWIP_DBG_OFF
#define SLIP_DEBUG LWIP_DBG_OFF
#define DHCP_DEBUG LWIP_DBG_OFF
#define AUTOIP_DEBUG LWIP_DBG_OFF
#define DNS_DEBUG LWIP_DBG_OFF
#define IP6_DEBUG LWIP_DBG_OFF
#define DHCP6_DEBUG LWIP_DBG_OFF

说到这里再给大家一个建议,学习时就大胆去把这些打印打开吧.别担心打印太多,只有多了你才能更好的去跟代码,理清流程和逻辑,特别是PBUF的传递.单凭自己去逐行分析代码,吃力不讨好.

其实关于配置还有两个perf.h和cc.h,大家看看我推荐的博文,了解一下就行了,而且perf.h非必须,cc.h纯自定义,个人觉得没必要去纠结.
-------------------------------------------
这期就到这里了,LWIP想怎么玩就怎么玩,我们下期再见.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章