徐業(yè)榮 包明磊 李 明
1(南京國電南自電網自動化有限公司 江蘇 南京 211100)2(國電南京自動化股份有限公司 江蘇 南京 211100)
?
一種基于lwIP協(xié)議棧的雙網口通信方案設計
徐業(yè)榮1,2包明磊1李明1
1(南京國電南自電網自動化有限公司江蘇 南京 211100)2(國電南京自動化股份有限公司江蘇 南京 211100)
針對嵌入式系統(tǒng)低成本以太網通信的需求提出將lwIP開源協(xié)議棧移入μC/OS系統(tǒng),構成一種雙網口通信方案。操作系統(tǒng)模擬層所用內部郵箱與信號量使用專屬內存塊。應用層設計成連接層和規(guī)約層,連接層循環(huán)遍歷所有處于穩(wěn)定狀態(tài)的TCP連接,規(guī)約層負責解析上層應用規(guī)約。實驗結果表明,應用此方案的系統(tǒng)能夠實現(xiàn)可靠的以太網通信需求。
lwIPμC/OSTCP連接應用層
隨著嵌入式系統(tǒng)設備的廣泛應用,當設備需要與多個網絡設備交互數據時,需要設備具有多網口、多連接功能,同時能夠解析應用規(guī)約。目前嵌入式系統(tǒng)攜帶以太網通信功能,可采用商用操作系統(tǒng)的自帶協(xié)議?;蛘唛_發(fā)協(xié)議棧。前者對系統(tǒng)CPU的硬件性能要求較高[1],且一般為收費授權方式,使用成本較高。后者對開發(fā)人員的技術要求較高,開發(fā)周期較長。
lwIP協(xié)議棧作為一種開源、可穩(wěn)定運行的網絡協(xié)議棧,可移植于多種操作系統(tǒng)中。使用lwIP協(xié)議棧時,若采用新建任務方式管理新建TCP連接,存在兩個弊端:新建TCP連接數目容易受操作系統(tǒng)任務數量上限限制;TCP連接關閉時需刪除對應的任務,回收任務所占用的堆棧空間時,若處理不當,容易造成系統(tǒng)運行致命錯誤。
本文中提出一種基于lwIP協(xié)議棧雙網口多連接的方案設計。方案中連接層以單任務循環(huán)遍歷所有的TCP連接,規(guī)約層負責解析應用規(guī)約內容。
1.1硬件平臺設計
如圖1所示,方案硬件平臺由四個部分組成:邏輯處理單元、外接網口單元、存儲單元、時鐘單元。邏輯處理單元中的CPU采用Atmel公司AT91RM9200芯片,操作系統(tǒng)選用搶占式的實時多任務操作系統(tǒng)μC/OS II系統(tǒng)[2],將lwIP協(xié)議棧移植入操作系統(tǒng)中。
外接網口單元共設計2個以太網口,其中一個(NET1)由AT91RM9200自帶的以太網控制器外擴PHY芯片(LXT971)構成,另一個(NET2)由總線外擴的以太網控制器CS8900構成。當外部以太網通信幀發(fā)送至一以太網網口時,主CPU收到相應的中斷信號并讀取外部通信幀。
在存儲單元中,平臺外擴一片16位4 MB大小的FLASH(S29GL032M)存儲程序,選用兩片內存芯片組成32位16 MB大小的SDRAM作為內存,選用鐵電存儲芯片F(xiàn)M24CL64存放系統(tǒng)運行時的關鍵配置參數。時鐘單元由RTC芯片向系統(tǒng)提供時鐘信息。
圖1 系統(tǒng)平臺設計框圖
1.2μC/OS系統(tǒng)下的移植與實現(xiàn)
為了能夠與不同操作系統(tǒng)或者無操作系統(tǒng)兼容,lwIP協(xié)議棧內部不使用特定的數據結構或者功能模塊,而是通過模擬層接口函數實現(xiàn)協(xié)議棧與不同操作系統(tǒng)的兼容。在將lwIP協(xié)議棧移植入μC/OS操作系統(tǒng)時,利用μC/OS系統(tǒng)中的郵箱、信號量實現(xiàn)操作系統(tǒng)模擬層的功能[3]。
圖2 系統(tǒng)軟件架構
圖2顯示了方案的軟件架構,其中操作系統(tǒng)模擬層銜接μC/OS系統(tǒng)和lwIP協(xié)議棧。后者完成 TCP/IP參考模型[4]中的運輸層、網絡層功能。為每個外部網絡接口建立lwIP協(xié)議棧中的虛擬網絡接口struct netif,構成鏈路層功能。
通信幀進入外接網口單元中的一個外部網絡接口,經以太網控制器對通信幀處理,完成網口中斷信號發(fā)出。邏輯處理單元接到中斷信號后,調用網口中斷處理函數對通信幀進行處理,將通信幀以消息發(fā)送至對應的消息處理任務。后者調用虛擬網絡接口的通信幀輸入函數處理通信幀,使通信幀進入lwIP協(xié)議棧內部處理流程。
方案在應用層中設計了連接層和規(guī)約層。連接層實現(xiàn)UDP報文的接收[5]、TCP連接的維護和TCP報文的收發(fā),規(guī)約層完成接收報文的解析和回復報文的組幀功能。
1.3協(xié)議棧內存管理
在系統(tǒng)運行過程中,系統(tǒng)與外部的TCP連接與斷開將有l(wèi)wIP協(xié)議棧內部郵箱、信號量不斷的新建與回收。為了避免系統(tǒng)長時間運行后,出現(xiàn)內存碎片化,方案對協(xié)議棧中郵箱、信號量的內存管理使用專屬內存塊的方式。
以郵箱申請為例,首先申請內存塊pcQueueMemoryPool,調用OSMemCreate對pcQueueMemoryPool內存塊進行初始化,返回數據塊鏈表地址pQueueMem。如圖3所示,內存塊被初始化成數量為MAX_QUEUES、大小為strQueu數據塊鏈表。每個數據塊頭部為struct os_mem結構體,用于存儲數據塊鏈表當前可用數據塊信息。當使用sys_mbox_new申請郵箱時,先從pQueueMem中使用OSMemGet獲取內存塊。操作系統(tǒng)通過改變os_mem參數,使得可用數據塊指針指向下一個數據塊,可用數據塊數量減1。sys_mbox_free釋放郵箱時,調用OSMemPut函數將內存塊放回內存池中,可用數據塊指針指向當前數據塊,可用數據塊數量加1。信號量的申請和釋放與郵箱方法類似。
圖3 動態(tài)內存管理
方案中,應用層設計了連接層和規(guī)約層,連接層負責UDP廣播報文的接收、TCP連接的維護和TCP報文的收發(fā)。規(guī)約層專注于具體規(guī)約處理,提高方案的擴展性,可用于不同的上層規(guī)約解析[6]。
2.1連接層可靠性關鍵技術設計
通常為了使每個TCP連接能夠獨立接收和發(fā)送數據,系統(tǒng)需為每個TCP連接申請獨立的接收與發(fā)送內存區(qū)。當連接被關閉時,應對該連接的內存區(qū)進行回收。當各連接只需同步向外部上送相同信息時,每個連接的接收與發(fā)送內存區(qū)可采用代理線程設計模式[7],避免申請大量內存空間;當外部系統(tǒng)對系統(tǒng)通信數據需求差異較大,系統(tǒng)需為多個連接開獨立的內存區(qū)用于接收和發(fā)送數據。以單次發(fā)送或者接收最多1500字節(jié)的數據為例,當TCP連接最大數目為10時,系統(tǒng)需約30 Kbyte的內存,內存消耗較大。本文提出一種基于單任務循環(huán)接收所有TCP連接的方法,此方法將節(jié)省內存開銷。
首先,新建任務Newecho_thread()用于建立TCP連接,當任務接收到外部系統(tǒng)廣播報文后,如果系統(tǒng)沒有與此外部系統(tǒng)建立TCP連接,則調用lwIP內部函數新建TCP連接;其次,新建Tcpecho_thread()任務,循環(huán)遍歷協(xié)議棧中tcp_active_pcbs鏈表,實現(xiàn)循環(huán)接收系統(tǒng)中所有處于穩(wěn)定狀態(tài)的TCP連接數據。
由于方案中是單任務接收所有TCP連接數據,將不必申請多個接收、發(fā)送數據內存區(qū),節(jié)省了內存開銷。此方案的弊端是多個TCP連接不能并行接收TCP連接數據,可以通過設置固定超時時間recv_timeout,減少每個TCP連接的阻塞時間。為了實現(xiàn)長連接功能,方案中采用兩種策略維護活躍狀態(tài)TCP連接,及時刪除已失效TCP連接。
(1) 設置lwIP Keepalive功能選項
從Ver1.3.0開始,lwIP協(xié)議棧提供Keepalive保活功能[8]。在lwipopts.h文件中將Keepalive宏開關LWIP_TCP_KEEPALIVE置為1。針對每個TCP連接,可以設置允許持續(xù)空閑時間keep_idle、保活探測消息的發(fā)送頻率keep_intvl、?;钐綔y消息判斷連接斷開的次數keep_cnt選項。
(2) 檢測TCP狀態(tài)
lwIP協(xié)議棧以往版本內部函數返回值直接為指向相應數據的指針,此方法的弊端是運行過程中一旦出現(xiàn)錯誤,無法區(qū)分錯誤類型,不能對不同類型錯誤做出分類處理。lwIP 從1.4.0版本開始修改內部函數、操作系統(tǒng)模擬層函數的返回值與形參結構。將返回值更改為函數執(zhí)行錯誤類型,原先的函數返回值以函數形參方式輸出。
圖4為連接層TCP報文接收任務Tcpecho_thread接收數據結構示意圖。任務運行過程中,通過對tcp_active_pcbs鏈表循環(huán)遍歷,使用lwIP協(xié)議棧內部函數循環(huán)接收所有處于活躍狀態(tài)的TCP連接。判斷函數返回值,確定當前連接的運行狀態(tài),如果發(fā)現(xiàn)連接異常,則進入異常處理環(huán)節(jié)。如果接收連接正常,則將報文交予規(guī)約層解析。
圖4 Tcpecho_thread任務接收數據流程圖
2.2規(guī)約層報文解析
在單任務接收所有TCP連接中,當規(guī)約層在處理外部通信幀時,連接層將處于阻塞狀態(tài),造成系統(tǒng)不能接收其他TCP連接。為了避免系統(tǒng)丟失其他TCP連接數據,方案中對規(guī)約層處理流程進行改進。
以電力行業(yè)繼電保護設備信息接口配套標準DL/T667[9]為例,主站與從站之間一般處于非平衡傳輸工作模式。主站發(fā)出幀長較小,從站依主站命令類型回復自身系統(tǒng)運行中產生的大量有效信息數據。利用主站發(fā)出幀幀長較短特點,規(guī)約層可以以較小內存空間建立數據隊列存儲主站的多條通信幀和TCP連接信息。在系統(tǒng)運行過程中,規(guī)約解析函數依據先入先回原則對數據隊列中通信幀解析并回復。規(guī)約層將待發(fā)送報文數據和TCP連接信息一并交予連接層,由連接層完成最終數據的發(fā)送。規(guī)約層處理完一幀數據后,將當前數據塊標志Isused置為未用狀態(tài),開始處理下一個通信幀。
3.1ICMP協(xié)議返回時間測試
圖5 Net1網口Ping命令返回時間
圖6 Net2網口Ping命令返回時間
數據大小(Bytes)最大返回時間(毫秒)Net1Net2最小返回時間(毫秒)Net1Net2平均返回時間(毫秒)Net1Net2320.8841.2480.3610.9340.4991.033640.9701.3170.3701.0870.5161.1831280.8021.5630.3831.3390.5271.442
作為TCP/IP協(xié)議的一部分,ICMP(Internet Control Messages Protocol)即因特網信報控制協(xié)議主要用于測試網絡連接量。使用該協(xié)議對系統(tǒng)進行測試可以反映方案的響應性能。在實際操作上,使用Ping命令測試系統(tǒng)與后臺系統(tǒng)的端對端連通。圖5和圖6分別顯示了依據本方案所設計的通信系統(tǒng)兩個網口在測試過程中,Ping命令不同大小字節(jié)數據響應返回時間。表1顯示了最大、最小和平均返回時間。
Net1網口在不同數據負載下,返回時間相對穩(wěn)定,Net2網口對Ping命令的響應時間,隨著負載通信幀大小的增加而增加。這主要因為系統(tǒng)從外部接收通信幀時,需要先存儲在CS8900芯片片上內存,然后通過總線傳遞至主CPU。當系統(tǒng)往外部發(fā)送通信幀時,同樣需經CS8900芯片片上暫存。隨著搬移數據大小的增加,搬移時間也會隨之增大。作為Net1的ARM芯片內部的太網媒體訪問控制器,因為與內核關聯(lián)度較高,在傳輸速度上,基本不受字節(jié)大小影響。
3.2TCP連接穩(wěn)定性測試
TCP作為一種面向連接的協(xié)議,可以從三個角度測試TCP連接的穩(wěn)定性:
(1) TCP短連接測試
TCP短連接方式通常為client端向server端發(fā)起連接,server端接到請求后建立連接。雙方交互數據后,則斷開連接。本測試中服務器端為一臺PC電腦,客戶端為本方案系統(tǒng)。為了能夠快速驗證短連接建立的有效性,測試程序中省去雙方交互應用層數據這一步。每當TCP連接建立成功后,PC電腦端自動斷開連接并重新發(fā)起TCP連接。4小時不間斷建立、斷開TCP連接測試結果顯示,系統(tǒng)能夠滿足TCP短連接要求,不存在系統(tǒng)運行一段時間后出現(xiàn)不能新建連接現(xiàn)象。這主要由于本系統(tǒng)lwIP協(xié)議棧郵箱、信號量的建立采用了專屬內存塊管理方法,每一次TCP連接的斷開,該連接對應的郵箱、信號量所占用的內存塊都得以及時回收。相反,如果采用從系統(tǒng)中直接申請內存用于建立郵箱和信號,經過半小時短連接測試,通過打開協(xié)議棧斷言開關,顯示sys_sem_new或者sys_mbox_new失敗。
(2) TCP長連接測試
在長連接測試中,后臺側使用數字化變電站自動化系統(tǒng)PS6000+系統(tǒng),測試時間設定為24小時,結果顯示系統(tǒng)完全滿足長連接可靠性要求。通過調整lwIP協(xié)議棧中Keepalive參數,可以實現(xiàn)快速識別網線斷開或者后臺側崩潰現(xiàn)象。當網線重新插上或者后臺重啟后,系統(tǒng)又能快速實現(xiàn)與后臺的重連。
(3) TCP瞬時多條報文測試
為了檢驗系統(tǒng)瞬時接收多條報文功能,利用以太網測試工具瞬時發(fā)送多條TCP命令。結果顯示系統(tǒng)能夠緩沖多條TCP命令,命令存儲數目的大小與系統(tǒng)設定的TCP數據隊列區(qū)大小相關。
本文介紹了一種基于μC/OS-II系統(tǒng)的lwIP協(xié)議棧雙網口多連接的設計方案。在介紹了軟件系統(tǒng)的架構基礎上,本文還介紹了郵箱、信號量的內存管理方法、單任務循環(huán)接收所有TCP連接的方法以及規(guī)約層的響應機制。實驗結果表明,該方案穩(wěn)定性高,可以使用較小的系統(tǒng)時間和內存空間實現(xiàn)嵌入式系統(tǒng)與外部的多連接通信。該方案已經應用于電力系統(tǒng)二次側保護設備的對外通信模塊中,滿足了裝置對低成本以太網通信的需求。
[1] 李勁君,張愛民,張杭.一種應用于數字化變電站的嵌入式TCP/IP協(xié)議棧[J]. 電力系統(tǒng)自動化,2010,34(10):97-100.
[2] Jean J Labrosse. 嵌入式實時操作系統(tǒng)μC/OS-II[M].邵貝貝,譯.北京:北京航空航天大學出版社,2007.
[3] 馬濤,白瑞林,石堅.Cortex-A8平臺的μC/OS-II及 lwIP協(xié)議棧的移植與實現(xiàn)[J]. 計算機應用與軟件,2014,31(1):242-245.
[4] W Richard Stevens. TCP/IP詳解[M].范建華,譯.北京:機械工業(yè)出版社,2000.
[5] 徐鑫,曹奇英.基于LwIP協(xié)議棧的UDP協(xié)議分析與優(yōu)化[J]. 計算機應用與軟件,2011,28(3):246-249.
[6] 周紹文. 一種基于uIP協(xié)議棧的多應用層協(xié)議支持方案的設計[J].電力系統(tǒng)保護與控制,2010,38(9):109-112.
[7] 蔣俊,鐘偉勝. μC/OS-II和LWIP的并發(fā)服務器與代理線程設計模式[J].單片機與嵌入式系統(tǒng)應用,2014,14(12):42-44.
[8] 胡俐蕊,王則林,胡傳志.基于LwIP的μC/OS-II網絡應用程序設計方法[J].計算機應用與軟件,2010,27(4):271-273.
[9] 譚文恕,劉靜泉,葉鋒,等.遠動設備及系統(tǒng)第5部分傳輸規(guī)約 第103篇 繼電保護設備信息接口配套標準[S].DL/T.北京:中國電力出版社,1999.
DESIGN OF AN LWIP-BASED DUAL NETWORK INTERFACE COMMUNICATION SCHEME
Xu Yerong1,2Bao Minglei1Li Ming1
1(Nanjing SAC Power Grid Automation Co., Ltd, Nanjing 211100,Jiangsu,China)2(GuodianNanjingAutomationCo.,Ltd,Nanjing211100,Jiangsu,China)
Aiming at the requirement of low cost Ethernet communication of embedded system, we propose to move the open source protocol stack lwIP into μC/OS system to construct a dual network interface communication scheme. The inner mailbox and semaphore of operating system emulation layer is designed to use the exclusive memory block. The application layer is designed as the connecting layer and the protocol layer. The connecting layer loops through all the stable TCP connections. The protocol layer is responsible for parsing the upper application protocol. Experimental results show that the application of this scheme can achieve reliable Ethernet communication needs.
lwIPμC/OSTCP connectionApplication layer
2015-06-26。徐業(yè)榮,工程師,主研領域:繼電保護裝置研究與開發(fā)。包明磊,高工。李明,工程師。
TP368.2
A
10.3969/j.issn.1000-386x.2016.09.030