?

lwIP在μTenux實時操作系統上的移植※

2014-08-27 08:34王磊吳海洋
單片機與嵌入式系統應用 2014年3期
關鍵詞:網絡接口緩沖區底層

王磊,吳海洋

(大連交通大學電氣信息學院,大連116028)

引 言

隨著物聯網技術的發展,普適計算理念[1]的深化和大數據處理能力的增強,更多數據將通過網絡進行集中化、智能化處理。在此背景下,對小型嵌入式設備提出了具有網絡通信能力的更高要求[2]。通過在實時操作系統上移植網絡協議棧lwIP[3],將為此類設備的研發提供具有網絡功能的操作系統支持。

lwIP是一款優秀的輕量級嵌入式網絡組件,為各領域眾多嵌入式設備提供了小容量低成本的TCP/IP 網絡協議棧。當前眾多知名半導體芯片廠商提供的軟件開發包中,都毫無例外地選用lwIP為網絡支持組件[4]。但是,不同芯片廠商的軟件開發包基于不同的操作系統,需要切換不同的嵌入式開發環境,給開發人員學習和使用帶來了額外工作量[5],延長了開發周期。μTenux作為開源免費的實時操作系統,支持ST、ATMEL、NXP、Freescale、TI等多家芯片廠商ARM Cortex-M 構架的主流芯片,應用該操作系統進行產品研發可縮短開發周期,降低商業成本[6]。

1 lwIP協議棧

lwIP(lightweight IP)是瑞士計算機科學院的Adam Dunkels設計編寫而后全世界開源貢獻者共同升級維護的開源代碼。該組件沒有嚴格地遵循TCP/IP 協議的分層思想,采用各個協議層交叉存取和內存共享的構架方式,是一個以占用盡量小的資源代價實現TCP/IP協議棧的輕量型中間件。

lwIP的主要特點如下[7]:

①實現了包括IP、ICMP、UDP、TCP、IGMP、ARP、PPPoS、PPPoE在內的諸多網絡協議;

②協議棧支持DHCP客戶端,DNS客戶端,AutoIP/APIPA(零配置網絡)和SNMP代理(私有的MIB支持);

③擁有增強功能的獨有API接口和可選的Berkeley風格的Socket API接口;

④支持多網絡接口、TCP擁塞控制、延時估計和快速恢復、快速重傳機制;

⑤包含HTTP 服務器、SNTP 客戶端、SMTP 客戶端、ping、NetBIOS域名解析器等應用示例。

從上述特點可以看出,lwIP 是一個功能全面的協議棧。同時,因為lwIP僅僅占用RAM 空間幾十KB,ROM空間40KB左右,所以該組件成為ARM 構架32位嵌入式設備中網絡中間件的首選。

1.3.2 版本的lwIP從代碼的組織結構上可分為4個層次,如圖1所示,其中netif是和底層物理環境緊密相關的網絡接口驅動部分,該部分主要實現網絡控制器初始化和數據包收發的功能。arch是lwIP 為移植設計的操作系統模擬層,移植時需要創建sys_arch.c文件,并在該文件中實現多任務,任務間消息傳遞的郵箱和信號量,同步以及超時保護等機制。core和api包含了lwIP核心代碼和應用編程接口代碼,移植時不需要修改。值得指出的是,lwIP 在沒有操作系統的支持下也可以運行,此時不需要arch組件的支持,但是lwIP只能運行在一個線程下,會降低性能。

圖1 lwIP組件結構圖

2 μTenux實時操作系統

μTenux是由T-Engine中國開源社區研發推出的適用于32位ARM Cortex-M 系列內核的嵌入式多任務硬實時操作系統。該操作系統采用可移植、可裁剪、任務可剝奪的μT-Kernel作為系統內核規范,允許開發人員在小規模嵌入式系統上進行優化和裁剪。圖2 給出了μTenux操作系統構架,其中內核μT/Kernel由三部分(μT/OS、μT/SM、μT/DS)構成[8],分別為操作系統內核、管理內核和調試內核。底層包含完整的驅動庫和標準C 庫文件,中間件和上層接口采用主流的第三方組件[6]。本文是μTenux中μT/Subass 研發的一部分,開源代碼會隨μTenux軟件包一起在T-Engine中國開源社區公布并不斷完善升級。

