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