趙昶宇,胡 平
(1.天津津航計(jì)算技術(shù)研究所,天津300308;2.海軍工程大學(xué)艦船與海洋學(xué)院,湖北 武漢430033)
隨著計(jì)算機(jī)技術(shù)的飛速發(fā)展,如今的嵌入式系統(tǒng)的復(fù)雜程度也變得越來(lái)越高,嵌入式系統(tǒng)的內(nèi)部接口和外部接口類型和種類也越來(lái)越豐富,對(duì)嵌入式系統(tǒng)的軟件設(shè)計(jì)和編碼人員也提出了較高的挑戰(zhàn)。目前嵌入式系統(tǒng)常見(jiàn)的接口類型有以太網(wǎng)接口、RS422A接口、RS485接口、CAN總線接口、1553B接口、模擬量信號(hào)和離散量信號(hào)等。接口通訊代碼程序的開(kāi)發(fā)已經(jīng)成為嵌入式系統(tǒng)軟件開(kāi)發(fā)中的重要方面,它所占的開(kāi)發(fā)比例也越來(lái)越大。一般來(lái)講,嵌入式系統(tǒng)軟件中接口通訊代碼是根據(jù)具體的接口通訊協(xié)議設(shè)計(jì)編制的,也就是說(shuō)接口通信代碼和通訊協(xié)議之間的耦合度非常高。通訊協(xié)議有細(xì)微改動(dòng),都有可能需要修改接口通訊軟件代碼。軟件設(shè)計(jì)和編碼人員需要花費(fèi)相當(dāng)大的精力用于維護(hù)該部分代碼,這樣做不僅導(dǎo)致嵌入式接口通訊代碼的開(kāi)發(fā)效率低下,也使得接口通訊代碼的可靠性和可維護(hù)性大大降低。
在嵌入式系統(tǒng)接口通訊軟件中,通常使用接口控制文檔(InterfaceControlDocuments,以下簡(jiǎn)稱“ICD”)來(lái)描述和維護(hù)各個(gè)接口之間的關(guān)系,ICD的最大優(yōu)點(diǎn)是通用性強(qiáng),并且獨(dú)立于開(kāi)發(fā)平臺(tái)和任務(wù)[1]。為了解決現(xiàn)有接口通訊軟件代碼開(kāi)發(fā)效率低、可靠性不高的問(wèn)題,本文基于ICD特點(diǎn)提出一種軟件代碼的自動(dòng)生成方法。該方法通過(guò)對(duì)ICD配置文件的讀取和分析,能夠自動(dòng)實(shí)現(xiàn)并生成接口通訊軟件代碼的功能。后續(xù)接口通訊協(xié)議發(fā)生變化了,無(wú)需改動(dòng)接口通訊代碼,只需要修改ICD配置文件即可自動(dòng)生成新的接口通訊軟件代碼,極大地提高了軟件開(kāi)發(fā)效率和可靠性。
ICD通常是一種以數(shù)據(jù)庫(kù)方式的結(jié)構(gòu)化樹(shù)形圖來(lái)進(jìn)行描述,由于不同類型總線采用的通訊協(xié)議不同,或是同一種類型總線的數(shù)據(jù)幀格式不同,因此在進(jìn)行ICD數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí),需要根據(jù)不同的總線類型進(jìn)行分別分析,包括數(shù)據(jù)幀頭、數(shù)據(jù)字段、數(shù)據(jù)校驗(yàn)位和數(shù)據(jù)幀尾。總線類型首先應(yīng)該作為ICD結(jié)構(gòu)樹(shù)中的單獨(dú)一層節(jié)點(diǎn),總線類型相同但是數(shù)據(jù)幀格式不同的也應(yīng)該單獨(dú)作為ICD結(jié)構(gòu)樹(shù)中的一層節(jié)點(diǎn)。
為了提高后期自動(dòng)生成代碼的效率,將每一個(gè)ICD結(jié)構(gòu)樹(shù)都保存在一個(gè)對(duì)應(yīng)的數(shù)據(jù)庫(kù)中[2]。每個(gè)數(shù)據(jù)庫(kù)中建立一張表,表中包括建庫(kù)時(shí)間、信號(hào)類型、備注信息等內(nèi)容,將這張表取名為ICD_Explain。如果總線類型相同,則需要建立一張信號(hào)類型表,表中包括數(shù)據(jù)幀標(biāo)識(shí)號(hào)、數(shù)據(jù)幀名稱、數(shù)據(jù)頻率、數(shù)據(jù)塊數(shù)量、數(shù)據(jù)塊內(nèi)容、板卡號(hào)、通道號(hào)、接收/發(fā)送狀態(tài)等,將這張表取名為ICD_BusType_Explain。對(duì)于相同總線類型中具有相同數(shù)據(jù)幀格式的報(bào)文建立一張對(duì)應(yīng)的數(shù)據(jù)表,表中包括該數(shù)據(jù)幀的參數(shù)標(biāo)識(shí)號(hào)、參數(shù)名稱、數(shù)據(jù)幀起始位置、數(shù)據(jù)幀長(zhǎng)度、數(shù)據(jù)幀類型、LSB、狀態(tài)信息、參數(shù)最小值、參數(shù)最大值以及數(shù)據(jù)幀的步長(zhǎng)等,將這張表取名為ICD_BusType_FrameName。
上述定義的ICD庫(kù)文件包含了接口通訊軟件中所有的總線接口數(shù)據(jù)規(guī)范[3],涵蓋各個(gè)子系統(tǒng)之間、子系統(tǒng)內(nèi)部各個(gè)設(shè)備之間以及設(shè)備內(nèi)部各個(gè)模塊之間的數(shù)據(jù)接口格式定義。有了這些ICD數(shù)據(jù)庫(kù)文件,代碼的自動(dòng)生成技術(shù)可以很方便地通過(guò)對(duì)通訊協(xié)議的自動(dòng)分析,實(shí)現(xiàn)對(duì)每個(gè)通訊接口數(shù)據(jù)的自動(dòng)打包和解包處理。一旦通訊協(xié)議發(fā)生變化,無(wú)需修改軟件代碼,只需替換相應(yīng)的ICD數(shù)據(jù)庫(kù)文件即可。接口通訊軟件的ICD配置文件結(jié)構(gòu)如圖1所示。
圖1 接口通訊軟件ICD配置文件結(jié)構(gòu)圖
XML(可擴(kuò)展標(biāo)記語(yǔ)言)被設(shè)計(jì)用來(lái)傳輸和存儲(chǔ)數(shù)據(jù),它具有很強(qiáng)的跨平臺(tái)可移植性,且存儲(chǔ)數(shù)據(jù)基于文本不需要轉(zhuǎn)換。XML模板生成格式主要采用以下規(guī)則。
XML節(jié)點(diǎn)具有層次化的特點(diǎn)。利用XML的子節(jié)點(diǎn)創(chuàng)建一顆樹(shù)型結(jié)構(gòu),子節(jié)點(diǎn)的輸出內(nèi)容通常比父節(jié)點(diǎn)要多縮進(jìn)一個(gè)Tab。
節(jié)點(diǎn)名稱具有層次化的特點(diǎn)。同一父節(jié)點(diǎn)下的子節(jié)點(diǎn)之間如果名稱相同,則在輸出內(nèi)容時(shí)的縮進(jìn)是相同的;如果名稱不相同,則同一父節(jié)點(diǎn)下名稱編號(hào)大的比名稱編號(hào)小的子節(jié)點(diǎn)在輸出內(nèi)容時(shí)要多縮進(jìn)一個(gè)Tab。
節(jié)點(diǎn)內(nèi)容具有層次化的特點(diǎn)。在節(jié)點(diǎn)內(nèi)容中加入一個(gè)“ ”表示一個(gè)縮進(jìn),加入多少個(gè)“ ”表示輸出內(nèi)容時(shí)縮進(jìn)多少個(gè)Tab。一個(gè)節(jié)點(diǎn)內(nèi)容對(duì)應(yīng)一行目標(biāo)代碼,若輸出新的節(jié)點(diǎn)內(nèi)容時(shí)需增加回車換行。
XML模板驗(yàn)證包括DTD(文檔類型定義)和XML Schema,前者用于定義XML文檔的合法構(gòu)建模塊,后者除了具備前者功能外,還具有良好的可擴(kuò)展性。
XML解析是XML模板生成的逆向過(guò)程,它通過(guò)XML模板生成格式讀取XML模板信息并生成標(biāo)準(zhǔn)格式的目標(biāo)代碼。
圖2為ICD配置文件自動(dòng)生成代碼的原理圖。在圖2中,ICD庫(kù)需要對(duì)RS-422A串口、GJB289A總線、高速總線、開(kāi)關(guān)量和以太網(wǎng)數(shù)據(jù)進(jìn)行歸納總結(jié),找出各種信號(hào)幀數(shù)據(jù)段的規(guī)律,作為生成代碼的依據(jù);知識(shí)庫(kù)和類型庫(kù)提供生成不同模塊代碼的規(guī)則和算法以及生成代碼需要的數(shù)據(jù)類型;詞法分析器用于將XML模板在更新時(shí)確保數(shù)據(jù)一致性;XML模板生成、XML結(jié)構(gòu)定義(XSD)模板驗(yàn)證和XML模板解析用于將ICD庫(kù)中的信息配合知識(shí)庫(kù)自動(dòng)生成XML模板,并采用XSD模板對(duì)XML模板進(jìn)行驗(yàn)證,再通過(guò)解析XML模板得到目標(biāo)代碼。
圖2 ICD配置文件自動(dòng)生成代碼的原理圖
驅(qū)動(dòng)模型。驅(qū)動(dòng)模型根據(jù)ICD庫(kù)的接口描述關(guān)系,對(duì)輸入ICD信息進(jìn)行建模,輸出代碼生成機(jī)理的描述。驅(qū)動(dòng)模型是平臺(tái)無(wú)關(guān)模型,描述了ICD配置文件自動(dòng)生成代碼的機(jī)制,驅(qū)動(dòng)模型的組成和原理如圖3所示。
圖3 驅(qū)動(dòng)模型的組成和原理圖
知識(shí)庫(kù)和類型庫(kù)。知識(shí)庫(kù)用來(lái)存放代碼生成的語(yǔ)法規(guī)則和代碼映射規(guī)則,類型庫(kù)用來(lái)描述代碼生成過(guò)程中所有可能用到的數(shù)據(jù)類型。
詞法分析器。知識(shí)庫(kù)中可變代碼段的XML模板設(shè)計(jì)需要用到詞法分析器。可變代碼段的XML模板的生成是一個(gè)動(dòng)態(tài)建立的過(guò)程,XML模板所需要的部分信息由ICD配置文件確定。XML模板中會(huì)存在多個(gè)變量關(guān)聯(lián)到ICD配置文件的同一個(gè)參數(shù)數(shù)據(jù)結(jié)構(gòu)。在ICD配置文件更新后,利用此法分析器在XML模板所需要的內(nèi)存緩沖區(qū)中搜索所有關(guān)聯(lián)到該參數(shù)數(shù)據(jù)結(jié)構(gòu)并全部更新,這樣就可以保證XML模板的數(shù)據(jù)一致性。
XML模板生成、驗(yàn)證和解析。XXXX軟件根據(jù)ICD配置文件、知識(shí)庫(kù)、類型庫(kù)和詞法分析結(jié)果,并采用XmlWriter設(shè)計(jì)和生成XML模板;采用XMLSchema模板對(duì)生成的XML模板進(jìn)行驗(yàn)證,保證XML模板的語(yǔ)法正確;最后,通過(guò)對(duì)XML模板進(jìn)行解析,生成標(biāo)準(zhǔn)格式的目標(biāo)代碼。
接口通訊軟件代碼的自動(dòng)生成技術(shù)包含以下幾個(gè)關(guān)鍵技術(shù):ICD數(shù)據(jù)庫(kù)設(shè)計(jì)、驅(qū)動(dòng)模型建立、知識(shí)庫(kù)設(shè)計(jì)、類型庫(kù)設(shè)計(jì)以及代碼生成單元設(shè)計(jì)。其中,ICD數(shù)據(jù)庫(kù)設(shè)計(jì)是代碼自動(dòng)生成的基礎(chǔ)和依據(jù),它將系統(tǒng)中的各種類型總線數(shù)據(jù)進(jìn)行分析匯總,并找尋出各個(gè)數(shù)據(jù)幀的規(guī)律;驅(qū)動(dòng)模型基于ICD數(shù)據(jù)庫(kù)中描述的數(shù)據(jù)接口關(guān)系,對(duì)每種輸入數(shù)據(jù)元素進(jìn)行建模,并將ICD參數(shù)和數(shù)據(jù)塊輸出給代碼生成單元;知識(shí)庫(kù)中用于存放生成目標(biāo)代碼的映射規(guī)則、語(yǔ)法規(guī)則和算法等;類型庫(kù)用于存放自動(dòng)生成目標(biāo)代碼過(guò)程中所使用的各種數(shù)據(jù)類型;代碼生成單元是自動(dòng)生成代碼技術(shù)的核心,它根據(jù)ICD數(shù)據(jù)庫(kù)、知識(shí)庫(kù)和類型庫(kù)中的信息,并基于代碼自動(dòng)生成機(jī)理產(chǎn)生最終的目標(biāo)代碼。接口通訊軟件自動(dòng)生成模型如圖4所示。
接口通訊軟件通常由以下幾部分組成:①通用代碼。一般為固定代碼,以基本函數(shù)的形式存在,它不會(huì)隨著ICD數(shù)據(jù)庫(kù)的變化而改變。②專用代碼。需要根據(jù)每種數(shù)據(jù)幀進(jìn)行結(jié)構(gòu)體定義、打包和解包處理。③發(fā)送代碼。定義執(zhí)行發(fā)送數(shù)據(jù)幀相關(guān)操作的函數(shù)。④接收代碼。定義執(zhí)行接收數(shù)據(jù)幀相關(guān)操作的函數(shù)。
通過(guò)讀取ICD數(shù)據(jù)庫(kù)配置文件,并基于上述驅(qū)動(dòng)模型生成各種ICD數(shù)據(jù)幀和ICD參數(shù),提取不同總線類型的數(shù)據(jù)幀結(jié)構(gòu)體,并生成相應(yīng)的打包和解包函數(shù),從而構(gòu)建接口通訊軟件的專用代碼。在生成專用代碼的同時(shí),可以分析并構(gòu)建接收代碼和發(fā)送代碼,通用代碼可以通過(guò)知識(shí)庫(kù)中的規(guī)格和算法生成,這樣就輸出了接口通訊軟件的所有類型代碼。
為了實(shí)現(xiàn)接口通訊軟件代碼自動(dòng)生成技術(shù)的通用化,在軟件設(shè)計(jì)時(shí)會(huì)為任何一個(gè)數(shù)據(jù)幀保存一個(gè)對(duì)應(yīng)的配置文件。在自動(dòng)生成接口通訊軟件代碼前,先將所有的配置文件加載到程序中,分析提取其中的數(shù)據(jù)幀到相應(yīng)的結(jié)構(gòu)體內(nèi),并基于知識(shí)庫(kù)中的語(yǔ)法規(guī)格和代碼映射規(guī)則生成通用代碼。這樣做的好處是一旦通訊協(xié)議發(fā)生變化,在修改完相應(yīng)配置文件內(nèi)容后,重新加載一遍配置文件即可。然后通過(guò)對(duì)不同數(shù)據(jù)幀的解析,根據(jù)該數(shù)據(jù)幀的ICD數(shù)據(jù)塊和參數(shù)內(nèi)容,針對(duì)每種數(shù)據(jù)幀生成相應(yīng)的打包和解包函數(shù);同時(shí),通過(guò)對(duì)類型庫(kù)中總線類型和數(shù)據(jù)類型的解析,生成不同數(shù)據(jù)幀的接收代碼和發(fā)送代碼。接口通訊軟件代碼自動(dòng)生成的流程如圖5所示。
圖5 接口通訊軟件代碼自動(dòng)生成流程圖
針對(duì)不同總線類型的報(bào)文或是同一種總線類型但數(shù)據(jù)幀格式不同的報(bào)文,雖然它們各自有各自的通訊協(xié)議和處理函數(shù),但是這些代碼自動(dòng)生成的流程是相同的。為了提高接口通訊軟件的通用性和可靠性,對(duì)相同總線類型不同數(shù)據(jù)幀格式的報(bào)文采用通用的自動(dòng)生成流程和處理方法,將它們各自的數(shù)據(jù)處理函數(shù)當(dāng)作一個(gè)總線處理函數(shù)庫(kù),通過(guò)設(shè)計(jì)并不斷優(yōu)化該總線處理函數(shù)庫(kù),使得該總線類型下的所有數(shù)據(jù)幀格式的報(bào)文均能夠采用上述的總線處理函數(shù)庫(kù)進(jìn)行數(shù)據(jù)處理,最終使得接口通訊軟件的代碼自動(dòng)生成技術(shù)具有更廣泛的適用性。
本文提出了一種嵌入式接口通訊軟件代碼的自動(dòng)生成方法,進(jìn)行了ICD數(shù)據(jù)庫(kù)設(shè)計(jì)、驅(qū)動(dòng)模型建立、知識(shí)庫(kù)設(shè)計(jì)、類型庫(kù)設(shè)計(jì)以及代碼生成單元設(shè)計(jì)。該方法已經(jīng)在某航空監(jiān)控設(shè)備系統(tǒng)中得到了應(yīng)用,大大提高了軟件代碼的開(kāi)發(fā)效率和軟件可靠性。