,,,,,,
(中國(guó)電子科技集團(tuán)公司 第三十四研究所,桂林 541004)
圖1 系統(tǒng)架構(gòu)圖
在雷達(dá)信號(hào)地面接收、車載綜合指揮系統(tǒng)等應(yīng)用場(chǎng)合,大多采用了點(diǎn)對(duì)點(diǎn)或星型結(jié)構(gòu)的光傳輸系統(tǒng)。在這些應(yīng)用場(chǎng)合下,局端光端機(jī)處于監(jiān)控中心,遠(yuǎn)端光端機(jī)則位于較遠(yuǎn)或較惡劣的環(huán)境。要實(shí)現(xiàn)對(duì)整個(gè)光傳輸系統(tǒng)的統(tǒng)一管理,一是要實(shí)現(xiàn)遠(yuǎn)控,二是監(jiān)控主機(jī)應(yīng)接入方便,客戶端管理便捷,并且具有分布式管理的能力。
本文設(shè)計(jì)了以太網(wǎng)串口服務(wù)模塊(簡(jiǎn)稱以太網(wǎng)模塊),移植了TCP/IP協(xié)議,它具有多個(gè)套接字地址,每一臺(tái)被管理的終端設(shè)備分配了一個(gè)套接字地址,客戶端進(jìn)程通過套接字地址來與終端設(shè)備建立通信連接,實(shí)現(xiàn)了進(jìn)程對(duì)終端設(shè)備的一對(duì)一管理。該方案不僅適用于點(diǎn)對(duì)點(diǎn)的光傳輸系統(tǒng),也適用于小型星形光傳輸網(wǎng)絡(luò),具有低成本、高效益的特點(diǎn)。
系統(tǒng)架構(gòu)圖如圖1所示,以點(diǎn)對(duì)點(diǎn)光傳輸系統(tǒng)為例,整個(gè)系統(tǒng)主要由局端光端機(jī)、遠(yuǎn)端光端機(jī)和監(jiān)控主機(jī)組成。
在局端光端機(jī)中,以太網(wǎng)模塊實(shí)現(xiàn)了網(wǎng)絡(luò)數(shù)據(jù)包向2個(gè)異步串行接口(簡(jiǎn)稱串口)的分發(fā)。串口0和局端ARM處理器的串口相連,用來對(duì)局端光端機(jī)進(jìn)行狀態(tài)采集和控制;串口1與局端FPGA相連,通過FPGA進(jìn)行復(fù)接,再經(jīng)光電變換、光纖傳輸,最終與遠(yuǎn)端光端機(jī)內(nèi)的ARM處理器的串口相連,用作遠(yuǎn)端光端機(jī)的監(jiān)控接口。FPGA在此過程中實(shí)現(xiàn)了業(yè)務(wù)流和控制流的復(fù)接和分接。
以太網(wǎng)模塊要選用的ARM處理器需要移植TCP/IP協(xié)議棧,必須具有較高的工作頻率,同時(shí)內(nèi)部集成10/100M MAC控制器,及容量可觀的RAM和FLASH存儲(chǔ)器。同時(shí),為了方便端口數(shù)量的擴(kuò)展,ARM處理器集成的串口(UART)數(shù)量盡可能多,為了降額設(shè)計(jì),還需滿足低功耗、高性能的特點(diǎn)?;谝陨闲枨螅幚砥鬟x用了NXP公司的Cortex-M3架構(gòu)的LPC1768。
LPC1768采用了新一代Cortex-M3架構(gòu),比傳統(tǒng)的ARM7架構(gòu)減少了邏輯門數(shù)量,提高了工作頻率,降低了功耗。最高工作頻率為100 MHz,集成了512 KB FLASH和64 KB RAM存儲(chǔ)器,以及RMII接口的MAC,且具有4個(gè)異步數(shù)據(jù)串行接口UART0~UART3。
圖2 以太網(wǎng)模塊硬件示意圖
以太網(wǎng)PHY選用了MICREL公司的KSZ8041NL,它是單芯片10/100M以太網(wǎng)物理層收發(fā)器,支持線序自適應(yīng)和10/100M自協(xié)商功能,和LPC1768之間通過RMII接口相連,連接圖如圖2所示。
根據(jù)OSI定義的7層TCP/IP參考模型,網(wǎng)際協(xié)議IP實(shí)現(xiàn)了主機(jī)到主機(jī)的通信,傳輸層協(xié)議(TCP/UDP)實(shí)現(xiàn)了進(jìn)程到進(jìn)程的通信。IP地址定義了主機(jī),端口號(hào)(port number)定義了進(jìn)程。進(jìn)程是運(yùn)行著的程序的最小單位,同一臺(tái)主機(jī)上可同時(shí)運(yùn)行多個(gè)相互獨(dú)立的進(jìn)程,它們具有相同的IP地址(本機(jī)的IP地址),擁有不同的端口號(hào)。因此,IP地址和端口號(hào)的組合稱為套接字地址(Socket地址),通過Socket地址將不同的進(jìn)程區(qū)別開來。本質(zhì)上,進(jìn)程才是數(shù)據(jù)的生產(chǎn)者和消費(fèi)者,當(dāng)主機(jī)收到數(shù)據(jù)報(bào)時(shí),通過檢查數(shù)據(jù)報(bào)的目的端口號(hào)尋找與之匹配的進(jìn)程,并將數(shù)據(jù)交給它;當(dāng)進(jìn)程發(fā)送數(shù)據(jù)時(shí),目的端口號(hào)和源端口號(hào)被插入數(shù)據(jù)報(bào)中,通過網(wǎng)絡(luò)傳輸。設(shè)備收到數(shù)據(jù)報(bào)后,根據(jù)目的端口號(hào)進(jìn)行數(shù)據(jù)路由選擇。
進(jìn)程對(duì)設(shè)備的一對(duì)一管理如圖3所示,監(jiān)控主機(jī)上運(yùn)行著2個(gè)進(jìn)程,進(jìn)程1發(fā)出的數(shù)據(jù)通過UART0(對(duì)應(yīng)端口0)轉(zhuǎn)發(fā)出去,由局端光端機(jī)的ARM接收處理;進(jìn)程2發(fā)出的數(shù)據(jù)通過UART1(對(duì)應(yīng)端口1)轉(zhuǎn)發(fā)出去,由遠(yuǎn)端光端機(jī)接收處理,反之亦然。這樣就實(shí)現(xiàn)了進(jìn)程和設(shè)備的點(diǎn)對(duì)點(diǎn)通信,不同的進(jìn)程管理著不同的設(shè)備,并且獨(dú)立運(yùn)行。
圖3 進(jìn)程對(duì)設(shè)備的一對(duì)一管理
綜上所述,每個(gè)端口號(hào)對(duì)應(yīng)著一個(gè)物理的串口(UART),每個(gè)串口聯(lián)系著一臺(tái)設(shè)備,等同于每臺(tái)設(shè)備都有一個(gè)Socket地址,通過設(shè)備的Socket地址實(shí)現(xiàn)了進(jìn)程對(duì)設(shè)備的一對(duì)一管理。在客戶端界面上可通過不同的顯示顏色表示不同的告警事件,如進(jìn)程界面為灰色表示設(shè)備掉線;紅色表示設(shè)備告警;綠色表示設(shè)備工作正常。
另一方面,進(jìn)程可以運(yùn)行在不同的主機(jī)上,同時(shí)以太網(wǎng)模塊支持多連接,這樣可以實(shí)現(xiàn)分布式管理。
2.2.1 以太網(wǎng)驅(qū)動(dòng)
LPC1768的MAC和PHY芯片KSZ8041NL分別實(shí)現(xiàn)了數(shù)據(jù)鏈路層和物理層的功能。其中MAC含有一個(gè)分散/聚集以太網(wǎng)幀的DMA引擎,它實(shí)現(xiàn)了MAC和片上SRAM之間的數(shù)據(jù)傳輸。DMA引擎利用存儲(chǔ)器中“發(fā)送描述符數(shù)組”和“接收描述符數(shù)組”來管理收發(fā)數(shù)據(jù)。描述符數(shù)組的每一個(gè)元素對(duì)應(yīng)著一個(gè)數(shù)據(jù)緩沖區(qū),多個(gè)數(shù)據(jù)緩沖區(qū)形成環(huán)形結(jié)構(gòu),而每一個(gè)數(shù)據(jù)緩沖區(qū)可以保存一個(gè)完整的以太網(wǎng)幀(Frame)或其中的一個(gè)幀片段(Fragment),即一個(gè)完整的以太網(wǎng)幀由一個(gè)或多個(gè)幀片段組成。
同時(shí),使用生產(chǎn)索引(Produce Index)和消費(fèi)索引(Consume Index)兩個(gè)索引寄存器,來記錄幀片段在環(huán)形緩沖結(jié)構(gòu)中的位置,并隨著數(shù)據(jù)的生產(chǎn)和消費(fèi)相應(yīng)地循環(huán)移動(dòng)。
接收數(shù)據(jù)時(shí),DMA引擎將MAC收到的幀片段“分散”存放到多個(gè)接收緩沖區(qū),并設(shè)置狀態(tài)標(biāo)志位,供上層服務(wù)使用;發(fā)送數(shù)據(jù)時(shí),DMA引擎將多個(gè)發(fā)送緩沖區(qū)的幀片段按順序“集中”起來發(fā)送出去,并設(shè)置狀態(tài)標(biāo)志位,供上層服務(wù)使用。
完整的以太網(wǎng)驅(qū)動(dòng)的初始化包含如下過程:
① LPC1768的以太網(wǎng)模塊時(shí)鐘和引腳使能;
② 初始化MAC地址、背對(duì)背、包間隙、最大幀長(zhǎng)、沖突/重發(fā)窗口等控制寄存器;
③ 初始化PHY芯片;
④ 初始化發(fā)送描述符數(shù)組和接收描述符數(shù)組;
⑤ 使能接收完成(Rx Done)和發(fā)送完成(Tx Done)中斷;
⑥ 啟動(dòng)發(fā)送和接收功能。
2.2.2 TCP/IP協(xié)議棧移植
TCP/IP協(xié)議棧的實(shí)現(xiàn)必須基于嵌入式實(shí)時(shí)操作系統(tǒng)。本方案采用了RL-RTX實(shí)時(shí)操作系統(tǒng),它由ARM公司開發(fā),是一款功能強(qiáng)大的嵌入式實(shí)時(shí)操作系統(tǒng),適用于ARM7、ARM9、以及Cortex-M架構(gòu)的微處理器,具有如下特點(diǎn):
① 支持時(shí)間片、搶占式和合作式調(diào)度;
② 低中斷延遲,對(duì)應(yīng)Cortex-M3/M4內(nèi)核可以實(shí)現(xiàn)零中斷延遲;
③ 具有254級(jí)任務(wù)優(yōu)先級(jí);
④ 支持庫(kù)移植方式,移植方便;
⑤ 基于對(duì)話框的配置向?qū)?,裁剪方便?/p>
具體移植時(shí),選擇庫(kù)移植方式,在“目標(biāo)選項(xiàng)”標(biāo)簽頁的操作系統(tǒng)下拉列表中選擇“RTX Kernel”;然后,添加RTX系統(tǒng)的配置文件RTX_Conf_CM.c到工程中,通過配置向?qū)?duì)任務(wù)數(shù)量、默認(rèn)堆棧大小、主頻和tick值進(jìn)行設(shè)置,完成操作系統(tǒng)的裁剪。
RL-RTX實(shí)時(shí)操作系統(tǒng)同時(shí)提供了眾多的中間件,其中TCP/IP協(xié)議的中間件為RL-TCPnet,它具有RAM空間,花費(fèi)少,同時(shí)目標(biāo)代碼緊湊,特別適合于資源有限的嵌入式操作系統(tǒng),并針對(duì)ARM7、ARM9、以及Cortex-M架構(gòu)的微處理器進(jìn)行了優(yōu)化。
移植RL-TCPnet時(shí),需要對(duì)三個(gè)文件重點(diǎn)關(guān)注:TCP_CM3.lib是實(shí)現(xiàn)RL-TCPnet的庫(kù)文件,需要將其添加到工程中;Net_Config.c是配置文件,可通過配置向?qū)瓿蓪?duì)IP地址、MAC地址等參數(shù)的設(shè)置;rtl.h包含了RL-TCPnet的庫(kù)文件的函數(shù)原型,使用時(shí)必須引用它。
RL-TCPnet作為中間件,提供了與驅(qū)動(dòng)層和應(yīng)用層的數(shù)據(jù)傳輸接口。在系統(tǒng)初始化時(shí),調(diào)用init_TcpNet()函數(shù)來初始化RL-TCPnet,該函數(shù)調(diào)用了以太網(wǎng)驅(qū)動(dòng)層的相關(guān)函數(shù),完成了對(duì)MAC和PHY的初始化;同時(shí)建立了RL-TCPnet的運(yùn)行環(huán)境。
當(dāng)OS啟動(dòng)之后,需要2個(gè)優(yōu)先級(jí)固定的系統(tǒng)任務(wù)支撐RL-TCPnet的運(yùn)行。任務(wù)tick_timer()用來為RL-TCPnet提供節(jié)拍,以周期性地喚醒RL-TCPnet主線程main_TcpNet();任務(wù)tcp_poll()調(diào)用RL-TCPnet主線程main_TcpNet(),它使用標(biāo)準(zhǔn)的Socket API向應(yīng)用層提供數(shù)據(jù)收發(fā)服務(wù)。
本方案中使用UDP協(xié)議來進(jìn)行應(yīng)用開發(fā),RL-TCPnet主線程main_TcpNet()監(jiān)聽網(wǎng)絡(luò)上的UDP數(shù)據(jù)包,無論何時(shí),只要收到UDP數(shù)據(jù)包,就會(huì)調(diào)用回調(diào)函數(shù)udp_callback(),通過消息郵箱的通信機(jī)制通知應(yīng)用層任務(wù)接收數(shù)據(jù)包。
數(shù)據(jù)包中不僅含有凈荷,還含有源端口號(hào)和目的端口號(hào),供應(yīng)用層進(jìn)行路由處理;發(fā)送UDP數(shù)據(jù)包時(shí),應(yīng)用層將待發(fā)送的數(shù)據(jù)正文準(zhǔn)備好,調(diào)用UDP Socket Send API函數(shù)的同時(shí)將目標(biāo)IP地址、目的端口號(hào)、源端口號(hào)等參數(shù)傳遞給它,main_TcpNet()將自動(dòng)組成UDP數(shù)據(jù)包并交由驅(qū)動(dòng)層發(fā)送出去。
2.2.3 數(shù)據(jù)包路由選擇
每一個(gè)串口的端口號(hào)存儲(chǔ)在存儲(chǔ)器中,當(dāng)收到UDP數(shù)據(jù)包時(shí),將數(shù)據(jù)包中的目的端口號(hào)與各個(gè)串口的端口號(hào)逐一比對(duì),若有匹配的,則將凈荷向相應(yīng)的串口轉(zhuǎn)發(fā);若匹配不中,則將該UDP數(shù)據(jù)包丟棄。
同時(shí),為每一個(gè)串口分配512字節(jié)的接收緩沖區(qū),任務(wù)循環(huán)檢查各個(gè)緩沖區(qū)是否為空,一旦某個(gè)串口收到字節(jié),在將其放入對(duì)應(yīng)的緩沖區(qū)的同時(shí)啟動(dòng)超時(shí)計(jì)時(shí),超時(shí)時(shí)間一般為當(dāng)前波特率下接收5個(gè)字符的時(shí)間,當(dāng)下一個(gè)到來的字符沒有超時(shí)時(shí),超時(shí)計(jì)數(shù)器被清零;當(dāng)發(fā)生超時(shí)時(shí),則表示完整地收到了一幀數(shù)據(jù),為該幀數(shù)據(jù)插上源端口號(hào),目的端口號(hào)等幀頭信息交由UDP Socket Send API函數(shù)進(jìn)行轉(zhuǎn)發(fā),完成串口到網(wǎng)口的數(shù)據(jù)傳輸。
如圖4所示,使用TCP&DUP測(cè)試工具在監(jiān)控主機(jī)上建立了2個(gè)UDP客戶端,目標(biāo)IP均為10.35.217.168,客戶端1通過端口號(hào)23訪問局端光端機(jī),客戶端2通過端口號(hào)26訪問遠(yuǎn)端光端機(jī),數(shù)據(jù)通信正常,2個(gè)客戶端獨(dú)立工作,分別實(shí)現(xiàn)對(duì)局端光端機(jī)和遠(yuǎn)端光端機(jī)的監(jiān)控。
圖4 UDP多進(jìn)程測(cè)試
[1] 王國(guó)法,劉薇,段明瑋.基于嵌入式系統(tǒng)的以太網(wǎng)通信開發(fā)[J].光通信技術(shù),2012,36(4):36-38.
[2] Behrouz A.Forouzan.TCP/IP協(xié)議族 [M].3版.北京:清華大學(xué)出版社,2009.
郭文龍(工程師),主要從事光通信研發(fā)工作。