圖2 μTenux操作系統構架

3 移植過程

lwIP基于操作系統的移植主要分為三個方面[9]:①根據基于的CPU 構架不同,需要定義和硬件相關的數據類型與結構以及調試、測量等函數實現方法;②實現操作系統模擬層的多任務、郵箱、信號量、同步、時間超限等函數;③根據使用的網絡控制器芯片不同,以及和主控芯片通信的協議不同,需要對底層以太網驅動進行移植。結合μTenux操作系統中的對象特點,本部分對lwIP移植過程中的幾個要點進行分析。

3.1 lwIP郵箱函數的移植

當產生一次數據包處理時,lwIP 中各個協議層之間通過維護同一個數據空間來減少數據包復制帶來的RAM損耗和時間損耗,該數據包所占空間的起始地址在各個協議層之間通過郵箱機制進行傳遞。

lwIP的郵箱機制需要實現郵箱的創建、刪除、發送(堵塞函數,直到發送成功)、嘗試發送(發送后立即返回狀態)、接收(帶有定時參數,有時間限制)、嘗試接收(接收后立即返回狀態)等6 個函數。按照lwIP 的移植要求,在sys_arch.c中要實現以上函數。μTenux本身的郵箱機制對消息結構有特殊規定,本文采用消息緩沖區機制實現lwIP 的郵箱函數封裝。μTenux和其他操作系統功能上的區別可以從消息緩沖區的實現機制上得以體現。μTenux提供的相關函數有:建立和刪除消息緩沖區,發送和接收消息以及查詢消息緩沖區的狀態。

圖3是μTenux緩沖區機制消息傳遞過程的示意圖,每個消息緩沖區都包含一個等待發送消息的任務隊列和一個等待接收消息的任務隊列[9]。圖中,以兩個任務隊列各有一個任務為例,發送任務和接收任務通過動作①和②實現消息的傳遞。每當創建一個新的消息緩沖區時會產生一個連續的空間,內核通過MBFCB(消息緩沖區控制塊)進行管理,實現緩沖區的環狀消息結構。在創建、使用和釋放消息緩沖區的過程中,μT/Kernel內核始終對內存進行著最優的管理,這個過程中不會產生內存空間碎片。消息緩沖區機制可用來傳遞大小可變的消息,因為要用此機制實現lwIP的郵箱函數,所以封裝時對lwIP的消息取地址,將地址作為μTenux緩沖區的內容傳遞。

以郵箱的創建為例,可以直接對tk_cre_mbf函數進行封裝,其中maxmsz(最大消息長度)的參數為sizeof(void*),是因為郵箱傳遞的參數是數據指針,所以這里最大消息長度規定不會超過這個長度。代碼略——編者注。

圖3 μTenux的消息緩沖區機制

lwIP郵箱的其他實現函數也是對消息緩沖區相關函數的封裝,需要注意兩點,μTenux的消息緩沖區函數中與時限有關的參數和lwIP中給出的定義不同;使用μTenux消息緩沖區機制傳遞的是lwIP郵箱消息的二重指針。

3.2 lwIP信號量函數的移植

lwIP的信號量機制需要實現信號量的創建、刪除、占用、等待等4個函數。信號量機制在操作系統中很常見,它一般用來指示可用資源,并將可用資源以數值的形式表示出來,多任務系統可以通過信號量實現任務間的同步和互斥控制。μTenux的信號量機制中包含一個資源計數器和一個等待信號量的任務隊列。一個任務可以發出事件通知,釋放返回m 個資源,此時,信號量資源計數加m。相反,當該任務正在等待事件獲得n個資源時,信號量資源計數器將減n。如果信號量資源的數量不夠,信號量計數器可以變成負值,則嘗試獲取資源的任務進入等待狀態,直至下次有資源釋放返回。等待信號量資源的任務會被置入信號量任務隊列中。μTenux為防止過多資源同時返回到信號量,在信號量中設置一個最大信號量計數器,當返回到信號量的資源造成最大計數的超出時報錯[8]。lwIP的信號量實現可以直接使用μTenux的信號量機制。以信號量的創建為例,可以直接對tk_cre_sem 函數進行封裝,其中maxsem 由用戶在sys_arch.h中設定,配置成CFN_MAX_SEMID(μTenux 信號量的配置值),使μTenux 中的資源配置直接用于lwIP。代碼略——編者注。

