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想怎麼玩就怎麼玩,我們下期再見.

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