LwIP協議棧開發嵌入式網絡的三種方法分析
摘要 輕量級的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協議棧
LwIP協議是瑞士計算機科學院的Adam Dunkels等開發的一套用於嵌入式系統的開放源代碼TCP/IP協議棧。LwIP含義是light weight(輕型)IP協議,在實現時保持了TCP協議的主要功能基礎上減少對RAM的占用,一般它只需要幾十K的RAM和40K左右的ROM就可以運行,這使LwIP協議棧很適合在低端嵌入式系統中使用。
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.241、端口80。在自己編寫的數據接收函數中,利用兩個字符型數據分別保存HTTP1.0響應消息的相關信息和要在客戶端網頁中顯示的信息。偵聽到客戶端連接后,判斷接收到數據的前5個字節,解析HTTP報頭,如果請求方不是GET請求就中斷連接,否則將那兩個字符型數據的內容一次傳送給客戶端。在客戶端PC機瀏覽器的地址欄中輸入http://192.168.1.241/后,PC的顯示結果如圖5所示。
圖5 開發板web服務器驗證圖
