專利名稱:一種從嵌入式軟件代碼中自動抽象軟件架構(gòu)的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種從嵌入式軟件代碼中自動抽象軟件架構(gòu)的方法,嵌入式軟件應(yīng)用 中軟件架構(gòu)抽象的技術(shù)。
背景技術(shù):
隨著計算機軟件技術(shù)的發(fā)展,在對新的軟件系統(tǒng)進行設(shè)計和實現(xiàn)過程中,遺產(chǎn)軟 件所發(fā)揮的借鑒作用也日益突出,軟件的重用技術(shù)顯得尤為重要。對于遺產(chǎn)軟件所能發(fā)揮 出的作用,除了它自身保留有的數(shù)據(jù)之外,更重要的是它本身的架構(gòu)模型。因為,基于對遺 產(chǎn)軟件架構(gòu)模型的理解,我們可以更好地擴展或裁剪軟件的功能,設(shè)計更優(yōu)越的維護方案。 同時,通過運用合理的描述方法對軟件系統(tǒng)架構(gòu)進行描述,可以讓不同領(lǐng)域的技術(shù)人員更 好的理解軟件的架構(gòu),并能夠?qū)浖岢龈哚槍π院蛯嵱眯缘母倪M方案,以提高軟件質(zhì) 量。目前,對于VxWorks、Acore等實時嵌入式系統(tǒng)下開發(fā)的軟件,多使用到 AADL (Architecure Analysis and Design LangUEige))(寸白勺i殳i十itif i$。AADLi2004 年由AADL在國際汽車工程師協(xié)會(SAE)發(fā)布的工業(yè)標準AS5506,又叫結(jié)構(gòu)分析設(shè)計語言, 主要是對嵌入式軟件的實時性、容錯、安全分區(qū)和動態(tài)認證等屬性進行規(guī)約,它可用于軟件 任務(wù)和通訊結(jié)構(gòu)的描述和分布式多處理器硬件結(jié)構(gòu)的描述。AADL可以使用三種模式進行描 述文本、圖形和XML,且這三種模式之間可以相互轉(zhuǎn)化。AADL是一種模型驅(qū)動的嵌入式軟 件架構(gòu)描述與分析語言,它可以描述構(gòu)件之間的交互接口,比如數(shù)據(jù)的輸入和輸出,以及構(gòu) 件的其他行為特性,如實時性、安全性等。此外,AADL的構(gòu)件還具有擴展功能,用戶可以在 新的擴展中定義新的屬性。然而,現(xiàn)有的遺產(chǎn)軟件更多的是只有軟件代碼,沒有架構(gòu)描述及其架構(gòu)中構(gòu)件間 的交互信息,軟件專業(yè)技術(shù)人員很難利用AADL及其工具從軟件架構(gòu)層次上對軟件的屬性 進行分析,在系統(tǒng)維護和新系統(tǒng)的設(shè)計過程中,無法分析遺產(chǎn)代碼中構(gòu)件間的交互、硬件與 軟件間的聯(lián)接關(guān)系,因此,新開發(fā)或被維護軟件的非功能屬性也很難進行量化分析,從而降 低了遺產(chǎn)代碼的重用性,并使得軟件系統(tǒng)的質(zhì)量保障能力下降。
發(fā)明內(nèi)容
要解決的技術(shù)問題為了避免現(xiàn)有技術(shù)的不足之處,本發(fā)明提出一種從嵌入式軟件代碼中自動抽象軟 件架構(gòu)的方法。技術(shù)方案一種從嵌入式軟件代碼中自動抽象軟件架構(gòu)的方法,其特征在于步驟如下步驟 1 從源代碼的第一個字進行逐個查檢,當查檢到的字為數(shù)據(jù)定義類,將當前數(shù)據(jù)定義類字和下一個字保存;當查檢到的字為運算符號類,跳過當前運算符號類字;
當查檢到的字為控制語句類,記錄下該控制語句類模塊的起始查檢點,并繼續(xù)查 檢,直至找到該控制語句類模塊的結(jié)束點,跳出該控制語句類模塊;當查檢到的字為函數(shù)創(chuàng)建類,保存當前函數(shù)創(chuàng)建類字,并在當前函數(shù)創(chuàng)建類字中 繼續(xù)查檢出函數(shù)名稱、函數(shù)傳遞的參數(shù)類型和函數(shù)傳遞的參數(shù)名稱,并保存;
所述數(shù)據(jù)定義類為define ;static ;typedef ;struct ;int ;float ;char ;double ;bool ;void ;auto ;所述運算符號類為〈;〉;/;*;”;(;);{;}; ! ;+;-;%;=; ;& 空格;所述控制語句類為for;while ;if ;do ;else ;return ;所述函數(shù)創(chuàng)建類為:taskSpawn ;semBCreate ;msgQCreate ;sizeof ;semTake ;semGive ;msgQSend ;msgQReceive ;intConnect ;步驟2 按照數(shù)據(jù)定義類的特征定義與數(shù)據(jù)定義類相應(yīng)的DTD文檔;步驟3 按照函數(shù)創(chuàng)建類的特征定義與函數(shù)創(chuàng)建類相應(yīng)的DTD文檔;步驟4:遵循DTD文檔,按如下方式描述步驟1中保存的查檢結(jié)果對于數(shù)據(jù)定義類,描述數(shù)據(jù)的類型和數(shù)據(jù)的名稱;對于函數(shù)創(chuàng)建類中的taskSpawn,描述任務(wù)函數(shù)名稱和任務(wù)函數(shù)的ID號;對于函數(shù)創(chuàng)建類中的semBCreate,描述進程名稱、進程發(fā)送的信號量類型和名稱、 進程接收的信號量的類型和名稱、進程發(fā)送和接收的信號量的ID號;對于函數(shù)創(chuàng)建類中的msgQCreate,描述線程名稱、線程發(fā)送的消息類型和名稱、線 程接收的消息類型和名稱、線程發(fā)送和接收的消息ID號;步驟5 將步驟4的描述結(jié)果作為待解析的文檔對象,確定文檔對象的根結(jié)點為解 析的起始結(jié)點;步驟6 沿著起始起點,依次解析文檔對象的全部結(jié)點;步驟7 根據(jù)結(jié)點的解析結(jié)果,依次在AADL的模型空間中得到與解析結(jié)果相對應(yīng) 的模型構(gòu)件,并用AADL文本對模型構(gòu)件進行描述,將這些構(gòu)件的描述結(jié)果按照解析次序顯 示在同一 AADL文本中,形成軟件源代碼的架構(gòu)模型。有益效果本發(fā)明提出的一種從嵌入式軟件代碼中自動抽象軟件架構(gòu)的方法,解決了遺產(chǎn)代 碼的架構(gòu)抽象和構(gòu)件間交互關(guān)系的描述,有利于系統(tǒng)非功能屬性的分析,提高了遺產(chǎn)代碼 的重用性和軟件系統(tǒng)的質(zhì)量。
圖1為方法實施流程圖;圖2為方法中查檢軟件源代碼的過程;圖3為方法中使用XML語言描述源代碼查檢結(jié)果的過程;圖4為方法中解析XML文本的過程;圖5為方法中結(jié)點解析結(jié)果與軟件架構(gòu)模型相互對應(yīng)的關(guān)系圖;
具體實施例方式現(xiàn)結(jié)合實施例、附圖對本發(fā)明作進一步描述
例如抽象如下VxWorks系統(tǒng)下的源代碼段的架構(gòu)#include "vxWorks. h,,#include "msgQLib. h”#define MAX_MSGS(10)#define MAX_MSG_LEN(100)#define MESSAGE "Greetings from Task 1”MSG_Q_ID myMsgQId ;taskl (void){if ((myMsgQId = msgQCreate (MAX_MSGS, MAX_MSG_LEN, MSG_Q_PRI0RITY))== NULL)return (ERROR);if(msgQSend(myMsgQId, MESSAGE, sizeof(MESSAGE), WAIT_F0REVER, MSG_PRI_ NORMAL)== ERROR)return (ERROR);}task2 (void){char msgBuf[MAX_MSG_LEN];if (msgQReceive (myMsgQId, msgBuf, MAX_MSG_LEN, WAIT_F0REVER) = = ERROR)return (ERROR);printf ( "Message from task l:\n% s\n,,,msgBuf);}按步驟1,從源代碼的第一個字開始查檢,查檢得到的結(jié)果數(shù)據(jù)定義類有charmsgBuf [MAX_MSG_LEN];函數(shù)創(chuàng)建類有msgQCreate (MAX_MSGS, MAX_MSG_LEN, MSG_Q_PRI0RITY);msgQSend(myMsgQId, MESSAGE, sizeof (MESSAGE), WAIT_F0REVER, MSG_PRI_ NORMAL)msgQReceive (myMsgQId, msgBuf, MAX_MSG_LEN, WAIT_F0REVER)按步驟2,根據(jù)數(shù)據(jù)定義類的特征,定義DTD文檔< ! D0CTYPE Data[< ! ELEMENT Data (name+, type+, size+)>< ! ELEMENT name(#PCDATA)>< ! ELEMENT type (#PCDATA)>< ! ELEMENT size (#PCDATA)>] >按步驟3 根據(jù)函數(shù)創(chuàng)建類的特征,定義DTD文檔< ! D0CTYPE MsgQ [
< ! ELEMENT MsgQ(parameter+, send+, receive+))< ! ELEMENT send(send_msgQId+, send_paramater+)>< ! ELEMENT msgQId(#PCDATA)>< ! ELEMENT send_paramater(#PCDATA)>< ! ELEMENT receive(receive_msgQId+, receive_paramater+)>< ! ELEMENT msgQId(#PCDATA)>< ! ELEMENT receive_paramater(#PCDATA)>] >按步驟4,遵循DTD文檔,描述查檢結(jié)果<Data><name>msgBuf</name><type>char</type><size>MAX_MSG_LEN</size></Data><MsgQ><paramater>MAX_MSGS</paramater><paramater>MAX_MSG_LEN</paramater><paramater>MSG_Q_PRIORITY</paramater><send><send_msgQId>myMsgQId</send_msgQId><send_paramater>MESSAGE</send_paramater><send_paramater>WAIT_FOREVER</send_paramater><send_paramater>MSG_PRI_NORMAL</send_paramater></send><receive><receive_msgQId>myMsgQId</receive_msgQId><receive_paramater>msgBuf</receive_paramater><receive_paramater>MAX_MSG_LEN</receive_paramater><receive_paramater>WAIT_FOREVER</receive_paramater></receive></MsgQ>按步驟5,確定<Data>為文檔對象的起始結(jié)點;按步驟 6,依次解析 <Data>、<name>、<type>、<size>、<MsgQ>、<paramater>、 <paramater>、 <paramater>、 <send>、 <send_msgQId>、 <send_paramater>、 <send_ paramater>、 <send_paramater>、 <receive>、 <receive_msgQId>、 <receive_paramater>、 <receive_paramater>、<receive_paramater> 結(jié)點,得至丨J角軍析結(jié)果 msgBuf > char、MAX_MSG_ LEN、MAX_MSGS、MAX_MSG_LEN、MSG_Q_PRI0RITY、myMsgQId、MESSAGE、WAIT_F0REVER、MSG_ PRI_N0RMAL、myMsgQId、msgBuf、MAX_MSG_LEN、WAIT_F0REVER ;按步驟7,根據(jù)步驟6中解析結(jié)果,在AADL的模型空間中得到data、process.connections, data port構(gòu)件,用AADL文本對構(gòu)件描述,形成軟件源代碼的架構(gòu)模型package basic_data—typepublicdata IntegerpropertiesSource—Data—Size = >32b ;end Integer ;data FloatpropertiesSource—Data—Size = >32b ;end Float ;end basic_data—type ;system sysend sys ;system implementation sys. impl
subcomponentspro_ins :process pro. impl ;end sys. impl ;process proend pro ;process implementation pro. implconnectionsdata port taskl_ins. MESSAGE_>task2_ins. msgBuf ;end pro. impl ;至此,方法已經(jīng)完成對軟件源代碼架構(gòu)的抽象。
權(quán)利要求
一種從嵌入式軟件代碼中自動抽象軟件架構(gòu)的方法,其特征在于步驟如下步驟1從源代碼的第一個字進行逐個查檢,當查檢到的字為數(shù)據(jù)定義類,將當前數(shù)據(jù)定義類字和下一個字保存;當查檢到的字為運算符號類,跳過當前運算符號類字;當查檢到的字為控制語句類,記錄下該控制語句類模塊的起始查檢點,并繼續(xù)查檢,直至找到該控制語句類模塊的結(jié)束點,跳出該控制語句類模塊;當查檢到的字為函數(shù)創(chuàng)建類,保存當前函數(shù)創(chuàng)建類字,并在當前函數(shù)創(chuàng)建類字中繼續(xù)查檢出函數(shù)名稱、函數(shù)傳遞的參數(shù)類型和函數(shù)傳遞的參數(shù)名稱,并保存;所述數(shù)據(jù)定義類為define;static;typedef;struct;int;float;char;double;bool;void;auto;所述運算符號類為<;>;/;*;”;(;);{;};??;+;-;%;=;;&;#;空格;所述控制語句類為for;while;if;do;else;return;所述函數(shù)創(chuàng)建類為taskSpawn;semBCreate;msgQCreate;sizeof;semTake;semGive;msgQSend;msgQReceive;intConnect;步驟2按照數(shù)據(jù)定義類的特征定義與數(shù)據(jù)定義類相應(yīng)的DTD文檔;步驟3按照函數(shù)創(chuàng)建類的特征定義與函數(shù)創(chuàng)建類相應(yīng)的DTD文檔;步驟4遵循DTD文檔,按如下方式描述步驟1中保存的查檢結(jié)果對于數(shù)據(jù)定義類,描述數(shù)據(jù)的類型和數(shù)據(jù)的名稱;對于函數(shù)創(chuàng)建類中的taskSpawn,描述任務(wù)函數(shù)名稱和任務(wù)函數(shù)的ID號;對于函數(shù)創(chuàng)建類中的semBCreate,描述進程名稱、進程發(fā)送的信號量類型和名稱、進程接收的信號量的類型和名稱、進程發(fā)送和接收的信號量的ID號;對于函數(shù)創(chuàng)建類中的msgQCreate,描述線程名稱、線程發(fā)送的消息類型和名稱、線程接收的消息類型和名稱、線程發(fā)送和接收的消息ID號;步驟5將步驟4的描述結(jié)果作為待解析的文檔對象,確定文檔對象的根結(jié)點為解析的起始結(jié)點;步驟6沿著起始起點,依次解析文檔對象的全部結(jié)點;步驟7根據(jù)結(jié)點的解析結(jié)果,依次在AADL的模型空間中得到與解析結(jié)果相對應(yīng)的模型構(gòu)件,并用AADL文本對模型構(gòu)件進行描述,將這些構(gòu)件的描述結(jié)果按照解析次序顯示在同一AADL文本中,形成軟件源代碼的架構(gòu)模型。
全文摘要
一種從嵌入式軟件代碼中自動抽象軟件架構(gòu)的方法,技術(shù)特征在于自動查檢嵌入式軟件系統(tǒng)的源代碼,將源代碼中的字分為數(shù)據(jù)定義類、運算符號類、控制語句類和函數(shù)創(chuàng)建類。查檢結(jié)束后,該方法根據(jù)數(shù)據(jù)定義類和函數(shù)創(chuàng)建類的特征定義相應(yīng)的DTD文檔,用XML語言描述查檢結(jié)果,并對描述的結(jié)果進行解析。該方法根據(jù)解析結(jié)果,在AADL模型空間中得到對應(yīng)的模型構(gòu)件,用AADL文本描述模型構(gòu)件,形成軟件源代碼的架構(gòu)模型。解決了遺產(chǎn)代碼的架構(gòu)抽象和構(gòu)件間交互關(guān)系的描述,有利于系統(tǒng)非功能屬性的分析,提高了遺產(chǎn)代碼的重用性和軟件系統(tǒng)的質(zhì)量。
文檔編號G06F9/44GK101807147SQ20101014714
公開日2010年8月18日 申請日期2010年4月15日 優(yōu)先權(quán)日2010年4月15日
發(fā)明者周興社, 張凡, 王庚, 董云衛(wèi), 覃楊森 申請人:西北工業(yè)大學