許 坤,沈 偉,鄧 洲
(中國(guó)船舶重工集團(tuán)公司第七二三研究所,江蘇 揚(yáng)州 225101)
現(xiàn)代軟件開(kāi)發(fā)的一個(gè)趨勢(shì)是軟件構(gòu)件化[1]。軟件開(kāi)發(fā)的規(guī)模越來(lái)越大,功能越來(lái)越復(fù)雜,這對(duì)于軟件模塊的可靠性、可重用性提出了更高的要求。為了有效提高軟件開(kāi)發(fā)效率,縮短開(kāi)發(fā)周期[2-3],降低人力物力成本,基于構(gòu)件的軟件總線技術(shù)逐漸被廣泛應(yīng)用。
軟件總線是為保證軟件系統(tǒng)開(kāi)發(fā)過(guò)程規(guī)范性和系統(tǒng)應(yīng)用中的適用性以及可擴(kuò)展性而提出的一種設(shè)計(jì)思想。軟件總線是一種虛擬總線[4],這組總線可以為多種語(yǔ)言編寫(xiě)的不同類(lèi)型不同功能的程序服務(wù)。軟件總線是一組標(biāo)準(zhǔn)的軟件模塊,它為計(jì)算機(jī)操作系統(tǒng)、各種軟部件提供數(shù)據(jù)傳輸,并為這些程序提供虛擬共享的通道與接口界面[3]。
本文基于軟件總線技術(shù)設(shè)計(jì)了一種管控軟件,對(duì)某大型系統(tǒng)中電磁收發(fā)設(shè)備的頻譜使用進(jìn)行管理。該系統(tǒng)內(nèi)電子設(shè)備數(shù)量多、密度大、對(duì)電磁頻譜資源的占用存在較為嚴(yán)重的沖突,需要采取有效管理措施。本文設(shè)計(jì)的軟件,目的就是依據(jù)一定的決策規(guī)則對(duì)系統(tǒng)內(nèi)電子設(shè)備進(jìn)行管控,實(shí)現(xiàn)各電子設(shè)備的兼容協(xié)同工作。
軟件總線是一組虛擬的數(shù)據(jù)傳輸通道和即插即用的構(gòu)件集成框架,也就是提供數(shù)據(jù)傳輸通道的軟件及其標(biāo)準(zhǔn)接口[2],支持應(yīng)用程序間、軟件構(gòu)件間的功能共享和信息交互,能有效降低應(yīng)用程序之間、構(gòu)件之間的耦合度。
軟件總線一般完成4個(gè)基本功能[5]:
(1)通信功能:軟件總線的最重要功能,能夠?qū)崿F(xiàn)安裝在軟件總線上的由不同語(yǔ)言編寫(xiě)的異構(gòu)構(gòu)件之間的相互通信。
(2)構(gòu)件調(diào)度功能:實(shí)現(xiàn)軟件構(gòu)件庫(kù)的管理,完成對(duì)軟件構(gòu)件的安裝、卸載、調(diào)用。
(3)管理控制功能:解決對(duì)軟件總線的合理分配、有效使用等問(wèn)題。
(4)接口功能:解決軟件總線與不同語(yǔ)言編寫(xiě)的軟件構(gòu)件間的通信、數(shù)據(jù)傳輸?shù)慕涌趩?wèn)題。
“軟件總線+構(gòu)件”技術(shù),可以理解為面向?qū)ο蠹夹g(shù)的擴(kuò)展與提升。構(gòu)件是可復(fù)用軟件模塊,是被封裝的對(duì)象類(lèi)。構(gòu)件實(shí)現(xiàn)一定的功能,可以單獨(dú)開(kāi)發(fā)調(diào)試,調(diào)試完成后插入到軟件總線上使用[6]。軟件總線對(duì)構(gòu)件進(jìn)行組裝集成,使多個(gè)構(gòu)件以公共接口互相連接,實(shí)現(xiàn)構(gòu)件的即插即用。接口規(guī)范的統(tǒng)一,使軟件總線與構(gòu)件、構(gòu)件與構(gòu)件之間的通信復(fù)雜度大大降低。軟件總線的結(jié)構(gòu)模型見(jiàn)圖1。
圖1中,構(gòu)件安裝或加載到總線上,構(gòu)件間通過(guò)軟件總線進(jìn)行通訊,相互協(xié)作,完成較為復(fù)雜的功能;部分構(gòu)件通過(guò)不同層次的總線生成復(fù)合構(gòu)件,再插入底層軟件總線,實(shí)現(xiàn)系統(tǒng)的結(jié)構(gòu)分層,提供了一個(gè)可重用的軟件系統(tǒng)解決方案。
傳統(tǒng)軟件總線的設(shè)計(jì)思想,是著眼于網(wǎng)絡(luò)環(huán)境下的分布式應(yīng)用[7]。本文在單機(jī)系統(tǒng)中基于軟件總線技術(shù)進(jìn)行管控軟件開(kāi)發(fā),避免了分布式應(yīng)用中面臨的容錯(cuò)處理、負(fù)載平衡等比較繁瑣的問(wèn)題。軟件總線及各構(gòu)件之間的通信采用消息機(jī)制,降低了構(gòu)件間的耦合性,增強(qiáng)了系統(tǒng)的靈活性與可擴(kuò)展性。
管控軟件的框架見(jiàn)圖2。
圖2 管控軟件基本框架
在軟件框架中包含5類(lèi)模塊:總線調(diào)度模塊、驅(qū)動(dòng)模塊、策略模塊、設(shè)備信息處理模塊、顯示模塊,其功能描述如下:
總線調(diào)度模塊:創(chuàng)建軟件總線并維護(hù)其運(yùn)行;創(chuàng)建消息隊(duì)列并維護(hù)其運(yùn)行;對(duì)各軟構(gòu)件進(jìn)行安裝、注冊(cè)以及卸載。
驅(qū)動(dòng)模塊:包括網(wǎng)絡(luò)驅(qū)動(dòng)、串口驅(qū)動(dòng)、并口驅(qū)動(dòng)3種構(gòu)件。網(wǎng)絡(luò)驅(qū)動(dòng)為軟件系統(tǒng)提供了與外部進(jìn)行網(wǎng)絡(luò)信息交換的功能,包括UDP協(xié)議和TCP協(xié)議2種通信協(xié)議方式。串口驅(qū)動(dòng)為系統(tǒng)提供了與外部以RS232或RS422方式進(jìn)行串口通訊的功能。并口驅(qū)動(dòng)則為系統(tǒng)提供了與外部進(jìn)行I/O通訊的功能。
設(shè)備信息處理模塊:包括若干個(gè)設(shè)備信息處理構(gòu)件,每個(gè)構(gòu)件對(duì)應(yīng)被管控的一個(gè)外部電子設(shè)備。負(fù)責(zé)接收、處理、存儲(chǔ)外部設(shè)備的工作狀態(tài)及參數(shù),以及策略模塊下發(fā)的管理命令。
策略模塊:包括一個(gè)管控策略構(gòu)件。根據(jù)收集到的各外部設(shè)備的工作狀態(tài)、參數(shù),進(jìn)行電磁兼容態(tài)勢(shì)判斷,依據(jù)一定的決策規(guī)則,作出綜合決策,并發(fā)出管控命令。
顯示模塊:包括一個(gè)人機(jī)界面構(gòu)件。負(fù)責(zé)顯示各外部設(shè)備的工作狀態(tài)、參數(shù)以及對(duì)各外部設(shè)備下發(fā)的管理命令。
本文設(shè)計(jì)的軟件總線,核心是對(duì)構(gòu)件進(jìn)行集成的鏈表結(jié)構(gòu)以及構(gòu)件之間進(jìn)行通信的的消息機(jī)制。鏈表是一種物理存儲(chǔ)單元上非連續(xù)的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序通過(guò)鏈表中的指針鏈接次序?qū)崿F(xiàn)。鏈表由一系列結(jié)點(diǎn)組成。圖3描述了軟件總線的鏈表結(jié)構(gòu)。
圖3 軟件總線的鏈表結(jié)構(gòu)
這是一個(gè)雙向鏈表,可以從任意結(jié)點(diǎn)開(kāi)始,很方便地訪問(wèn)其前驅(qū)結(jié)點(diǎn)(通過(guò)prev指針)與后繼結(jié)點(diǎn)(通過(guò)next指針)。結(jié)點(diǎn)中包含一個(gè)構(gòu)件ID與指向該構(gòu)件對(duì)象的指針。對(duì)鏈表進(jìn)行遍歷操作,很容易實(shí)現(xiàn)對(duì)各構(gòu)件的訪問(wèn)。
構(gòu)件對(duì)象中包含數(shù)據(jù)、功能函數(shù),以及規(guī)范的消息處理接口函數(shù)。構(gòu)件之間交互通過(guò)消息機(jī)制實(shí)現(xiàn)。軟件總線作為各個(gè)構(gòu)件的集成平臺(tái),負(fù)責(zé)消息的傳遞、派發(fā)。軟件總線為構(gòu)件提供透明的服務(wù),使遵循總線接口規(guī)范的構(gòu)件實(shí)現(xiàn)即插即用。
消息中包含著構(gòu)件之間需要傳輸?shù)男畔ⅲ畔㈩?lèi)型包括設(shè)備狀態(tài)、數(shù)據(jù)、控制命令等,所以消息也有多種類(lèi)型。消息結(jié)構(gòu)中包含多個(gè)域,其定義如表1所示。
表1 消息結(jié)構(gòu)中的域說(shuō)明
構(gòu)件既是消息發(fā)生的主體與來(lái)源,也是消息派送的目的地。圖4描述了軟件總線的消息傳輸機(jī)制。應(yīng)用程序工作時(shí),總線調(diào)度模塊首先調(diào)用rngCreate函數(shù)創(chuàng)建1個(gè)ring buffer緩沖區(qū),這是1個(gè)FIFO型消息隊(duì)列,緩沖區(qū)的大小根據(jù)程序的需要而定。當(dāng)構(gòu)件由于外部事件驅(qū)動(dòng)而產(chǎn)生消息后,即調(diào)用rngBufPut函數(shù),把消息壓進(jìn)消息隊(duì)列。與此同時(shí),總線調(diào)度模塊中執(zhí)行著一個(gè)不斷從消息隊(duì)列中檢測(cè)消息的無(wú)限循環(huán),一旦讀到了有消息存在,就調(diào)用rngBufGet函數(shù)提取消息,并調(diào)用MsgDispatch函數(shù)進(jìn)行消息派送。消息派發(fā)的主要依據(jù)是消息中的目標(biāo)。從鏈表的首結(jié)點(diǎn)開(kāi)始,對(duì)目標(biāo)進(jìn)行構(gòu)件ID匹配,并按照鏈表的次序一直執(zhí)行到底。一旦檢測(cè)到有構(gòu)件的ID匹配成功,則由該構(gòu)件調(diào)用消息接收處理函數(shù),完成消息響應(yīng)。這個(gè)消息響應(yīng)有可能會(huì)導(dǎo)致該構(gòu)件發(fā)出新的消息,并進(jìn)而產(chǎn)生新一輪的消息循環(huán)。
在VxWorks系統(tǒng)中進(jìn)行如圖2所示的軟件總線框架設(shè)計(jì),基于雙向鏈表結(jié)構(gòu)和消息機(jī)制,由總線調(diào)度模塊把生成的若干構(gòu)件進(jìn)行集成。系統(tǒng)啟動(dòng)后,對(duì)構(gòu)件進(jìn)行注冊(cè)、初始化,開(kāi)始工作并等待消息。作為驅(qū)動(dòng)模塊的3個(gè)構(gòu)件:網(wǎng)絡(luò)驅(qū)動(dòng)、串口驅(qū)動(dòng)和并口驅(qū)動(dòng),將響應(yīng)外部事件的激勵(lì),接收外部設(shè)備的網(wǎng)絡(luò)報(bào)文、串口報(bào)文或I/O信號(hào),轉(zhuǎn)化為內(nèi)部消息發(fā)給相應(yīng)的設(shè)備信息處理構(gòu)件。收到消息的設(shè)備信息處理構(gòu)件從中提取并存儲(chǔ)設(shè)備狀態(tài)、數(shù)據(jù),再發(fā)出消息給管控策略構(gòu)件。管控策略作為業(yè)務(wù)處理核心構(gòu)件,根據(jù)收集到的各外部設(shè)備工作狀態(tài)、參數(shù),進(jìn)行全局電磁兼容態(tài)勢(shì)判斷,依據(jù)一定的決策準(zhǔn)則,作出綜合決策,以消息的形式發(fā)出管控命令給對(duì)應(yīng)的設(shè)備信息處理構(gòu)件。設(shè)備信息處理構(gòu)件再根據(jù)業(yè)務(wù)規(guī)則生成管理命令報(bào)文或數(shù)字量信息,發(fā)送消息給驅(qū)動(dòng)構(gòu)件,最終由驅(qū)動(dòng)構(gòu)件完成報(bào)文或I/O信號(hào)的發(fā)出。
圖4 軟件總線的消息傳輸機(jī)制
基于軟件總線技術(shù)進(jìn)行軟件系統(tǒng)開(kāi)發(fā),具有即插即用、靈活性、開(kāi)放性、易擴(kuò)展性等優(yōu)點(diǎn),大大提高了開(kāi)發(fā)效率,降低了開(kāi)發(fā)成本與難度,逐漸成為軟件開(kāi)發(fā)的主流技術(shù)。本文基于軟件總線技術(shù)設(shè)計(jì)的管控軟件,有效解決了某系統(tǒng)內(nèi)部的電磁頻譜沖突問(wèn)題,使系統(tǒng)內(nèi)各電子設(shè)備協(xié)同工作。該軟件框架具有通用性與可擴(kuò)展性,適用于單機(jī)系統(tǒng)的軟件開(kāi)發(fā)設(shè)計(jì)。