LwIP協議棧開發嵌入式網絡的三種方法分析web
摘要 輕量級的TCP/IP協議棧LwIP,提供了三種應用程序設計方法,且很容易被移植到多任務的操做系統中。本文結合μC/OS-II這一實時操做系統,以創建TCP服務器端通訊爲例,分析三種方法以及之間的關係,着重介紹基於raw API的應用程序設計。最後在ST公司STM32F107微處理器平臺上驗證,並給出了測試結果。編程
關鍵詞 LwIP協議棧;μC/OS-II;嵌入式網絡;STM32F107;瀏覽器
隨着嵌入式系統功能的多樣化以及網絡在各個領域的中的普遍應用,具有網絡功能的嵌入式設備擁有更高的使用價值和更強的通用性。然而大部分嵌入式設備使用經濟型處理器,受內存和速度限制,資源有限,不須要也不可能完整實現全部的TCP/IP協議,有時只須要知足實際需求就行。LwIP是由瑞典計算機科學研究院開發的輕量型TCP/IP協議棧,其特色是保持了以太網的基本功能,經過優化減小了對存儲資源的佔用。LwIP是免費、開源的,任何人可使用,可以在裸機的環境下運行,固然設計的時候也考慮了未來的移植問題,能夠很容易移植到多任務操做系統中。本文介紹了以ARM微處理器STM32F107和PHY接口DP83848爲平臺,構建的嵌入式系統中,採用LwIP和嵌入式操做系統μC/OS-II,使用協議棧提供的三種應用程序接口,實現嵌入式設備的網絡通訊功能。服務器
1 LwIP和μC/OS-II介紹網絡
1.1 LwIP協議棧socket
LwIP協議是瑞士計算機科學院的Adam Dunkels等開發的一套用於嵌入式系統的開放源代碼TCP/IP協議棧。LwIP含義是light weight(輕型)IP協議,在實現時保持了TCP協議的主要功能基礎上減小對RAM的佔用,通常它只須要幾十K的RAM和40K左右的ROM就能夠運行,這使LwIP協議棧很適合在低端嵌入式系統中使用。tcp
LwIP協議棧的設計才用分層結構的思想,每個協議都做爲一個模塊來實現,提供一些與其它協議的接口函數。全部的TCP/IP協議棧都在一個進程當中,這樣TCP/IP協議棧就和操做系統內核分開了。而應用程序既能夠是單獨的進程也能夠駐留在TCP/IP進程中,它們之間利用ICP機制進行通信。若是應用程序是單獨的線程能夠經過操做系統的郵箱、消息隊列等,與協議棧進程通信。若是應用程序駐留在協議棧進程中,則應用程序能夠經過內部回調函數和協議棧進程通信。函數
1.2 μC/OS-II實時操做系統測試
μC/OS-II是一個源碼公開、可移植、可固化、可裁剪及佔先式的實時多任務操做系統,是專門爲嵌入式應用設計的實時操做系統內核,已普遍的應用在各類嵌入式系統中。優化
μC/OS-II是多任務系統,內核負責管理各個任務,每一個任務都有其優先級,μC/OS-II最多能夠管理64個任務,其每一個任務都擁有本身獨立的堆棧。μC/OS-II提供了很是豐富的系統服務功能,好比信號量、消息郵箱、消息隊列、事件標誌、內存管理和時間管理等,這些功能能夠幫助用戶實現很是複雜的應用。
1.3 LwIP協議棧移植到μC/OS-II
LwIP協議棧在設計的時候就考慮到了未來的移植問題,所以把全部與硬件、操做系統、編譯器有關的部分都所有獨立起來,造成了一個操做系統模擬層。操做系統模擬層用進程間的信號量、郵箱機制處理通訊問題,而μC/OS-II是一個基於任務調度的嵌入式實時操做系統,所以移植LwIP協議棧到μC/OS-II,是很容易實現的。
2 LwIP開發嵌入式網絡應用程序
LwIP提供了三種應用程序接口:
(1) 低水平的,基於內核/回調函數的API(後面稱 RAW API)
(2) 高水平的,連續的API(後面稱LwIP API)
(3) BSD風格的套接字API(後面稱BSD socket)
能夠在協議棧中經過對宏定義的不一樣配置,來決定使用哪一種方式。其中BSD socket方式不是很成熟,RAW API須要編寫回調函數,協議棧推薦使用LwIP API這種方式,可是三種方式到了底層都是經過回調函數實現的。本文直接從RAW API入手,以創建TCP服務器端通訊爲例,詳述底層的調用,而後再講述後面的兩種是如何封裝而成的。
2.1基於RAW API的應用程序設計步驟
使用RAW API進行TCP/IP編程,可使應用程序的代碼和協議棧的代碼很好地結合起來。程序的執行機制是以回調函數爲基礎的事件驅動的,同時回調函數也是被TCP/IP代碼直接調用的,回調函數、數據發送函數都須要本身編寫。這種方式是惟一的一種支持設備裸機運行,又能夠完成網絡通訊完成系統功能。裸機運行實際至關因而一個線程,而協議棧代碼和應用程序代碼經過前後次序處理,完成數據流轉。
圖1是使用RAW API方式,多任務系統實現TCP服務器端通訊的步驟。
圖1 RAW API方式應用程序設計
LwIP協議棧中的tcp塊結構有兩種TCP_PCB和TCP_PCB_LISTEN,前者在內存池中的默認個數是5,後者是8,其中listen型的結構佔用少許的內存,專門用於處理在偵聽狀態的tcp塊結構。tcp_listen函數中,釋放tcp_new建立的塊結構,而是返回一個listen型的tcp塊結構。客戶端鏈接,到達TCP層,在tcp_listen_input函數中,從新建立一個TCP_PCB塊結構,專門用於和客戶端通訊。偵聽到客戶端鏈接,完成三次握手後,回調本身編寫的接收函數,而後將全局的指針指向與客戶端通訊的塊結構,在數據發送時,使用這個指針,就是在用這個塊結構與客戶端通訊。
由上面看出,這種方式最大的特色是減小了任務之間的切換,只要數據來到協議棧線程,經過回調的方式就能夠完成數據的處理。
2.2 基於LwIP API的應用程序設計
LwIP API方式的編程,是基於上面的RAW API的,封裝了一個netconn的結構,全部操做不在針對TCP塊結構,而變成了netconn型的結構變量。操做都須要協議棧去處理,應用程序與協議棧通訊,經過發送消息方式進行,所以這種方式會形成頻繁的任務切換,速度相比RAW API慢了許多,使用步驟如圖2所示。
圖2 LwIP API方式應用程序設計
2.3 基於BSD socket的應用程序設計
BSD socket至關於對LwIP API作了一層封裝,而netconn結構有一個變量是socket,這樣二者很容易結合起來。Socket方式很容易被理解,編寫應用程序也較爲容易,可是效率低,消耗的資源更多,使用步驟如
圖3 BSD socket方式應用程序設計
3 實際應用與驗證
本次驗證中使用的開發板,微處理器採用ST公司推出的STM32F107,以太網PHY芯片採用DP83848.STM32F107是一款基於ARM Cortex-M3內核的32位處理器,是面向網絡互連型應用的,最大工做頻率爲72MHz,內置了MAC控制器,能夠方便地與以太網PHY芯片鏈接,構成以太網接口。以太網PHY芯片DP83848採用RMII模式與STM32F107鏈接。RMII模式能夠減小接口之間的引腳鏈接,下降了繪製電路板的複雜性,同時空閒的引腳可用做其它用途,以太網接口如圖4所示。
圖4 STM32F107 MAC與DP83848鏈接圖
在開發板上,移植好LwIP協議棧和μC/OS-II操做系統,應用程序中建立一個Web服務器,綁定本地IP地址192.168.1.24一、端口80。在本身編寫的數據接收函數中,利用兩個字符型數據分別保存HTTP1.0響應消息的相關信息和要在客戶端網頁中顯示的信息。偵聽到客戶端鏈接後,判斷接收到數據的前5個字節,解析HTTP報頭,若是請求方不是GET請求就中斷鏈接,不然將那兩個字符型數據的內容一次傳送給客戶端。在客戶端PC機瀏覽器的地址欄中輸入http://192.168.1.241/後,PC的顯示結果如圖5所示。
圖5 開發板web服務器驗證圖