王若龍, 張善從
(1.中國科學院光電研究院,北京100190;2.中國科學院研究生院,北京100049)
MIL-STD-1553B總線是在20世紀70年代末為適應飛機的發(fā)展由美國提出的飛機內(nèi)部電子系統(tǒng)連網(wǎng)標準。它是一種規(guī)定了“時分制命令/響應式的多路數(shù)據(jù)傳輸總線”網(wǎng)絡的硬件和軟件的技術(shù)要求,作為一種理想的實時通信總線,MILSTD-1553B總線具有1Mbps的傳輸速度,由總線控制器(BC)進行控制和管理總線上所有終端的數(shù)據(jù)傳輸。
1553B總線具有較高的可靠性和靈活性,廣泛應用于軍事、航空航天系統(tǒng),比如飛機、軍艦、衛(wèi)星以及國際空間站等。隨著我國通信衛(wèi)星,深空探測和載人航天等項目的開展,1553B總線技術(shù)在國內(nèi)航天領(lǐng)域的應用也日益廣泛。航天產(chǎn)品的地檢設備往往需要具有1553B總線數(shù)據(jù)訪問功能。為了方便數(shù)據(jù)的傳輸和共享,一般會在這些設備上開發(fā)基于TCP/IP網(wǎng)絡的應用軟件。同時,對于底層為1553B總線的分層網(wǎng)絡系統(tǒng)而言,實現(xiàn)各層間數(shù)據(jù)在網(wǎng)絡層的共享十分重要。
本文闡述了在Linux操作系統(tǒng)下,使用1553B協(xié)議的PCI接口卡,通過開發(fā)網(wǎng)絡設備驅(qū)動程序?qū)崿F(xiàn)基于1553B總線的TCP/IP網(wǎng)絡。該實現(xiàn)方案不僅有效的提高了1553B總線的靈活性和可擴展性,而且使得1553B總線終端可以與以太網(wǎng)的網(wǎng)絡結(jié)點進行數(shù)據(jù)通信。
PCI總線是當今普遍使用在桌面以及更大型計算機系統(tǒng)上的外設總線,而且該總線在Linux內(nèi)核中得到非常好的支持。該系統(tǒng)使用運行Linux操作系統(tǒng)的個人計算機作為硬件基礎,設計并開發(fā)基于PCI總線接口的1553B協(xié)議的板卡,不僅可以有效利用操作系統(tǒng)的支持,而且提高了1553B設備的通用性。
1553B總線接口卡主要包括1553B總線通道、1553B總線控制器、控制邏輯單元、PCI總線控制器和PCI配置用存儲芯片等部分。系統(tǒng)框圖如圖1所示。
圖1 1553B協(xié)議接口卡系統(tǒng)
PCI總線接口采用PLX技術(shù)公司的PCI 9052協(xié)議芯片,該芯片是一款功能強大、使用靈活的PCI總線控制器接口芯片。PCI 9052兼容PCI v2.1規(guī)范,運行于PCI目標設備下,其突發(fā)傳輸速率可以達到132Mbps。芯片內(nèi)部具有用于讀寫的FIFO,并且該芯片支持8、16和32位寬的局部總線,這些特性使得PCI 9052芯片滿足1553B總線的數(shù)據(jù)通信需求。
1553B總線接口控制單元采用成熟的1553B協(xié)議芯片——DDC公司的BU61580。該芯片完全集成了1553A/B Notice2,芯片可配置成遠程終端(RT)、總線控制器(BC)或者總線監(jiān)視器(MT),芯片內(nèi)部包含4K的RAM空間。
該芯片具有以下主要特性:
(1)BC自動重試;
(2)BC消息傳輸時間可編程;
(3)BC消息幀自動重復;
(4)BC可編程響應超時;
(5)RT單消息、雙緩沖、循環(huán)緩沖可選的數(shù)據(jù)緩存;
(6)RT子地址可編程BUSY位。
上述特性說明使用 BU61580芯片可以方便靈活的實現(xiàn)1553B總線協(xié)議,主要的功能設置都可以通過軟件實現(xiàn)。該芯片的總線通道可以采用直接耦合和變壓器耦合兩種方式,提高了板卡的兼容性和可靠性。
接口控制邏輯單元采用Xilinx公司的XC95114芯片實現(xiàn),該芯片具有充足的邏輯資源和大量寄存器,主要實現(xiàn)總線接口芯片PCI 9052和1553B協(xié)議芯片BU 61580之間的握手、片選、配置等邏輯控制。
Linux操作系統(tǒng)是在Internet上發(fā)展起來的,其在網(wǎng)絡方面具有良好的性能以及豐富的產(chǎn)品和網(wǎng)絡分析工具,而且它還可以方便的將主機配置成具有路由功能。雖然Linux2.4內(nèi)核仍被廣泛應用,但是自從2003年Linux2.6.0發(fā)布至今,2.6版本的內(nèi)核已經(jīng)十分穩(wěn)定,并且相對于2.4版本的內(nèi)核有相當大的改進。內(nèi)核在設備驅(qū)動方面增加了不少新功能,并且在sysfs文件系統(tǒng)、模塊文件格式、模塊使用計數(shù)、模塊加載和卸載函數(shù)的定義等做了改進。
本文采用了基于Linux2.6.29內(nèi)核的Fedora系統(tǒng)作為軟件開發(fā)平臺,該版本內(nèi)核對網(wǎng)絡設備和PCI設備驅(qū)動的接口和變量又做了進一步的封裝。
PCI總線具有的平臺無關(guān)特性使得PCI廣泛應用于IA-32、Alpha、PowerPC、SPARC64和 IA-64等眾多系統(tǒng)中。PCI設備在系統(tǒng)的引導階段由引導程序和操作系統(tǒng)自動完成對系統(tǒng)中所有PCI設備的配置,當PCI設備的驅(qū)動程序被掛載的時候,其內(nèi)存和I/O區(qū)域已經(jīng)被映射到了處理器的地址空間。
Linux內(nèi)核使用兩個重要的結(jié)構(gòu)體描述 PCI總線系統(tǒng)。pci_bus用于描述PCI總線,pci_dev用于描述PCI設備。由于PCI只是一種總線,其作為一種控制功能設備的手段而存在。因此,PCI設備的驅(qū)動程序應至少包括PCI驅(qū)動和設備驅(qū)動兩部分。Linux內(nèi)核使用pci_driver結(jié)構(gòu)體定義PCI驅(qū)動,該結(jié)構(gòu)體中包含PCI設備的加載/刪除、掛起/恢復等接口函數(shù)。PCI總線系統(tǒng)的3個主要結(jié)構(gòu)體在Linux內(nèi)核中的層次結(jié)構(gòu)和相互關(guān)系如圖2所示。
pci_bus結(jié)構(gòu)體中的pci_ops類型的指針ops指向該PCI總線所使用的配置空間訪問操作。pci_ops結(jié)構(gòu)體中包含read和write兩種操作可用于讀寫PCI配置空間,根據(jù)這兩個函數(shù)的參數(shù)可以定位到PCI總線上相應的PCI邏輯設備。Linux內(nèi)核提供了具體的配置空間操作接口 pci_read_config_byte(word/dword)和pci_write_config_byte(word/dword),可以方便的實現(xiàn)配置空間的字節(jié)、字和雙字的操作。如果驅(qū)動程序還不能獲得pci_dev對象,內(nèi)核提供了使用pci_bus對象作為參數(shù)的另外一對讀寫接口,pci_bus_read_config_byte(word/dword)和pci_bus_write_config_byte(word/dword)。
在Linux系統(tǒng)中,網(wǎng)絡設備不同于字符設備和塊設備,它作為一種獨立的特殊設備而存在,并且系統(tǒng)內(nèi)核提供了一系列專屬于它們的操作接口。
Linux內(nèi)核中的網(wǎng)絡設備驅(qū)動被設計成完全與協(xié)議無關(guān),網(wǎng)絡驅(qū)動程序通常不需要分析上層協(xié)議的數(shù)據(jù),只簡單的把這些數(shù)據(jù)作為其有效載荷數(shù)據(jù)進行傳輸。Linux系統(tǒng)對網(wǎng)絡設備驅(qū)動進行的分層結(jié)構(gòu)如圖3所示。
(1)協(xié)議接口層通過dev_queue_xmit()函數(shù)發(fā)送網(wǎng)絡層的數(shù)據(jù),硬件接收到的數(shù)據(jù)通過netif_rx()函數(shù)傳到網(wǎng)絡層,二者均以sk_buff結(jié)構(gòu)體作為參數(shù),這一層有效地將網(wǎng)絡協(xié)議和具體設備進行了隔離。
(2)設備接口層使用net_device結(jié)構(gòu)體描述了具體的網(wǎng)絡設備屬性和各種回調(diào)接口,系統(tǒng)將通過該結(jié)構(gòu)體調(diào)用驅(qū)動功能層提供的各功能函數(shù)。
(3)驅(qū)動功能層主要完成數(shù)據(jù)包的發(fā)送和接收,比如net_device_ops結(jié)構(gòu)體中的ndo_start_xmit()用于將數(shù)據(jù)包寫入具體的網(wǎng)絡設備。
(4)設備與媒介層表示了具體的數(shù)據(jù)傳輸載體,對于Linux系統(tǒng)而言,這個載體既可以是一個物理的網(wǎng)絡設備,也可以是一個在計算機內(nèi)存中構(gòu)造的完全虛擬的設備。對于本文來說則包含1553B總線終端和相關(guān)的芯片操作接口。
圖2 PCI總線層次結(jié)構(gòu)
圖3 Linux網(wǎng)絡設備驅(qū)動程序的分層結(jié)構(gòu)
另外,數(shù)據(jù)包的接收由硬件中斷引起,在中斷處理函數(shù)中讀取硬件接收的數(shù)據(jù),并通過dev_alloc_skb()申請一個sk_buff結(jié)構(gòu)體,將數(shù)據(jù)放入該結(jié)構(gòu)中,通過協(xié)議接口層的netif_rx()將其傳遞給上層協(xié)議。
TCP/IP網(wǎng)絡互連協(xié)議屬于對等的開放式網(wǎng)絡協(xié)議,它不僅平等對待所有網(wǎng)絡節(jié)點,而且不依賴于互連設備的實現(xiàn)細節(jié)。MIL-STD-1553B總線屬于高可靠性的仲裁機制總線,所有的數(shù)據(jù)傳輸服務都由BC(BusController)來控制的,這意味著1553B總線并非對等式的網(wǎng)絡協(xié)議,但這并不阻礙在1553B總線上實現(xiàn)IP網(wǎng)絡數(shù)據(jù)的傳輸。
通過編寫驅(qū)動程序使1553B接口卡變成Linux系統(tǒng)下的網(wǎng)絡設備,通過軟件控制1553B協(xié)議芯片將網(wǎng)絡層的數(shù)據(jù)包封裝進1553B消息幀完成傳輸。Linux內(nèi)核的網(wǎng)絡驅(qū)動中具有專門為以太網(wǎng)提供支持的通用接口,以太網(wǎng)接口上使用的tcpdump等網(wǎng)絡分析工具也有助于驅(qū)動程序的開發(fā)和使用。所以本文采用以太網(wǎng)模型開發(fā)1553B接口卡驅(qū)動。驅(qū)動程序共分為三層,由上到下依次為PCI驅(qū)動層,以太網(wǎng)驅(qū)動層,硬件接口層。
1553B接口卡通過PCI總線接入計算機系統(tǒng),因此PCI驅(qū)動是實現(xiàn)設計方案的基礎。定義一個pci_driver類型的全局對象,至少初始化對象中的name、id_table、probe和remove成員。在module_init()指定的驅(qū)動模塊裝載函數(shù)中通過調(diào)用pci_register_driver()注冊pci_driver類型的全局對象。系統(tǒng)將會執(zhí)行對象中的probe指針所設定的探測函數(shù),驅(qū)動程序需要在該函數(shù)內(nèi)實現(xiàn)PCI相關(guān)的初始化,并注冊以太網(wǎng)設備。
module_exit()指定的模塊刪除函數(shù)調(diào)用 pci_unregister_driver()對已注冊的pci_driver對象注銷時,系統(tǒng)將會執(zhí)行pci_driver對象的remove指針所設定的刪除函數(shù),驅(qū)動程序需要在該函數(shù)內(nèi)完成刪除模塊前的資源釋放,并注銷以太網(wǎng)設備,PCI層驅(qū)動的加載和刪除的控制流如圖4和圖5所示。
圖4 PCI驅(qū)動裝載
圖5 PCI驅(qū)動刪除
PCI驅(qū)動層使用alloc_etherdev()動態(tài)的申請以太網(wǎng)設備對象,并通過register_netdev()函數(shù)注冊該設備對象時將引起對象中的ndo_init成員所設定的回調(diào)函數(shù)的執(zhí)行,驅(qū)動程序需要在該函數(shù)內(nèi)完成網(wǎng)絡驅(qū)動層的初始化,比如net_device_ops中的設備操作函數(shù)指針、header_ops中的以太網(wǎng)幀頭操作函數(shù)指針的賦值,中斷申請和用于互斥訪問的自旋鎖的初始化,以及調(diào)用硬件操作接口對硬件芯片的初始化。
當刪除接口卡驅(qū)動模塊時,由PCI驅(qū)動層調(diào)用unregister_netdev()函數(shù)注銷以太網(wǎng)設備對象。對象的注銷會引起對象中的ndo_uninit()函數(shù)執(zhí)行,在該函數(shù)內(nèi)釋放中斷等系統(tǒng)資源,并關(guān)閉1553B通道,停止芯片工作。
1553B接口卡區(qū)別于以太網(wǎng)設備的地方在于數(shù)據(jù)的發(fā)送和接收。1553B協(xié)議芯片要求將要發(fā)送的數(shù)據(jù)寫入片內(nèi)RAM,之后需要等到下一次中斷的發(fā)生才能真正完成數(shù)據(jù)的傳輸,這期間如果寫入新的數(shù)據(jù)將會造成覆蓋,也就要求數(shù)據(jù)的發(fā)送和接收都在中斷里執(zhí)行。為了避免數(shù)據(jù)的覆蓋可以在驅(qū)動中維護一個發(fā)送隊列鏈表,將來自網(wǎng)絡層的數(shù)據(jù)包添加到鏈表的尾部,每次中斷從鏈表頭部提取數(shù)據(jù)寫入芯片。
1553B協(xié)議芯片要求以子地址為數(shù)據(jù)傳輸?shù)囊粋€單位,每個子地址一次最多可以傳輸64Bytes。但是,該實現(xiàn)中并沒有將網(wǎng)絡設備的MTU設定為64B,因為這會大大降低數(shù)據(jù)傳輸?shù)耐掏侣?。如果使用n(0 另外,真正的以太網(wǎng)卡只要在初始化時正確填寫了net_device對象的addr和addrlen成員,協(xié)議層就會自動使用ARP協(xié)議進行IP地址和硬件地址的轉(zhuǎn)換。但是1553B接口卡的硬件地址不同于以太網(wǎng),但是仍然使用以太網(wǎng)頭區(qū)分總線上不同的終端。驅(qū)動中需要包含一張表格用于保存總線上所有終端的RT地址和以太網(wǎng)地址的對應關(guān)系,在header_ops的create()函數(shù)中查詢該表用于確定數(shù)據(jù)包的目的RT地址,該函數(shù)在數(shù)據(jù)發(fā)送函數(shù)ndo_start_xmit()之前被用于建立硬件頭。 圖6 物理幀控制字 數(shù)據(jù)的發(fā)送和接收最終都要通過 1553B協(xié)議芯片BU61580實現(xiàn),BU61580的操作函數(shù)向以太網(wǎng)驅(qū)動層提供高效可靠的硬件操作接口。操作接口函數(shù)除基本的寄存器和RAM區(qū)讀寫函數(shù)ReadRegister/WriteRegister,ReadRam/WriteRam分為BC和RT兩個部分,分別完成終端的初始化、發(fā)送數(shù)據(jù)的寫入、讀取接收數(shù)據(jù)、1553B消息定義、幀定義等。 本文的實現(xiàn)中設置BC和RT的中斷模式為幀中斷,RT使用服務請求模式,當有數(shù)據(jù)傳輸時主動請求獲得總線時間。另外,減小BC的幀傳輸時間可以提高總線數(shù)據(jù)傳輸?shù)耐掏侣剩瑫r又要滿足每條總線消息的最小傳輸時間 (本文設置為1000us)。 搭建測試系統(tǒng)如圖7所示,其中Computer是一臺帶有以太網(wǎng)卡的計算機。GateWay是一臺裝有傳統(tǒng)以太網(wǎng)卡和1553B接口卡的計算機,1553B接口卡通過耦合器接入1553B總線,作為 BC同時運行所開發(fā)的以太網(wǎng)驅(qū)動。而計算機 RT11和RT1都裝有1553B接口卡,都最為1553B總線的遠程終端,并且只在RT11上運行所開發(fā)的以太網(wǎng)驅(qū)動。 圖7 測試系統(tǒng)框架(靜態(tài)分配IP地址) RT11和GateWay兩臺計算機之間使用ping程序測試,并使用tcpdump抓取網(wǎng)卡數(shù)據(jù)輸出如圖8所示。GateWay計算機上通過命令#route add–net 192.168.11.0 netmask 255.255.255.0添加一條路由表項,并運行命令#echo 1>/proc/sys/net/ipv4/ip_forward使得來自1553B總線上的數(shù)據(jù)包可以由GateWay進行路由轉(zhuǎn)發(fā)。RT11和DesktopComputer之間使用ping程序的測試數(shù)據(jù)如圖9所示。 開發(fā)基于TCP/IP的應用程序,對GateWay(server)和RT11(client)進行網(wǎng)絡性能的測試,結(jié)果顯示基于1553B總線的IP網(wǎng)絡的平均數(shù)據(jù)吞吐率為40KBps。增加用于某一方向上數(shù)據(jù)傳輸?shù)淖拥刂窋?shù)量,還可以提高該方向的數(shù)據(jù)吞吐率。 圖8 1553B總線內(nèi)互連測試 該實現(xiàn)方案的數(shù)據(jù)吞吐率沒有達到1553B總線的最大數(shù)據(jù)傳輸速率,主要是因為在中斷處理程序中首先要停止BU61580芯片,然后處理RAM中的所有數(shù)據(jù),完成后再啟動芯片繼續(xù)工作,并且在每條消息的數(shù)據(jù)中增加了2個字節(jié)的物理幀控制字,消耗了一定的總線時間。 本文介紹了一種基于1553B總線的IP網(wǎng)絡實現(xiàn)方法。在Linux2.6操作系統(tǒng)下,通過對1553B接口卡開發(fā)以太網(wǎng)驅(qū)動的方法實現(xiàn)了1553B消息對IP數(shù)據(jù)包的封裝和傳輸。使用該系統(tǒng)可以開發(fā)基于以太網(wǎng)的各種應用程序,并且可以實現(xiàn)與以太網(wǎng)等其它網(wǎng)絡的互連。 通過設置收發(fā)數(shù)據(jù)所使用的子地址數(shù)量還可以控制網(wǎng)絡的上下行帶寬,甚至可以保留一定數(shù)量的子地址用于傳統(tǒng)的1553B消息的傳輸。Linux系統(tǒng)中豐富的網(wǎng)絡數(shù)據(jù)分析工具均可用于該系統(tǒng)。 [1] 刑秀琴,姚竹亭.基于1553B總線的通信接口及其應用[J].中北大學學報(自然科學版),2007,28(1):91-94. [2] Ben Truitt R,Edward Sanchez,Michael Garis.Using open networking standards over MIL-STD-1553 networks[J].IEEE A&E Systems Magazine,2005,20(3):29-34. [3] PCI 9052 data book version 2.1[S].2008. [4] ACE/Mini-ACE series BC/RT/MT advanced communication engine integrate 1553 terminal user's guide[S].2003. [5] 邰全親,傅嵐,楊京松.基于以太網(wǎng)的1553B仿真測試設備設計[J].計算機測量與控制,2008,16(11):1559-1560. [6] 林宇,趙瑋,尚智,等.基于PCI總線的MIL-STD-1553B板卡設計[J].控制工程,2005(5):82-87. [7] 林生,范冰冰,張奇支,等.計算機網(wǎng)絡與因特網(wǎng)[M].北京:機械工業(yè)出版社,2009. [8] 宋寶華.Linux設備驅(qū)動開發(fā)祥解[M].北京:人民郵電出版社.2008. [9] 魏永明,耿岳,鐘書毅.Linux設備驅(qū)動程序[M].北京:中國電力出版社,2006. [10]Sreekrishnan Venkateswaran.Essential Linux device drivers[M].London:Prentice Hall,2008.3.3 硬件接口開發(fā)
4 測試與分析
5 結(jié)束語