嵌入式DVR是一種高度集成、復(fù)雜的嵌入式設(shè)備,其軟件需要保證良好的可靠性、復(fù)用性、擴(kuò)展性及高效性。
傳統(tǒng)的結(jié)構(gòu)化設(shè)計(jì)方法,在其軟件設(shè)計(jì)中就有些“力不從心”,因?yàn)榻Y(jié)構(gòu)化的軟件要求軟件設(shè)計(jì)一開始就假定軟件需求是很明確的,系統(tǒng)處理數(shù)據(jù)的模式和方法也是明確的。然而DVR的用戶是面向不同領(lǐng)域的,而每個(gè)客戶的要求都有所不同,如有的客戶可能需要用RS485總線來控制溫度采集器,有的則可能需要來控制云臺,這在結(jié)構(gòu)化設(shè)計(jì)方面就需要用不同的數(shù)據(jù)結(jié)構(gòu)和方法來描述。因此,每當(dāng)針對不同客戶就需要專門定制不同的軟件版本,這無疑增加了軟件的維護(hù)和測試成本,這是DVR生產(chǎn)廠商所不愿意看到的。并且,面向?qū)ο蟮脑O(shè)計(jì)思想需要采用面向?qū)ο蟮脑O(shè)計(jì)語言,無疑是對嵌入式設(shè)備一個(gè)巨大的考驗(yàn)。當(dāng)然,現(xiàn)在不少嵌入式開發(fā)工具,已經(jīng)支持C++、JAVA等面向?qū)ο蟮脑O(shè)計(jì)語言。但是這些面向?qū)ο蟮恼Z言需要很大的C++設(shè)計(jì)庫,這會增加DVR對存儲設(shè)備容量的要求。而且面向?qū)ο蟮脑O(shè)計(jì)語言在執(zhí)行的時(shí)候會添加一些額外的代碼,如“析構(gòu)”、“構(gòu)造”函數(shù),會導(dǎo)致執(zhí)行效率比結(jié)構(gòu)化的設(shè)計(jì)語言要低。因此一些編譯器對面向?qū)ο蟮脑O(shè)計(jì)語言的支持遠(yuǎn)沒有對結(jié)構(gòu)化的設(shè)計(jì)語言高。如LINUX下的GCC編譯器附帶的調(diào)試工具,在調(diào)試C++程序中有時(shí)就無法打印堆棧和函數(shù)的調(diào)用關(guān)系。
新型軟件設(shè)計(jì)方法
綜合以上幾個(gè)方面:必須找到一個(gè)結(jié)構(gòu)化設(shè)計(jì)語言和面向?qū)ο笤O(shè)計(jì)語言結(jié)合的平衡點(diǎn),才能夠更好地解決DVR軟件開發(fā)中的設(shè)計(jì)問題。由此,軟件設(shè)計(jì)人員采用了一種“用結(jié)構(gòu)化的語言實(shí)現(xiàn)面向?qū)ο蟮脑O(shè)計(jì)思想”的軟件設(shè)計(jì)方法。
這種設(shè)計(jì)方法的實(shí)質(zhì)是:用面向?qū)ο蟮脑O(shè)計(jì)思想去分析嵌入式DVR的需求;用面向?qū)ο蟮脑O(shè)計(jì)模式去設(shè)計(jì)DVR軟件構(gòu)架;用結(jié)構(gòu)化的語言去實(shí)現(xiàn)DVR系統(tǒng)功能。這樣一來,就可以發(fā)揮面向?qū)ο笤O(shè)計(jì)思想在需求分析和建模方面的方便快捷直觀的優(yōu)點(diǎn),同時(shí)又能保證嵌入式軟件在執(zhí)行效率和存儲方面的要求。
當(dāng)然,我們必須摒棄一些面向?qū)ο笤O(shè)計(jì)思想中需要依賴面向?qū)ο笤O(shè)計(jì)語言的一些特性,如運(yùn)行中的多態(tài),類型識別等。這些行為也能夠在結(jié)構(gòu)化語言中實(shí)現(xiàn),只是有些特性對系統(tǒng)設(shè)計(jì)來說就有點(diǎn)無關(guān)輕重了。如果把所有面向?qū)ο蟮奶匦远寄脕碛?,這就會導(dǎo)致設(shè)計(jì)走向另一個(gè)極端:在嵌入式開發(fā)上使用面向?qū)ο蟮恼Z言來設(shè)計(jì)系統(tǒng)。特別值得指出的是,面向?qū)ο笳Z言中的內(nèi)存分配,如果在嵌入式軟件上設(shè)計(jì)使用,會導(dǎo)致頻繁的動態(tài)分配不定大小的內(nèi)存,會引起系統(tǒng)堆棧破碎的風(fēng)險(xiǎn)。
面向?qū)ο筌浖?/FONT>
DVR軟件,可采用面向?qū)ο筌浖小懊艚蒈浖钡脑O(shè)計(jì)思想來進(jìn)行分析設(shè)計(jì)。在進(jìn)行需求分析的時(shí)候,在最初開發(fā)周期中,首先確認(rèn)系統(tǒng)中最重要的10%的需求來確定系統(tǒng)架構(gòu)設(shè)計(jì),這點(diǎn)和結(jié)構(gòu)化的軟件設(shè)計(jì)是完全不一樣的。結(jié)構(gòu)化的語言假定系統(tǒng)的需求都明確了,根據(jù)這些需求進(jìn)行系統(tǒng)架構(gòu)設(shè)計(jì)。
設(shè)計(jì)人員采用比較實(shí)用快捷面向?qū)ο蟮腗VC結(jié)構(gòu),即模型-視圖-控制器結(jié)構(gòu),把整個(gè)系統(tǒng)分成三個(gè)部分:一部分是底層的軟件部分,我們在DVR軟件稱為“微內(nèi)核”;一部分是人機(jī)交互部分,即界面部分;另一部分則是兩者之間的接口,我們稱之為適配器。在軟件架構(gòu)上也分為三個(gè)大的部分(或者說三個(gè)軟件包):界面、“微內(nèi)核”、界面和“微內(nèi)核”之間的接口。
這三個(gè)部分在迭代中最先完成的是“微內(nèi)核”部分。而“微內(nèi)核”設(shè)計(jì)中最關(guān)鍵的就是錄像部分,這需要考慮到各種不同的錄像種類和各種錄像條件,而做好錄像部分的用例分析就可以設(shè)計(jì)出微內(nèi)核的基本架構(gòu),也就是整個(gè)軟件的“靈魂”。[nextpage]
完成第一次迭代設(shè)計(jì)后,DVR軟件的其它需求的開發(fā)就是一個(gè)“添枝加葉”的過程。根據(jù)面向?qū)ο笤O(shè)計(jì)“高內(nèi)聚、低耦合”的思想原則,每次迭代的過程我們都采用模塊化的設(shè)計(jì),。在添加每一個(gè)模塊時(shí),統(tǒng)一各個(gè)模塊的接口,采用“模塊名_domsg”做為對外接口。這樣一來,就能很好地屏蔽掉各個(gè)模塊的內(nèi)部處理機(jī)制,減少軟件開發(fā)的耦合程度。如“微內(nèi)核”中的錄像部分可能需要讀出硬盤模塊提供的分配目錄信息。,就可以通過“hdisk_domsg”來獲取。
各個(gè)模塊開發(fā)
在各個(gè)模塊開發(fā)中,可以采用面向?qū)ο笳Z言的概念來設(shè)計(jì)。語言只是實(shí)現(xiàn)思想的一種方式,用結(jié)構(gòu)化的語言可以很好地實(shí)現(xiàn)一些面向?qū)ο蟮脑O(shè)計(jì)思想。如在考慮各個(gè)模塊設(shè)計(jì)的時(shí)候,采用“類”(C++語言中的關(guān)鍵字為:class)來組織軟件模塊。當(dāng)然,在結(jié)構(gòu)化設(shè)計(jì)中沒有“類”這種概念,于是我們用結(jié)構(gòu)體(C語言中的關(guān)鍵字為:struct)來替代。如,在每個(gè)模塊設(shè)計(jì)的時(shí)候,就繼承了系統(tǒng)中已經(jīng)設(shè)計(jì)好的“父類”。父類里面包括一些共有的屬性,如“模塊ID”,“模塊名稱”,還有一些共有的方法,如“讀取配置參數(shù)”,“存儲配置參數(shù)”等。在實(shí)際編寫每個(gè)模塊的時(shí)候,首先從這個(gè)“父類”繼承,這樣的設(shè)計(jì)能夠很好優(yōu)化程序結(jié)構(gòu),提高程序的可讀性和擴(kuò)展性,并且能夠很好地提高代碼的復(fù)用性。
struct Module_Obj
{
int Id;//模塊編號,供調(diào)試使用
char Name[20];//模塊名
......
int(*load_param)(void *param);//啟動時(shí)候裝載模塊參數(shù)
int(*save_param)(void *param));//保存模塊參數(shù)
......
};
在模塊開發(fā)中,也可以采用面向?qū)ο蟮脑O(shè)計(jì)模式。設(shè)計(jì)人員在采用軟件設(shè)計(jì)的過程就采用了很多“四人幫”(即“GOF”,四個(gè)國外開發(fā)者,提出面向?qū)ο筌浖_發(fā)中的常用設(shè)計(jì)模式)的設(shè)計(jì)模式。如在系統(tǒng)啟動后就采用創(chuàng)建式的單例模式分配系統(tǒng)內(nèi)存,保證系統(tǒng)各個(gè)模塊在系統(tǒng)中唯一。又如報(bào)警模塊中采用了observer(觀察者)模式,其它模塊如果要獲取報(bào)警信息,可先向該模塊注冊需要的報(bào)警信息,當(dāng)該報(bào)警模塊發(fā)現(xiàn)有改變報(bào)警端子有報(bào)警的時(shí)候,就會把報(bào)警信息逐個(gè)通知各個(gè)已經(jīng)注冊的模塊。這些模式的采用能夠很好地提高代碼的健壯性。
界面
界面方面設(shè)計(jì)人員采用了名為NeatechGui的系統(tǒng),這套GUI系統(tǒng)包括兩個(gè)部分:一部分是在WINDOWS界面下的自動化工具,這套工具負(fù)責(zé)設(shè)計(jì)界面菜單,并自動生成C代碼提供給界面部分調(diào)度;另一部分則是DVR GUI部分,這部分是基于不同的分割芯片上的圖形系統(tǒng),這部分作為一個(gè)模塊提供給“微內(nèi)核”調(diào)用,它會在系統(tǒng)啟動時(shí)初始各種分隔芯片,并提供一個(gè)供界面部分調(diào)用的菜單接口。
界面和微內(nèi)核的接口部分,負(fù)責(zé)轉(zhuǎn)換“微內(nèi)核”和“界面”部分的通訊,類似四人幫設(shè)計(jì)模式中的適配器,主要的設(shè)計(jì)技巧是采用面向?qū)ο笳Z言中常用的CallBack(回調(diào))函數(shù)模式。當(dāng)界面上有按鍵事件產(chǎn)生的時(shí)候就回調(diào),用事先已經(jīng)注冊好的事件回調(diào)函數(shù),執(zhí)行相關(guān)的“微內(nèi)核”接口函數(shù),完成系統(tǒng)的人機(jī)操作配置功能。
結(jié)語
市場上已有采用這一方法進(jìn)行DVR軟件開發(fā)的系列產(chǎn)品。實(shí)踐證明,這一軟件具有很好的擴(kuò)展性和穩(wěn)定性,同時(shí)軟件開發(fā)周期明顯快于采用純結(jié)構(gòu)化的軟件開發(fā)周期。
隨著嵌入式技術(shù)的發(fā)展,其軟件的規(guī)模必定會越來越大,傳統(tǒng)的結(jié)構(gòu)化開發(fā)方法肯定會被更先進(jìn)的開發(fā)方法所取代,面向?qū)ο蟮能浖こ痰乃枷霑绊懙角度胧杰浖拈_發(fā)設(shè)計(jì)模式。