,,,,,,
(中國電子科技集團公司 第三十四研究所,桂林 541004)

圖1 系統架構圖
在雷達信號地面接收、車載綜合指揮系統等應用場合,大多采用了點對點或星型結構的光傳輸系統。在這些應用場合下,局端光端機處于監控中心,遠端光端機則位于較遠或較惡劣的環境。要實現對整個光傳輸系統的統一管理,一是要實現遠控,二是監控主機應接入方便,客戶端管理便捷,并且具有分布式管理的能力。
本文設計了以太網串口服務模塊(簡稱以太網模塊),移植了TCP/IP協議,它具有多個套接字地址,每一臺被管理的終端設備分配了一個套接字地址,客戶端進程通過套接字地址來與終端設備建立通信連接,實現了進程對終端設備的一對一管理。該方案不僅適用于點對點的光傳輸系統,也適用于小型星形光傳輸網絡,具有低成本、高效益的特點。
系統架構圖如圖1所示,以點對點光傳輸系統為例,整個系統主要由局端光端機、遠端光端機和監控主機組成。
在局端光端機中,以太網模塊實現了網絡數據包向2個異步串行接口(簡稱串口)的分發。串口0和局端ARM處理器的串口相連,用來對局端光端機進行狀態采集和控制;串口1與局端FPGA相連,通過FPGA進行復接,再經光電變換、光纖傳輸,最終與遠端光端機內的ARM處理器的串口相連,用作遠端光端機的監控接口。FPGA在此過程中實現了業務流和控制流的復接和分接。
以太網模塊要選用的ARM處理器需要移植TCP/IP協議棧,必須具有較高的工作頻率,同時內部集成10/100M MAC控制器,及容量可觀的RAM和FLASH存儲器。同時,為了方便端口數量的擴展,ARM處理器集成的串口(UART)數量盡可能多,為了降額設計,還需滿足低功耗、高性能的特點。基于以上需求,處理器選用了NXP公司的Cortex-M3架構的LPC1768。
LPC1768采用了新一代Cortex-M3架構,比傳統的ARM7架構減少了邏輯門數量,提高了工作頻率,降低了功耗。最高工作頻率為100 MHz,集成了512 KB FLASH和64 KB RAM存儲器,以及RMII接口的MAC,且具有4個異步數據串行接口UART0~UART3。

圖2 以太網模塊硬件示意圖
以太網PHY選用了MICREL公司的KSZ8041NL,它是單芯片10/100M以太網物理層收發器,支持線序自適應和10/100M自協商功能,和LPC1768之間通過RMII接口相連,連接圖如圖2所示。
根據OSI定義的7層TCP/IP參考模型,網際協議IP實現了主機到主機的通信,傳輸層協議(TCP/UDP)實現了進程到進程的通信。IP地址定義了主機,端口號(port number)定義了進程。進程是運行著的程序的最小單位,同一臺主機上可同時運行多個相互獨立的進程,它們具有相同的IP地址(本機的IP地址),擁有不同的端口號。因此,IP地址和端口號的組合稱為套接字地址(Socket地址),通過Socket地址將不同的進程區別開來。本質上,進程才是數據的生產者和消費者,當主機收到數據報時,通過檢查數據報的目的端口號尋找與之匹配的進程,并將數據交給它;當進程發送數據時,目的端口號和源端口號被插入數據報中,通過網絡傳輸。設備收到數據報后,根據目的端口號進行數據路由選擇。
進程對設備的一對一管理如圖3所示,監控主機上運行著2個進程,進程1發出的數據通過UART0(對應端口0)轉發出去,由局端光端機的ARM接收處理;進程2發出的數據通過UART1(對應端口1)轉發出去,由遠端光端機接收處理,反之亦然。這樣就實現了進程和設備的點對點通信,不同的進程管理著不同的設備,并且獨立運行。

