LWIP_簡記(1.不得不說一下目錄結構)

LWIP一句話記住就行:
一項工程,兩份配置,三種內存分配,四套操作API,五步初始化,六個"數據流",七個數據結構
-------------------------------------------

當然

啦不失一般性,我也會簡單講一下LWIP的目錄結構,點到爲止,畢竟一開始還是面對初學者,沒必要整有些沒的,嚇到了不好.或者一些大神原本看都看到吐了的東西,再看浪費時間,掃一眼就夠了.
我呢,全系列以最新的2.0.0及以上開始整.
小白請自覺跳轉這篇博文(https://blog.csdn.net/ZCShouCSDN/article/details/79229728).
先整張圖:
lwip源碼
可怕不......

再來看看我準備的

LWIP-2.0.3
│ CHANGELOG // 版本更新記錄,從中可以看到 LwIP 不同版本的變化
│ COPYING // 版權說明
│ FILES // 其中說明了其所在目錄下的各目錄或文件的用途。在不同的目錄下會有不同的該文件
│ README // 簡介文檔
│ UPGRADING // 版本升級後可能出現不兼容,該文檔記錄了從老版本升級需要修改的地方.
├─doc //lwip自帶的文檔,其實沒有同步更新,看一遍瞭解一下吧!API的介紹直接看前文的連接
├─src /* 源碼文件部分,核心協議實現.
│ ├─apps  //上層應用,包括sntp,tftp,snmp,dns…
│ ├─core  //核心源碼,ipv4,ipv6,tcp,udp…
│ ├─include //頭文件
│ └─netif  //這個比較特殊,底層接口處理,可以簡單的理解爲網卡的處理
└─test // 一些協議棧內核測試程序.個人覺得還是很有用的,特別是做項目的夥伴驅動依賴與他人時,可以先驗證協議棧的通路.(迴環測試)

無外乎就是一個通用項目開發的結構嘛,版本記錄,說明文檔,源碼,頭文件,測試用例.
這樣理解簡單多了,何必一開始就整那麼複雜呢.
當然啦,複雜的,我也整了個思維盜圖,感興趣的也可以看看.
https://naotu.baidu.com/file/6756b868489653b468f0e7525caaedf1  //LWIP源碼結構
百度腦圖,因爲免費,線上操作,哈哈.

**

雖然

**簡單,但還是要說幾點重要的:此刻需要記筆記,看不懂沒關係,有個基本概念就行,後面當然肯定必須會再次並且多次講到.

LWIP一句話記住就行:
一項工程,兩份配置,三種內存分配,四套操作API,五步初始化,六個"數據流",七個數據結構
1.一項工程,就不用多說了,就是基本套路,上面介紹目錄結構時提到的.

版本記錄,說明文檔,源碼,頭文件,測試用例.

2.兩份配置

opt.h和lwipopts.h,這個也很好理解,一般來說做開發的都清楚,不要動第三方的源碼,所以爲了保持
lwIP TCP/IP協議棧中源碼的獨立性,一般不會直接更改原生的opt.h ,而是會單獨添加一個用戶自定義的文件來表明用戶自己的配置,即 lwipopts.h 。
**相同配置以lwipopts.h爲準,差異配置各盡其用.**

3.三種內存分配

                |C庫自帶內存分配策略(malloc/free/realloc)
LWIP內存分配機制  |動態內存堆(Heap)分配策略
                |動態內存池(pool)分配策略
不懂不要緊,其實我也不懂,內存的確是一塊比較難啃的骨頭,慢慢來.

4.四套操作API

          |calback-style,簡單稱原始API,簡記RAW/Native API.(**無操作系統時唯一可用的API**)
LWIP API  |                                  |Netconn API
          |sequential-style,底層封裝API,又細分爲|NETIF API
                                             |Socket API
這個好像也有點兒複雜,等後面具體再分析吧.

5.五步初始化

這裏主要是指在使用lwip的過程中一般的初始化調用流程:
xxx_init(網絡驅動,一般由具體廠商弄,比如BCM,RTL,AW...)
tcpip_init(lwip的初始化流程了)
lwip_init(就是一些通用協議,內存,網卡的初始化調用)
netif_init(網卡的初始化,同上步還有很多同級的初始化操作,具體後面再看)
ethernetif_init(底層硬件初始化,上面的netif可以理解爲抽象的網卡,後面細聊)

***當然這裏也是爲了方便大家記憶,有點兒牽強的提取了這五步初始化.特別是第三步lwip_init()東西可多了.***

6.六個"數據流"

這裏是爲了理解數據流向,記下最重要的幾個收發API.
以TCP爲例:
tcp_input()                           tcp_output()
ipv4_input()                          ipv4_output()
ethernetif_input()<------------------->ethernetif_output()

當然也不是很詳細,比如期間還要arp的啊,netif的啊,乃至最底層low_level_input/output()...

7.七個數據結構

這裏也是強行爲了好記憶,其實重要的數據結構遠不止七個,姑且先這樣吧.以下的都是結構體:
netif--->ethernetif   抽象網卡到底層硬件描述
ip4/6_addr_t--->eth_hdr  ip地址到mac地址
dhcp            dhcp數據
tcp/udp_pcb        tcp/udp控制塊
**pbuf            最最重要的整個協議棧的數據包**

最後談談我的學習習慣

學習嘛一貫作風:

第一遍怎麼簡單怎麼來,會用就行.
第二遍怎麼複雜怎麼來,爲什麼這麼用.
第三遍想怎麼來就怎麼來,形成自己的裝在腦中.

-------------------------------------------
這期就到這裏了,LWIP想怎麼玩就怎麼玩,我們下期再見.

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