lwIP信號量的其他實現函數也是對相關函數的封裝,和郵箱機制的實現方法一樣,要考慮時限的對應關系。

3.3 lwIP網絡控制器驅動函數的移植

3.3.1 lwIP協議棧數據包結構

在lwIP中,每次數據包處理時占用的數據空間采用pbuf結構。該結構同BSD中的mbuf結構類似,是網絡控制器驅動程序實現的核心[9]。

lwIP的實現同樣基于TCP/IP 協議的分層思想,在lwIP的core組件中包含單獨命名的模塊,例如udp.c、tcp.c、dhcp.c等,它們彼此共享一個共同的數據空間,各個層次之間傳遞的是數據地址而不是數據本身,這個數據采用的是上文提到的pbuf結構,如圖4所示。pbuf結構根據數據所在的內存區域和申請方式不同,有4種不同的類型,本文以典型的PBUF_RAM 類型為例,通過圖4分析pbuf的結構定義。

圖4 pbuf結構

pbuf結構中有7個參數,通過next指針組成pbuf鏈表。一個數據包往往包含多個pbuf結構的數據,lwIP在運行中涉及消息的接收、發送、傳遞、丟棄等操作,要通過這幾個參數中的長度和標志位來識別判斷。這種實現機制為lwIP協議棧節省了內存空間和處理時間,卻為以太網驅動的實現增加了復雜度。

3.3.2 網絡接口函數的實現

該部分與底層硬件聯系緊密,需實現5個基本函數:網絡接口初始化函數、網絡接口接收函數、底層網絡控制器初始化函數、底層網絡控制器接收數據包函數、底層網絡控制器發送數據包函數。

本文以Microchip公司生產的基于SPI接口的以太網控制器芯片ENC28J60[11]為例,其基本操作驅動庫代碼采用美國SourceForge.net平臺AVRNET[12]開源項目中的代碼(enc28j60.c)。lwIP 底層網絡接口文件取名enc28j60if.c,需實現上面提到的5個函數。其中,底層網絡控制器接收數據包函數和底層網絡控制器發送數據包函數由于考慮到lwIP 的pbuf結構,所以不能直接使用enc28j60.c中的數據包收發函數,這部分需要進行改寫。以底層網絡控制器接收數據包函數為例,具體實現分為4步:①判斷enc28j60中是否有數據接收;②配置接收緩沖區大??;③判斷數據合法性并申請pbuf結構;④接收數據到pbuf結構中。代碼略——編者注。

ENC28J60接收的數據包由4部分組成(下一個數據包的指針、接收的狀態向量、接收的有效數據、CRC 校驗)。底層網絡控制器發送數據包函數用到的也是這樣的思想。此外,網絡接口初始化函數和網絡接口接收函數直接使用lwIP提供的模版函數,底層網絡控制器初始化函數配置lwIP的netif接口后調用enc28j60.c中的初始化函數即可。

4 lwIP移植的簡單測試用例

以STM32F407VG[13]和ENC28J60 為例,在μTenux軟件包中,已經對STM32F407VG 的時鐘和串口進行了初始化設置,添加SPI接口初始化函數即可進行lwIP的移植測試。本部分先介紹lwIP的應用編程接口,然后給出測試實例和結果。

4.1 lwIP的API接口說明

lwIP為用戶編寫上層應用代碼提供了三種不同的API接口,分別是原始API接口、高性能專用的sequential API接口和Berkeley風格的Socket API接口。當不提供操作系統支持的時候只能使用原始API接口,當提供操作系支持時,三種接口方式都可以使用。

基于前文,當完成了lwIP基于μTenux 的操作系 統 模 擬 層 移 植 和ENC28J60 的以太網網絡接口的函數封裝,建立了如圖5所示的依賴關系,這時就可以進行程序編寫和測試了。

