張亞航 郭堅 于俊慧
(北京空間飛行器總體設(shè)計部,北京 100094)
?
一種基于非面向?qū)ο笳Z言的星載軟件構(gòu)件技術(shù)
張亞航 郭堅 于俊慧
(北京空間飛行器總體設(shè)計部,北京 100094)
為了進一步提高星載軟件復(fù)用程度和解決航天器軟件開發(fā)效率低下的問題,對星載軟件特性和軟件構(gòu)件技術(shù)進行了分析和研究;對星載軟件構(gòu)件進行了定義,提出了一種基于非面向?qū)ο笳Z言的、適用于星載軟件開發(fā)和應(yīng)用環(huán)境的星載軟件構(gòu)件模型。基于該模型開發(fā)的星載軟件構(gòu)件,具備獨立性、完整性、可組裝性和功能性。除此之外,對基于這種模型的星載軟件構(gòu)件設(shè)計、開發(fā)和使用方法進行了介紹,可以為采用非面向?qū)ο笳Z言進行星載軟件構(gòu)件開發(fā)提供參考。在多個型號中對該技術(shù)展開實踐,實踐結(jié)果表明:提出的星載軟件構(gòu)件設(shè)計方法能夠?qū)⑿禽d軟件開發(fā)效率提高2~5倍。
開發(fā)效率;構(gòu)件模型;非面向?qū)ο笳Z言;復(fù)用;星載軟件;航天器
隨著我國航天事業(yè)的突飛猛進,航天器數(shù)量急劇增加,同時航天器星務(wù)軟件兼顧智能化、自主故障[1]等功能,軟件結(jié)構(gòu)越來越復(fù)雜。軟件復(fù)用技術(shù)日益成為星載軟件系統(tǒng)的規(guī)模和航天器軟件制造成本的瓶頸。
國內(nèi)研究者認識到了基于構(gòu)件的復(fù)用技術(shù)是軟件開發(fā)的趨勢,也提出了航天器“軟件工廠”的概念[2]。然而這些研究主要停留在概念層面,沒有明確提出星載軟件構(gòu)件應(yīng)該具備的特性和形態(tài),也沒有提出開發(fā)準(zhǔn)則。航天領(lǐng)域?qū)?gòu)件的認識并不相同,有的研究者認為構(gòu)件與可復(fù)用模塊等同[3],有的研究者仍然從結(jié)構(gòu)化編程的角度理解構(gòu)件,認為構(gòu)件是一個或多個可復(fù)用的函數(shù)[4-5]。隨著對航天器綜合電子軟件任務(wù)的分析,函數(shù)形式的復(fù)用難以實現(xiàn)功能級別的封裝與復(fù)用。而面向?qū)ο蟮睦碚摚梢詫崿F(xiàn)數(shù)據(jù)與邏輯的封裝。本文認為星載軟件構(gòu)件的設(shè)計思想仍然應(yīng)該參考面向?qū)ο蠓椒ㄕ摚⒕邆浞庋b、多態(tài)等特性,這與軟件工業(yè)界主流的構(gòu)件技術(shù)思路一致[6]。
然而軟件工業(yè)界的軟件構(gòu)件技術(shù),例如SUN的JavaBean系列標(biāo)準(zhǔn),OMG的CORBA系列標(biāo)準(zhǔn)和微軟的COM系列標(biāo)準(zhǔn),雖然相對完善和成熟,但由于受到以下條件限制,不能直接應(yīng)用于航天器綜合電子系統(tǒng):
1)語言環(huán)境約束:現(xiàn)有的軟件構(gòu)件設(shè)計方法往往基于面向?qū)ο笳Z言,而星載軟件鑒于任務(wù)特點和頻繁操作硬件等要求,往往采用匯編或C語言等非面向?qū)ο笳Z言進行開發(fā)[3-4]。
2)可靠性約束:航天領(lǐng)域要求星載軟件具備高可靠性,其遵循的編程規(guī)范存在特殊要求,例如不允許內(nèi)存動態(tài)開辟和回收操作。
3)資源約束:星載軟件運行環(huán)境空間受限,而Java和COM等構(gòu)件技術(shù),往往需要額外的運行環(huán)境確保構(gòu)件的運行[4]。
與此同時,學(xué)術(shù)界對非面向?qū)ο笳Z言(主要是C語言和匯編語言)構(gòu)件技術(shù)的研究中,或者其構(gòu)件模型仍然采用結(jié)構(gòu)化設(shè)計思想,以函數(shù)為顆粒[7],或者需要底層運行環(huán)境支持[8-9],或者需要內(nèi)存動態(tài)開辟[10],無法滿足航天器軟件高可靠性要求。
為此,本文提出星載軟件構(gòu)件定義,明確其應(yīng)具備的特性和對外接口形態(tài),具備封裝、多態(tài)等特性,并進一步提出采用非面向?qū)ο笳Z言實現(xiàn)星載軟件構(gòu)件的設(shè)計和使用方法,用于指導(dǎo)采用非面向?qū)ο笳Z言進行星載軟件構(gòu)件設(shè)計、開發(fā)、組裝和使用。最后,對提出的構(gòu)件模型和開發(fā)方法在多個型號展開了工程驗證。
不同的文獻,對于軟件構(gòu)件往往有不同的定義[11-13],如1995年,Ian.Oraham給出的構(gòu)件定義如下:構(gòu)件(Component)是指一個對象(接口規(guī)范或二進制代碼),它被用于復(fù)用,接口被明確定義;而Clemens Szyperski認為,一般來說,構(gòu)件(Component)是面向軟件體系架構(gòu)的可復(fù)用軟件模塊,其作為可復(fù)用的軟件組成成份,可被用來構(gòu)造其他軟件。這里,根據(jù)星載軟件運行特點和需求,參考主流軟件構(gòu)件模型,對星載軟件構(gòu)件進行自我定義,建立星載軟件構(gòu)件模型。
2.1 星載軟件構(gòu)件定義
由于在軟件工程領(lǐng)域,對構(gòu)件的定義并無統(tǒng)一的標(biāo)準(zhǔn),綜合工業(yè)界對軟件構(gòu)件的定義和星載軟件的特點,本文提出如下定義:
定義1 星載軟件構(gòu)件(本文中有時也將其簡稱為軟件構(gòu)件或構(gòu)件),指的是一個可獨立發(fā)布,并可以由第三方進行組裝的功能模塊,它滿足一定的航天器軟件需求,并通過接口提供服務(wù)。它應(yīng)具備四個基本屬性:
1)獨立性:構(gòu)件編譯時,需與其他構(gòu)件分離或程序分離,除了基本編譯環(huán)境,不能依賴構(gòu)件以外的數(shù)據(jù)或代碼,完成獨立編譯。
2)完整性:構(gòu)件發(fā)布時,構(gòu)件使用方不能訪問構(gòu)件內(nèi)部細節(jié),且不可拆分。
3)組裝性:構(gòu)件實例對外提供可見接口,構(gòu)件用戶能夠根據(jù)既定規(guī)則將構(gòu)件進行組裝。
4)功能性:必須具備具體的、明確的一個或多個功能,能夠被用戶調(diào)用,并在預(yù)定的運行環(huán)境下正確運行。
為了滿足以上定義,本文將星載軟件構(gòu)件分為兩類。一類稱為靜態(tài)構(gòu)件,運行前不需要實例化,以類似于庫函數(shù)的狀態(tài)存在,本文中不作詳細討論;另一類稱為動態(tài)構(gòu)件,運行前需要進行實例化,是本文討論的重點。在本文中所說的構(gòu)件,除了特殊說明外,都指動態(tài)構(gòu)件。
2.2 星載軟件構(gòu)件模型
圖1 星載軟件構(gòu)件模型結(jié)構(gòu) Fig.1 On-board software component model structure
如圖1所示,典型的星載軟件模型由對外接口、實現(xiàn)體和規(guī)約三個要素組成。其中,對外接口是構(gòu)件向用戶提供服務(wù)的惟一渠道;實現(xiàn)體為具有一定功能的源程序片段,實現(xiàn)對外接口所提供的服務(wù);規(guī)約作為對構(gòu)件的描述,是構(gòu)件使用說明書。其中,對外接口和規(guī)約對外可見,被用戶調(diào)用或被閱讀;實現(xiàn)體對外不可見,從而保證構(gòu)件的信息隱藏和獨立性。
為了精確描述星載軟件構(gòu)件模型,本文采用BNF范式的擴展范式EBNF[14]對構(gòu)件模型進行描述:
“< >”表示待描述的語法成分,“::=”表示語法成分定義,“|”表示“或者”關(guān)系,“{ }”表示重復(fù)1到多次,“[ ]”表示可選項,“( )”表示括號內(nèi)的成分優(yōu)先。
則星載軟件構(gòu)件模型滿足以下EBNF表達式:
1)<星載軟件構(gòu)件> ::= (<代碼體> | <子構(gòu)件結(jié)構(gòu)>) <對外接口> <構(gòu)件規(guī)約>
2)<對外接口> ::= <主結(jié)構(gòu)體> <初始化接口> [<配置接口>]
3)<構(gòu)件規(guī)約> ::= <構(gòu)件基本信息> <接口信息> <環(huán)境信息> <非功能特性>
4)<子構(gòu)件結(jié)構(gòu)> ::= {<子構(gòu)件>}
下面分別對構(gòu)件三要素進行詳細描述:
要素一:對外接口,封裝在.h文件中,對外可見,包括主結(jié)構(gòu)體、初始化接口、配置接口。
1)主結(jié)構(gòu)體:規(guī)定了構(gòu)件對象的結(jié)構(gòu),封裝了以下方面的信息。
——構(gòu)件屬性:包括變量和本構(gòu)件所包含的子構(gòu)件。
——構(gòu)件功能接口:提供構(gòu)件所有對外公開的服務(wù),由用戶調(diào)用,以函數(shù)指針的形式存在。
2)初始化接口:在任何構(gòu)件運行之前,必須先對主結(jié)構(gòu)體中的各變量賦予初值,即初始化;初始化接口就是提供給構(gòu)件用戶的操作渠道。
3)配置接口(可選):配置接口是可選的對外接口,主要包括兩種:與內(nèi)存配置相關(guān)的配置接口,以及構(gòu)件代碼動態(tài)編譯的相關(guān)配置接口。
要素二:實現(xiàn)體,具有一定功能的源程序片段,實現(xiàn)對外接口所提供的服務(wù),對外不可見。構(gòu)件編寫完成后,將源文件編譯成二進制文件發(fā)布。實現(xiàn)體主要包括:
1)初始化接口的函數(shù)體;
2)功能接口的函數(shù)體;
3)其他變量和代碼片段。
要素三:規(guī)約。
規(guī)約是對構(gòu)件的描述,在實現(xiàn)中以.h文件中的注釋形式存在。
基于本文第2.1節(jié)和第2.2節(jié)所述的星載軟件構(gòu)件定義和基本要素,本節(jié)以C語言為例,對基于C語言的綜合電子軟件構(gòu)件的具體實施規(guī)則進行詳細描述。
(1)構(gòu)件實體設(shè)計
1)對于某個C語言星載軟件構(gòu)件Component來說,其由一個實現(xiàn)體文件(例如Component.c)和對外接口文件(例如Component.h)組成;
2)構(gòu)件初始化函數(shù)命名規(guī)則:Component.c中的初始化函數(shù)名稱應(yīng)當(dāng)為ComponentInit(),其中Component表示構(gòu)件名稱。
(2)對外接口設(shè)計
構(gòu)件所有可見信息都封裝在對外接口文件中,對外接口文件包含本構(gòu)件所有對外接口和構(gòu)件規(guī)約,具體設(shè)計為:
1)對外接口文件必須聲明本構(gòu)件的主結(jié)構(gòu)體,主結(jié)構(gòu)體規(guī)定了構(gòu)件對象的結(jié)構(gòu),從主結(jié)構(gòu)體可以實例化出多個構(gòu)件對象;
2)對外接口文件必須聲明本構(gòu)件所包含的其他所有子構(gòu)件SubComponent_1,…,SubComponent_n;
3)對外接口文件必須聲明本構(gòu)件的初始化接口;
4)Component.h文件可能聲明本構(gòu)件的配置接口,其中包括兩類配置接口:
——內(nèi)存分配配置接口:有些構(gòu)件對象,在運行時需要分配額外的內(nèi)存空間,但是在某些特定的航天星載軟件運行環(huán)境中,操作系統(tǒng)無法提供動態(tài)內(nèi)存分配功能。此時,通過在構(gòu)件主結(jié)構(gòu)體中定義數(shù)組的形式進行內(nèi)存預(yù)分配。
——選擇編譯配置接口:為了實現(xiàn)構(gòu)件的通用性,構(gòu)件往往會實現(xiàn)相關(guān)功能的最大包絡(luò)。但是在具體工程中,構(gòu)件用戶根據(jù)自身需求,可能只用到該構(gòu)件提供的部分功能。此時為了降低代碼冗余,構(gòu)件頭文件可以以宏定義、選擇編譯的形式對有效代碼進行選擇編譯。
(3)構(gòu)件實現(xiàn)體的設(shè)計
構(gòu)件的實現(xiàn)體,一般情況下對用戶不可見;實現(xiàn)體中的內(nèi)容在編寫時以代碼塊或函數(shù)體等形式存在,包括初始化接口的函數(shù)體、功能接口的函數(shù)體,還有其他一些必備的代碼:
1)初始化接口的函數(shù)體實現(xiàn),以ComponentInit(參數(shù)1,參數(shù)2,……)函數(shù)形式存在。本函數(shù)實現(xiàn)對本構(gòu)件運行時初始化,必須實現(xiàn)以下功能:
——本構(gòu)件對象所有屬性初始化;
——本構(gòu)件所包含的所有子構(gòu)件初始化(如果有子構(gòu)件,則同樣的,子構(gòu)件初始化包括當(dāng)前所述的三個功能);
——將本構(gòu)件主結(jié)構(gòu)體所聲明的功能接口與所對應(yīng)的功能函數(shù)掛接。
2)函數(shù)體:除了靜態(tài)構(gòu)件和初始化函數(shù),其他所有的函數(shù)體,其第一個參數(shù)必須是指向當(dāng)前構(gòu)件實例的指針,例如ComponentFun(struct Component*this_obj,參數(shù)1,……)。
3)信息隱藏:構(gòu)件實現(xiàn)體的任何函數(shù)和全局變量,都需聲明為對外不可見。
(4)構(gòu)件規(guī)約設(shè)計
構(gòu)件規(guī)約作為星載軟件構(gòu)件的使用說明書,由構(gòu)件設(shè)計者提供,向構(gòu)件用戶提供本構(gòu)件能夠使用的一切說明信息。用戶將根據(jù)這些信息進行構(gòu)件的選擇和使用,其至少需包括:
1)構(gòu)件基本信息:包括構(gòu)件的作者、版本、構(gòu)件名稱、發(fā)布日期等信息。
2)構(gòu)件接口信息:包括接口提供的功能、接口名稱、接口參數(shù)。
3)構(gòu)件環(huán)境信息:包括構(gòu)件的使用場景、依賴的軟件環(huán)境、局限性等信息。
4)非功能特性:通常情況下包含該構(gòu)件的性能及可用性描述。
(5)構(gòu)件發(fā)布
1)所有子構(gòu)件的文件(包括二進制文件和對外接口文件)與Component文件共同進行編譯,形成完整的構(gòu)件;
2)構(gòu)件可以向下包含子構(gòu)件,不同的構(gòu)件可以包含相同的子構(gòu)件,但是不得出現(xiàn)構(gòu)件包含環(huán),如A包含B,B包含C,C包含A;
3)用戶使用時,只有構(gòu)件規(guī)約、構(gòu)件頭文件和編譯后的二進制文件,構(gòu)件實現(xiàn)體不向用戶提供。
構(gòu)件組裝的任務(wù)是在系統(tǒng)框架下,集成已選取的構(gòu)件形成整個系統(tǒng),是基于構(gòu)件軟件開發(fā)的核心過程。
4.1 直接連接關(guān)系(包含與被包含關(guān)系)
圖2 構(gòu)件A和B之間關(guān)系 Fig.2 Relationship between A and B
本文定義的構(gòu)件與構(gòu)件的直接關(guān)系,只有包含與被包含關(guān)系。這使得構(gòu)件與構(gòu)件的關(guān)系簡潔明了,并保證了構(gòu)件對用戶的獨立性和完整性。
如果某個星載軟件構(gòu)件A存在對另外構(gòu)件B的服務(wù)存在直接調(diào)用,根據(jù)本文第3.1節(jié)中星載軟件構(gòu)件獨立性原則,構(gòu)件A必須采用包含子構(gòu)件的方式,實現(xiàn)對被依賴構(gòu)件B所提供服務(wù)的調(diào)用。構(gòu)件B將作為構(gòu)件A的一部分(子構(gòu)件)發(fā)布。構(gòu)件A和構(gòu)件B采用統(tǒng)一建模語言UML描述,其靜態(tài)關(guān)系如圖2所示。
因此,一個基于軟件構(gòu)件的系統(tǒng)或構(gòu)件的生產(chǎn)過程,實際上是對已有構(gòu)件的選取、包含和使用。
4.2 間接連接關(guān)系(構(gòu)件連接子)
圖3 構(gòu)件A、B、C之間關(guān)系 Fig.3 Relationship among component A, B and C
但是,在一些設(shè)計場景下,包含與被包含關(guān)系不能完全體現(xiàn)構(gòu)件之間的關(guān)系。考慮一種設(shè)計場景:構(gòu)件A能夠?qū)ζ渌活悵M足所需特定結(jié)構(gòu)的任意構(gòu)件對象提供相對通用的服務(wù)(例如排序操作)。構(gòu)件B和構(gòu)件C都能滿足這類特定結(jié)構(gòu)(例如具備優(yōu)先級和比較能力)。用戶或上層構(gòu)件應(yīng)用程序希望使用構(gòu)件A的對象a所提供的服務(wù)QuickSort對構(gòu)件B和構(gòu)件C的對象進行操作。
此時,構(gòu)件A、B、C之間的采用統(tǒng)一建模語言UML描述,其靜態(tài)關(guān)系如圖3所示。
但是作為構(gòu)件提供方,如果任意使用構(gòu)件A提供服務(wù)的其他構(gòu)件,都必須與A作為一個整體發(fā)布,存在以下問題:
1)構(gòu)件A本身難以獨立,因為可能存在許多不同的構(gòu)件對象都需要排序服務(wù),A無法與所有的這些對象都作為整體發(fā)布。
2)根據(jù)構(gòu)件獨立性原則,顯然在構(gòu)件A發(fā)布之后新發(fā)布的其他構(gòu)件將無法再使用A的服務(wù)。
3)難以對多個不同類型的構(gòu)件對象同時進行共同操作。
因此,必須提出一種手段,使得構(gòu)件A、B、C三者之間不存在包含關(guān)系,能夠分別獨立發(fā)布,又能夠相互調(diào)用彼此的服務(wù)。由此,本文引入構(gòu)件連接子的概念。
定義2 星載軟件構(gòu)件連接子(本文中有時也將其簡稱為構(gòu)件連接子或連接子)指的是一種結(jié)構(gòu),用于描述兩個或多個相互獨立的構(gòu)件之間的數(shù)據(jù)結(jié)構(gòu)關(guān)系。連接子沒有對應(yīng)的實現(xiàn)體。
仍然考慮上述場景:通過引入第三方構(gòu)件連接子X規(guī)定該特定結(jié)構(gòu)。構(gòu)件A在發(fā)布的時候,同時發(fā)布一種結(jié)構(gòu)連接子X(具備優(yōu)先級priority屬性并通過GetPriority獲取和比較方法Compare函數(shù)),并宣稱任意具備X結(jié)構(gòu)的構(gòu)件,都能夠采用構(gòu)件A所提供的服務(wù),對連接子X的描述如下:
Connector X
{
Interface1: Compare()
Interface2: GetPriority()
}
構(gòu)件B和C的提供方在編寫B(tài)和C的時候,無需知道構(gòu)件A的具體結(jié)構(gòu),只需要包含連接子X結(jié)構(gòu),使得構(gòu)件B和C具備連接子X的形態(tài)。即可令構(gòu)件B和構(gòu)件C的對象采用構(gòu)件A的服務(wù)。
當(dāng)構(gòu)件B和C類型的某個對象需要構(gòu)件A的對象所提供的服務(wù)時,雖然A、B和C相互獨立,即不知道其他兩方的任何信息,但是由于他們都知道連接子X的信息,因此可以通過X形成橋梁完成三者的相互左右。典型的步驟如下:
圖4 加入連接子X構(gòu)件A、B、C之間關(guān)系 Fig.4 Relationship among componentA, B, C with connector X
步驟一:分別聲明構(gòu)件A的實例a,構(gòu)件B的實例b,構(gòu)件C的實例c。
步驟二:將b抽象化成連接子類型的x1。
步驟三:將c抽象化成連接子類型的x2。
步驟四:a對抽象后的連接子元素x1和x2進行操作或提供服務(wù)。
步驟五:完成服務(wù)后,根據(jù)反射機制將x1和x2還原成原有構(gòu)件類型。
此時,構(gòu)件A、B、C和連接子X之間的關(guān)系如圖4所示。注意,圖4中某個B的對象只能包含一個X類型數(shù)據(jù),對C來說也是如此。構(gòu)件A對連接子X是依賴關(guān)系。通過構(gòu)件連接子,可以使得構(gòu)件之間建立聯(lián)系,進而將軟件構(gòu)件組裝成復(fù)雜的軟件系統(tǒng),同時各個構(gòu)件又能夠保持各自的獨立性。
本方法已經(jīng)在部分型號任務(wù)得到了初步驗證。由于工作量和成本限制,難以將同一型號采用不同的手段開發(fā)4遍。為了能夠?qū)?gòu)件應(yīng)用情況進行分析,本文選取同一產(chǎn)品類型的,包含相同功能項4個的型號任務(wù),且這4個任務(wù)由同一團隊開發(fā),分別記為任務(wù)甲、乙、丙、丁。
其中任務(wù)甲采用傳統(tǒng)的手工代碼編寫方式實現(xiàn)軟件,任務(wù)乙繼承甲軟件體系結(jié)構(gòu),部分功能采用構(gòu)件化設(shè)計。任務(wù)丙和任務(wù)丁在更大范圍進行了構(gòu)件化設(shè)計和應(yīng)用。本節(jié)對星載軟件構(gòu)件設(shè)計和組裝方法在多個型號研制中的試驗情況進行分析,并對比型號軟件在應(yīng)用構(gòu)件化設(shè)計方法前后的開發(fā)效率和資源消耗情況。相關(guān)數(shù)據(jù)如表1所示。
表1 星載軟件構(gòu)件應(yīng)用相關(guān)數(shù)據(jù)
5.1 構(gòu)件化開發(fā)技術(shù)對型號研制效率的影響分析
圖5 多個型號任務(wù)中構(gòu)件應(yīng)用規(guī)模與開發(fā)效率關(guān)系 Fig.5 Relationship between component utilization and software develop efficiency in Missions
隨著軟件構(gòu)件化程度的提高,一般來說研制效率會得到提升。本節(jié)將對構(gòu)件技術(shù)相對型號軟件研制帶來的效率提升實際效果進行分析和說明。
多個型號任務(wù)中構(gòu)件應(yīng)用規(guī)模與開發(fā)效率關(guān)系如圖5所示??梢钥闯?,隨著型號中構(gòu)件復(fù)用程度的上升,型號開發(fā)的效率越來越高。見效最為明顯的是任務(wù)甲到乙。從乙到丁開始,隨著構(gòu)件功能覆蓋度增加,型號開發(fā)效率在仍在不斷提高。根據(jù)第2.2節(jié)中的介紹,型號軟件開發(fā)時,研制人員需要對需求進行細致的分析,從而選擇合適的軟件構(gòu)件,這部分的時間無法省略,因此從乙到丁效率提高趨勢會逐步減緩。
如果認為以上型號功能大致在同一等級,則顯然,隨著構(gòu)件化技術(shù)的深入應(yīng)用,軟件研制速度得到極大提高。
5.2 構(gòu)件化開發(fā)技術(shù)對型號代碼量分析
圖6 復(fù)用構(gòu)件數(shù)量和代碼總行數(shù)趨勢 Fig.6 Relationship between component utilization and code linage
由于構(gòu)件采用了通用化設(shè)計,有研究者擔(dān)心通用設(shè)計將帶來代碼量的提升,進而提高衛(wèi)星資源(例如PROM)占用度,這里將對實際型號代碼量進行統(tǒng)計和分析。
具備類似功能的型號應(yīng)用構(gòu)件數(shù)量和代碼總行數(shù)趨勢如圖6所示??梢钥闯?,隨著型號對軟件構(gòu)件復(fù)用個數(shù)的增加,整星綜合電子或數(shù)管應(yīng)用軟件的總代碼行數(shù)不但沒有上升,反而呈下降趨勢,以任務(wù)丙最為明顯。這是因為構(gòu)件代碼經(jīng)過多次復(fù)用,往往代碼結(jié)構(gòu)經(jīng)過了多次優(yōu)化,比較精煉,另外在型號內(nèi)部構(gòu)件可以派生多個實例,以實現(xiàn)相同功能(例如需要若干個遙測虛擬信道,只需要聲明多個遙測虛擬信道構(gòu)件實例即可)。
本文提出了一種基于非面向?qū)ο笳Z言的星載軟件構(gòu)件設(shè)計方法,通過以下手段解決了星載軟件運行環(huán)境和使用要求對軟件構(gòu)件的需求:
1)本文提出的星載軟件構(gòu)件模型和設(shè)計方法完全基于非面向?qū)ο笳Z言,但是具備主流構(gòu)件封裝性、獨立性、可組裝(連接)等特點。
2)結(jié)合構(gòu)件主結(jié)構(gòu)體和配置接口,使得構(gòu)件能夠通過聲明主結(jié)構(gòu)體的方式派生構(gòu)件實例,形成構(gòu)件實例運行內(nèi)存,避免了對內(nèi)存的動態(tài)開辟和回收;同時主結(jié)構(gòu)體與實現(xiàn)體的函數(shù)指針調(diào)用方式,可以通過在軌修改函數(shù)指針指向地址,從而輕易實現(xiàn)對構(gòu)件實例的在軌維護。
3)本文提出的星載軟件構(gòu)件設(shè)計方法,完全基于現(xiàn)有的星載軟件開發(fā)和運行環(huán)境,無需安裝額外的運行環(huán)境。
根據(jù)本文的方法開發(fā)出了若干星載軟件構(gòu)件,在多個型號任務(wù)中展開了應(yīng)用,并且對應(yīng)用效果進行了統(tǒng)計和分析。通過分析可以看到,本文提出的星載軟件構(gòu)件設(shè)計和實現(xiàn)方法具備以下優(yōu)點:
1)星載軟件構(gòu)件的可組裝性特點,使得大量的功能通過構(gòu)件組裝的形式實現(xiàn)。用戶在使用時無需知道構(gòu)件的內(nèi)部結(jié)構(gòu),且只需要根據(jù)規(guī)約獲得構(gòu)件信息,大大提高了軟件開發(fā)效率。
2)星載軟件構(gòu)件的獨立性,保證了構(gòu)件代碼以構(gòu)件為粒度完整的復(fù)用,被復(fù)用的構(gòu)件無需進行構(gòu)件內(nèi)部功能測試,大大提高了代碼可靠性,提高了軟件質(zhì)量。
[1] 陳志明, 劉海穎, 葉偉松.“天巡一號”微小衛(wèi)星星務(wù)故障管理設(shè)計[J]. 中國空間科學(xué)技術(shù), 2014,34(4): 79-83.
CHEN ZHIMING, LIU HAIYING, YE WEISONG. Fault management design of NHTX-1 SAT service system[J]. Chinese Space Science and Technology, 2014, 34(4):79-83.
[2] GUO JIAN,ZHENG XINHUA,ZHANG YAHANG. Produce space software from software factory[C].64thInternational Astronautical Congress,Beijing,2013.
[3] 郭堅, 葉志玲, 陸嵐. 星載軟件復(fù)用技術(shù)探討[J]. 計算機測量與控制, 2007, 15(4):541-546.
GUO JIAN, YE ZHILING, LU LAN. Discussion on technology for onboard software reuse[J]. Computer Measurement & Control, 2007, 15(4):541-546.
[4] 顧斌, 杜建偉, 楊春河. 構(gòu)件技術(shù)在航天器控制軟件開發(fā)中的應(yīng)用研究[C]. 2006中國科協(xié)年會,北京,2006.
GU BIN, DU JIANWEI, YANG CHUNHE. Research of component in spacecraft control software[C]. 2006 China Science Association Conference,Beijing,2006.
[5] 何熊文, 孫勇. 一種衛(wèi)星數(shù)管中心計算機軟件的工程實現(xiàn)[J]. 航天器工程, 2007, 16(5):47-53.
HE XIONGWEN, SUN YONG. Engineering realization of software in central terminal unit of satellite data management system[J]. Spacecraft Engineering,2007, 16(5):47-53.
[6] HAFEDH MILI,FATMA MILI,ALI MILI.Reusing software: issue and research direction[J].IEEE Transactions on Software Engineering, 1995, 21(6):528-535.
[7] 黃奉孝, 高艷華, 張學(xué)軍. 基于嵌入式構(gòu)件的編程語言融合技術(shù)研究[J]. 計算機工程與設(shè)計, 2012, 33(11):4138-4141.
HUANG FENGXIAO, GAO YANHUA, ZHANG XUEJUN. Research on programming language′s syncretic technology based on embedded component[J]. Computer Engineering and Design, 2012, 33(11) : 4138-4141.
[8] MARION POLL F. Object-oriented approach to fast display of electrophysiological data under MS-WINDOWS[J]. Neurosci Methods, 1995, 63:197-204.
[9] MICROSOFT. Advanced COM Interop .NET framework developer′s guide[S]. Microsoft Corporation, 2003. http:∥www.msdn.microsoft.com.
[10] 梅巖, 王力生. 基于構(gòu)件的嵌入式操作系統(tǒng)開發(fā)平臺的設(shè)計[J]. 計算機工程, 2006, 32(11):97-99.
MEI YAN, WANG LISHENG, Design of component-based embedded operating system development platform[J]. Computer Engineering,2006,32(11):97-99.
[11] SZYPERSKI C, GRUNTZ D, MURER S. Component software: beyond object-oriented programming[M].2nd ed.Beijing:Publishing House of Electronics Industry,2004.
[12] AOYAMA M. Component-based software engineering: Can it change the way of software development[C]∥ Proceedings of the International Conference on Software Engineering, 1998(2):111-120.
[13] BRUCE ECKEL, CHUCK ALLISON. Thinking in C++[M].Beijing:China Machine Press,2004.
[14] WIRTH N. What can we do about the unnecessary diversity of notation for syntactic definition [J]. Communications of the ACM,1977, 20(11): 822-823.
張亞航 1985年生,2010年獲北京大學(xué)軟件工程專業(yè)碩士學(xué)位,工程師。研究方向為星載軟件設(shè)計、綜合電子、空間信息安全。
(編輯:楊嬋)
Research of On-board Software Components Based on Non-object Oriented Language
ZHANG Yahang GUO Jian YU Junhui
(Beijing Institute of Spacecraft System Engineering, Beijing 100094)
In order to further improve the reusability of the on-board software and to solve the problem of the on-board software inefficient development, the characteristics of the spacecraft software and the software component technology were analyzed.Then a definition of the on-board software component was given, and an on-board software component model suitable for spacecraft was proposed based on the non-object oriented language. The on-board software components are independent, integrate, assemble and functional. Besides, the method for the on-board software component design, develop and implement was described. It can be the guide of the on-board software component development based on the non-object oriented language. Some examples were given, in which the software systems were developed according the proposed method.The results show that spacecraft software component development methods are effective, and the spacecraft software development efficiency can be increased by 200%~500%.
Develop efficiency;Component model;Non-object oriented language;Reusability;On-board software;Spacecraft
總裝備部預(yù)先研究(513200702)資助項目
2014-11-19。收修改稿日期:2015-03-31
10.3780/j.issn.1000-758X.2015.04.006