摘 要: 以某實際項目開發(fā)為例,通過采用在嵌入式操作系統(tǒng)中基于模型設(shè)計的程序開發(fā)方式,實現(xiàn)了在VxWorks系統(tǒng)下使用UML建模的方式進(jìn)行應(yīng)用程序開發(fā)。具體包括使用UML進(jìn)行項目需求分析、系統(tǒng)建模、開發(fā)環(huán)境配置、系統(tǒng)具體設(shè)計和程序調(diào)試等內(nèi)容。目前這種自頂向下的迭代式開發(fā)模式已成功應(yīng)用于多個項目中,可提高程序開發(fā)效率、縮短項目的開發(fā)周期。
關(guān)鍵詞: 系統(tǒng)建模; UML; Rhapsody; VxWorks
中圖分類號: TN919?34; TP311.1 文獻(xiàn)標(biāo)識碼: A 文章編號: 1004?373X(2013)16?0041?04
0 引 言
VxWorks操作系統(tǒng)[1]作為高性能嵌入式實時操作系統(tǒng),具有進(jìn)程管理、存儲管理、設(shè)備管理、文件系統(tǒng)管理、網(wǎng)絡(luò)協(xié)議及系統(tǒng)應(yīng)用等多種功能,并可以實現(xiàn)實時多任務(wù)調(diào)度、多中斷管理、實時的系統(tǒng)資源分配以及實時的任務(wù)間通信。在開發(fā)基于VxWorks系統(tǒng)的應(yīng)用程序時如果僅僅依靠程序員進(jìn)行傳統(tǒng)的代碼編程調(diào)試,則很難發(fā)揮出其的強(qiáng)大功能進(jìn)而設(shè)計出可靠、高效的嵌入式應(yīng)用系統(tǒng),因此必須要有與之相配套的開發(fā)工具。
UML(統(tǒng)一建模語言)是構(gòu)建系統(tǒng)模型尤其是軟件系統(tǒng)模型的標(biāo)準(zhǔn)方法[2]。使用它進(jìn)行系統(tǒng)建模,可以使用戶專注于系統(tǒng)設(shè)計的重要部分,收集關(guān)鍵信息,編制文檔以便在各個系統(tǒng)組成部分之間建立通信。Rhapsody是一種遵循UML 2.0標(biāo)準(zhǔn)的基于模型驅(qū)動的(Model?Driven Development,MDD)軟件開發(fā)平臺[3],其專門針對嵌入式操作系統(tǒng)設(shè)計,實現(xiàn)了基于UML2.0的可視化建模。為開發(fā)嵌入式應(yīng)用系統(tǒng)提供了從軟件分析、設(shè)計一直到代碼實現(xiàn)和測試的開發(fā)環(huán)境。
1 系統(tǒng)建模
1.1 項目需求分析
以某項目開發(fā)為例,該項目是根據(jù)某裝備的實際操作流程建立一個模擬的訓(xùn)練環(huán)境。包括信息顯控和信息處理兩個子系統(tǒng),其中信息顯控子系統(tǒng)主要由主界面、參數(shù)裝定、故障診斷以及模擬訓(xùn)練界面的顯示操作處理等4個部分組成;信息處理子系統(tǒng)則包括CAN總線(CAN1,CAN2)數(shù)據(jù)、串口 (COM1,COM2)數(shù)據(jù)、同步信號數(shù)據(jù)的采集處理,以及模擬數(shù)據(jù)源的產(chǎn)生。整個項目的功能需求分析使用基于UML的用例圖(User Case Diagrams)描述如圖1所示[4]。
1.2 系統(tǒng)建模
根據(jù)項目的功能需求分析[5],將系統(tǒng)從頂層劃分為三個對象模塊,如圖2所示,分別為界面顯示與人機(jī)交互操控處理模塊(itsGUIPro)、底層通信處理模塊(itsHWPro)和GUI與底層的接口對象模塊(itsIface),其各自的對象組成模型如圖3~圖5所示。
2 系統(tǒng)設(shè)計
系統(tǒng)運(yùn)行于基于X86架構(gòu)的硬件體系中,系統(tǒng)程序的開發(fā)采用上位機(jī)?目標(biāo)機(jī)(Host?Target)交叉開發(fā)模式[6]。在上位機(jī)中進(jìn)行應(yīng)用程序的開發(fā),通過局域網(wǎng)將應(yīng)用程序下載到運(yùn)行Vxworks操作系統(tǒng)的目標(biāo)機(jī)中進(jìn)行在線調(diào)試。系統(tǒng)開發(fā)模式如圖6所示。
運(yùn)行于上位機(jī)中的開發(fā)環(huán)境為Tornado 2.2和Rhapsody 6.1。具體為:在Tornado 2.2中完成對運(yùn)行于目標(biāo)機(jī)上的VxWorks操作系統(tǒng)組件的裁剪配置及編譯生成映像文件;Rhapsody 6.1則進(jìn)行系統(tǒng)建模和軟件設(shè)計實現(xiàn)。項目采用面向?qū)ο蟮脑O(shè)計方法替代了傳統(tǒng)的結(jié)構(gòu)化設(shè)計,共由8個任務(wù)組成,并按優(yōu)先級從高到低的順序排列。
2.1 嵌入式系統(tǒng)生成
根據(jù)項目使用的X86架構(gòu)平臺制作基于PentiumIII CPU的 BSP包;在Tornado 2.2中創(chuàng)建基于該BSP包的bootable工程,并根據(jù)項目實際需要裁剪了VxWorks操作系統(tǒng)包含的組件,最終編譯生成了Bootrom文件和VxWorks映像文件,并通過局域網(wǎng)下載到目標(biāo)機(jī)上進(jìn)行在線調(diào)試,VxWorks操作系統(tǒng)可正常初始化啟動且圖形模式下測試程序運(yùn)行正常。
2.2 應(yīng)用程序開發(fā)
2.2.1 Rhapsody 6.1環(huán)境配置
首先在Rhapsody 6.1中新建工程,雙擊工程瀏覽窗口的DefaultConfig,彈出Configuration對話框,單擊Propertys選項卡,將CPP_CG\Configuration\Envirenment選項修改為VxWorks,CPP_CG\VxWorks\BSP選項修改為PENTIUM3;單擊Settings選項卡,添加工程庫文件和頭文件目錄,具體如圖7所示。
2.2.2 建立狀態(tài)圖
接下來依據(jù)1.2節(jié)中系統(tǒng)的建模結(jié)果,對模型中各對象的基類屬性和操作進(jìn)行具體實現(xiàn)。在實現(xiàn)各對象功能的基類中采用了事件觸發(fā)有限狀態(tài)機(jī)之間自動進(jìn)行轉(zhuǎn)移來管理對象生命周期中的所有活動,這樣各對象之間以及對象內(nèi)部之間的動態(tài)交互流程更為清晰,增強(qiáng)了程序的可讀性[7]。頂層設(shè)計中對象模塊itsGUIPro和itsHWPro的功能實現(xiàn)狀態(tài)圖如圖8,圖9所示,接口模塊itsIface對象中的屬性和操作僅供對象itsGUIPro和itsHWPro在各自的功能實現(xiàn)中調(diào)用,故沒有獨(dú)立的狀態(tài)圖。
2.2.3 程序?qū)崿F(xiàn)
限于篇幅,僅就對itsHWPro對象從創(chuàng)建到銷毀整個生命周期的關(guān)鍵代碼進(jìn)行說明。
cl_HWPro * cl_HWPro_Create(RiCTask * p_task) //itsHWPro對象的創(chuàng)建
{
cl_HWPro* me = (cl_HWPro *) malloc(sizeof(cl_HWPro));//為對象動態(tài)分配內(nèi)存
if(me!=NULL)
{
cl_HWPro_Init(me, p_task); //itsHWPro對象初始化
}
DYNAMICALLY_ALLOCATED(me);//指定對象可動態(tài)調(diào)用
return me;
}
void cl_HWPro_Init(cl_HWPro* const me, RiCTask * p_task) //itsHWPro對象初始化
{
RiCTask_Init((me?>ric_task), \"tHW\", 50, RiCOSDefaultStackSize, RiCOSDefaultMessageQueueSize, RiCFALSE, NULL); //開始一個名為“tHW”的任務(wù)
/*變量初始化*/
me?>can2sendflag = FALSE;
…
RiCReactive_setActive((me?>ric_reactive), RiCTRUE); //激活對象狀態(tài)圖
initRelations(me);
// itsHWPro對象的內(nèi)部對象調(diào)用關(guān)系初始化
initStatechart(me);
//itsHWPro對象的活動狀態(tài)圖初始化
…
}
void cl_HWPro_ProCAN2Send(cl_HWPro* const me)/* itsHWPro對象狀態(tài)圖中狀態(tài)can2sendpro中調(diào)用函數(shù)*/
{
int index=?1,icount=0;
index=cl_ProStack_StackPop(me?>itsInterface_SI?>itsCANevStk[2]); //彈出發(fā)送事件索
//引號
if(index!=?1) //索引號有效
{
memcpy(me?>itsCANPro.AllMsgSendtoCan,me?>itsInterface_SI?>AllSendData,
sizeof(UnAllCanData)); //從數(shù)據(jù)接口中取需發(fā)送數(shù)據(jù)
}
while(index!=?1)
{
if(cl_CANPro_CAN2WrtMsgPro(me?>itsCANPro,
me?>itsInterface_SI?>CAN2SendEv[index]));// 處理發(fā)送數(shù)據(jù)
...
index=cl_ProStack_StackPop(me?> itsInterface_SI?>itsCANevStk[2]); //彈出發(fā)送
//事件索引號
}
cl_CAN_CAN2Write(me?>itsCAN);
//將數(shù)據(jù)發(fā)送到CAN總線
}
void cl_HWPro_Destroy(cl_HWPro* const me)
// itsHWPro對象的銷毀
{
if(me!=NULL)
{
cl_HWPro_Cleanup(me); //結(jié)束狀態(tài)圖活動并釋放其占用內(nèi)存
}
free(me); //釋放對象內(nèi)存
}
…
2.2.4 系統(tǒng)調(diào)試
Rhapsody 6.1中通過創(chuàng)建生成順序圖來捕捉對象之間的消息映射從而進(jìn)行系統(tǒng)模型級的調(diào)試和驗證。以在Rhapsody 6.1中實現(xiàn)itsHWPro對象功能程序的調(diào)試為例,調(diào)試運(yùn)行時得到的順序圖片段如圖10所示。通過這種直觀地方式能夠盡早發(fā)現(xiàn)系統(tǒng)中存在的設(shè)計錯誤或缺陷,從而在很大程度上降低了項目風(fēng)險。
3 結(jié) 語
通過在嵌入式系統(tǒng)開發(fā)中使用UML對系統(tǒng)進(jìn)行功能需求分析,建立迭代式模型,進(jìn)而最終根據(jù)模型進(jìn)行了代碼實現(xiàn)。經(jīng)項目開發(fā)實踐證明,這種面向?qū)ο蟮拈_發(fā)模式可有效提高軟件重用率,縮短系統(tǒng)開發(fā)時間,加快項目的研發(fā)速度,代表了軟件開發(fā)自動化的發(fā)展方向。
參考文獻(xiàn)
[1] 王金剛,宮霄霖.基于VxWorks的嵌入式實時系統(tǒng)設(shè)計[M].北京:清華大學(xué)出版社,2004.
[2] [美]SCHMULLER Joseph. UML基礎(chǔ)、案例與應(yīng)用[M].李虎,趙龍剛,譯.北京:人民郵電出版社,2006.
[3] 孫強(qiáng),張振華.使用Rhapsody軟件框架和UML的實時系統(tǒng)開發(fā)[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2003(2):63?65.
[4] [美]BOOCH Grady. UML用戶指南[M].邵維忠,譯.2版.北京:人民郵電出版社,2006.
[5] [美]LARMAN Craig.UML和模式應(yīng)用[M].姚淑珍,李虎,譯.北京:機(jī)械工業(yè)出版社,2002.
[6] 孔祥營,柏桂枝.嵌入式實時操作系統(tǒng)VxWorks及其開發(fā)環(huán)境Tornado[M].北京:中國電力出版社,2002.
[7] [美]BRUEGGE Bernd,[美]DUTOIT AllenH.面向?qū)ο蟮能浖こ蘙M].吳丹,譯.北京:清華大學(xué)出版社,2002.