圖5 lwIP依賴關系

4.2 一個簡單的HTTP服務器實現

為了檢驗移植后的lwIP是否能夠正常運行,使用lwIP的sequential API寫一個簡單的HTTP服務器程序[14]。

程序中,將html語言的字符串存儲在一個靜態變量htmltestdata中,在主函數中創建一個名為http_task的進程函數,在該進程函數中完成以下幾步:①初始化lwIP協議棧,注冊網絡接口;②允許STM32F407VG 接收SPI外部中斷,使ENC28J60接收到數據之后可以馬上處理;③新建一個TCP鏈接,并監聽端口號80;④當監聽到客戶端連接后處理客戶端接收到的數據。完成上述4步之后,當發現客戶端請求的數據并且能正確解析時,則將htmltestdata返回,這樣就實現了一個簡單的HTTP服務器。

建立TCP連接部分代碼略——編者注。

編譯成功并運行后,通過在Windows控制臺上執行ping命令,并且打開瀏覽器在地址欄中輸入網絡接口初始化時綁定的IP地址,圖6和圖7的測試結果表明ARP、ICMP、IP和TCP協議運行正常。

圖6 ping命令測試

結 語

lwIP是一款優秀的免費開源的TCP/IP網絡中間件,基于μTenux的lwIP移植結合了操作系統的優勢,可以用于嵌入式設備的產品研發上。本文下一步研究工作考慮結合μTenux實時系統的消息郵箱和內存管理特性,以改進lwIP中pbuf結構的內存申請方式,縮減移植后的lwIP代碼量,降低運行時ROM 和RAM 占用量,進一步優化lwIP的實時性和穩定性。

圖7 HTTP應用示例

編者注:本文為期刊縮略版,全文見本刊網站www.mesnet.com.cn。

[1]Wikipedia.Ubiquitous computing[OL].[2013-08].http://en.wikipedia.org/wiki/Ubiquitous_computing.

[2]張園園.高性能嵌入式系統網絡協議棧關鍵技術研究與實踐[D].北京:北京郵電大學,2010.

[3]Dunkels A.Design and Implementation of the LwIP TCP/IP Stack[D].Stockholm:Swedish Institute of Computer Science,2001.

[4]李志明.STM32 嵌入式系統開發實戰指南:FreeRTOS 與LwIP聯合移植[M].北京:機械工業出版社,2013.

[5]Scaglia S.嵌入式Internet TCP/IP基礎、實現及應用[M].潘琢金,等譯.北京:北京航空航天大學出版社,2008.

[6]T-Engine中國開源社區.μTenux嵌入式操作系統——μT/Kernel內核規范[OL].[2013-08].http://www.tecoss.org.

[7]Savannah.lwIP-A Lightweight TCP/IP stack,2013.

[8]坂村健.嵌入式實時操作系統T-Kernel2.0[M].梁青,譯.北京:北京航空航天大學出版社,2012.

[9]朱升林.嵌入式網絡那些事:LwIP 協議深度剖析與實戰演練[M].北京:中國水利水電出版社,2012.

[10]邱書波,陳偉.基于ARM 的輕量級TCP/IP協議棧的研究及移植[J].計算機應用與軟件,2009,26(8):90-92.

[11]Microchip.ENC28J60,2013.

[12]Source Forge.AVRnet,2013.

[13]ST.STM32F407VG,2013.

[14]Christian L.嵌入式協議棧μCTCP-IP——基于STM32微控制器[M].鄺堅,譯.北京:北京航空航天大學出版社,2013.

猜你喜歡
網絡接口緩沖區底層
航天企業提升采購能力的底層邏輯
基于網絡聚類與自適應概率的數據庫緩沖區替換*
雙冗余網絡接口自動切換測試模塊的設計與實現
淺析CTC與GSM-R系統網絡接口及路由配置改進措施
一類裝配支線緩沖區配置的兩階段求解方法研究
關鍵鏈技術緩沖區的確定方法研究
網絡設置管理
初涉緩沖區
回到現實底層與悲憫情懷
京滬高鐵GSM-R網絡接口監測網關子系統的設計與實現
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合