圖3 進程對設備的一對一管理
綜上所述,每個端口號對應著一個物理的串口(UART),每個串口聯系著一臺設備,等同于每臺設備都有一個Socket地址,通過設備的Socket地址實現了進程對設備的一對一管理。在客戶端界面上可通過不同的顯示顏色表示不同的告警事件,如進程界面為灰色表示設備掉線;紅色表示設備告警;綠色表示設備工作正常。
另一方面,進程可以運行在不同的主機上,同時以太網模塊支持多連接,這樣可以實現分布式管理。
2.2.1 以太網驅動
LPC1768的MAC和PHY芯片KSZ8041NL分別實現了數據鏈路層和物理層的功能。其中MAC含有一個分散/聚集以太網幀的DMA引擎,它實現了MAC和片上SRAM之間的數據傳輸。DMA引擎利用存儲器中“發送描述符數組”和“接收描述符數組”來管理收發數據。描述符數組的每一個元素對應著一個數據緩沖區,多個數據緩沖區形成環形結構,而每一個數據緩沖區可以保存一個完整的以太網幀(Frame)或其中的一個幀片段(Fragment),即一個完整的以太網幀由一個或多個幀片段組成。
同時,使用生產索引(Produce Index)和消費索引(Consume Index)兩個索引寄存器,來記錄幀片段在環形緩沖結構中的位置,并隨著數據的生產和消費相應地循環移動。
接收數據時,DMA引擎將MAC收到的幀片段“分散”存放到多個接收緩沖區,并設置狀態標志位,供上層服務使用;發送數據時,DMA引擎將多個發送緩沖區的幀片段按順序“集中”起來發送出去,并設置狀態標志位,供上層服務使用。
完整的以太網驅動的初始化包含如下過程:
① LPC1768的以太網模塊時鐘和引腳使能;
② 初始化MAC地址、背對背、包間隙、最大幀長、沖突/重發窗口等控制寄存器;
③ 初始化PHY芯片;
④ 初始化發送描述符數組和接收描述符數組;
⑤ 使能接收完成(Rx Done)和發送完成(Tx Done)中斷;
⑥ 啟動發送和接收功能。
2.2.2 TCP/IP協議棧移植
TCP/IP協議棧的實現必須基于嵌入式實時操作系統。本方案采用了RL-RTX實時操作系統,它由ARM公司開發,是一款功能強大的嵌入式實時操作系統,適用于ARM7、ARM9、以及Cortex-M架構的微處理器,具有如下特點:
① 支持時間片、搶占式和合作式調度;
② 低中斷延遲,對應Cortex-M3/M4內核可以實現零中斷延遲;
③ 具有254級任務優先級;
④ 支持庫移植方式,移植方便;
⑤ 基于對話框的配置向導,裁剪方便。
具體移植時,選擇庫移植方式,在“目標選項”標簽頁的操作系統下拉列表中選擇“RTX Kernel”;然后,添加RTX系統的配置文件RTX_Conf_CM.c到工程中,通過配置向導對任務數量、默認堆棧大小、主頻和tick值進行設置,完成操作系統的裁剪。
RL-RTX實時操作系統同時提供了眾多的中間件,其中TCP/IP協議的中間件為RL-TCPnet,它具有RAM空間,花費少,同時目標代碼緊湊,特別適合于資源有限的嵌入式操作系統,并針對ARM7、ARM9、以及Cortex-M架構的微處理器進行了優化。
移植RL-TCPnet時,需要對三個文件重點關注:TCP_CM3.lib是實現RL-TCPnet的庫文件,需要將其添加到工程中;Net_Config.c是配置文件,可通過配置向導完成對IP地址、MAC地址等參數的設置;rtl.h包含了RL-TCPnet的庫文件的函數原型,使用時必須引用它。
RL-TCPnet作為中間件,提供了與驅動層和應用層的數據傳輸接口。在系統初始化時,調用init_TcpNet()函數來初始化RL-TCPnet,該函數調用了以太網驅動層的相關函數,完成了對MAC和PHY的初始化;同時建立了RL-TCPnet的運行環境。
當OS啟動之后,需要2個優先級固定的系統任務支撐RL-TCPnet的運行。任務tick_timer()用來為RL-TCPnet提供節拍,以周期性地喚醒RL-TCPnet主線程main_TcpNet();任務tcp_poll()調用RL-TCPnet主線程main_TcpNet(),它使用標準的Socket API向應用層提供數據收發服務。
本方案中使用UDP協議來進行應用開發,RL-TCPnet主線程main_TcpNet()監聽網絡上的UDP數據包,無論何時,只要收到UDP數據包,就會調用回調函數udp_callback(),通過消息郵箱的通信機制通知應用層任務接收數據包。
數據包中不僅含有凈荷,還含有源端口號和目的端口號,供應用層進行路由處理;發送UDP數據包時,應用層將待發送的數據正文準備好,調用UDP Socket Send API函數的同時將目標IP地址、目的端口號、源端口號等參數傳遞給它,main_TcpNet()將自動組成UDP數據包并交由驅動層發送出去。
2.2.3 數據包路由選擇
每一個串口的端口號存儲在存儲器中,當收到UDP數據包時,將數據包中的目的端口號與各個串口的端口號逐一比對,若有匹配的,則將凈荷向相應的串口轉發;若匹配不中,則將該UDP數據包丟棄。
同時,為每一個串口分配512字節的接收緩沖區,任務循環檢查各個緩沖區是否為空,一旦某個串口收到字節,在將其放入對應的緩沖區的同時啟動超時計時,超時時間一般為當前波特率下接收5個字符的時間,當下一個到來的字符沒有超時時,超時計數器被清零;當發生超時時,則表示完整地收到了一幀數據,為該幀數據插上源端口號,目的端口號等幀頭信息交由UDP Socket Send API函數進行轉發,完成串口到網口的數據傳輸。
如圖4所示,使用TCP&DUP測試工具在監控主機上建立了2個UDP客戶端,目標IP均為10.35.217.168,客戶端1通過端口號23訪問局端光端機,客戶端2通過端口號26訪問遠端光端機,數據通信正常,2個客戶端獨立工作,分別實現對局端光端機和遠端光端機的監控。

圖4 UDP多進程測試

[1] 王國法,劉薇,段明瑋.基于嵌入式系統的以太網通信開發[J].光通信技術,2012,36(4):36-38.
[2] Behrouz A.Forouzan.TCP/IP協議族 [M].3版.北京:清華大學出版社,2009.
郭文龍(工程師),主要從事光通信研發工作。