主頁(http://www.www.xzhtuan.com):嵌入式DVR軟件中用結(jié)構(gòu)化語言實現(xiàn)面向?qū)ο蟮脑O(shè)計思想 嵌入式DVR是一種高度集成、復(fù)雜的嵌入式設(shè)備,其軟件需要保證良好的可靠性、復(fù)用性、擴展性及高效性。 傳統(tǒng)的結(jié)構(gòu)化設(shè)計方法,在其軟件設(shè)計中就有些“力不從心”,因為結(jié)構(gòu)化的軟件要求軟件設(shè)計一開始就假定軟件需求是很明確的,系統(tǒng)處理數(shù)據(jù)的模式和方法也是明確的。然而DVR的用戶是面向不同領(lǐng)域的,而每個客戶的要求都有所不同,如有的客戶可能需要用RS485總線來控制溫度采集器,有的則可能需要來控制云臺,這在結(jié)構(gòu)化設(shè)計方面就需要用不同的數(shù)據(jù)結(jié)構(gòu)和方法來描述。因此,每當(dāng)針對不同客戶就需要專門定制不同的軟件版本,這無疑增加了軟件的維護和測試成本,這是DVR生產(chǎn)廠商所不愿意看到的。并且,面向?qū)ο蟮脑O(shè)計思想需要采用面向?qū)ο蟮脑O(shè)計語言,無疑是對嵌入式設(shè)備一個巨大的考驗。當(dāng)然,現(xiàn)在不少嵌入式開發(fā)工具,已經(jīng)支持C++、JAVA等面向?qū)ο蟮脑O(shè)計語言。但是這些面向?qū)ο蟮恼Z言需要很大的C++設(shè)計庫,這會增加DVR對存儲設(shè)備容量的要求。而且面向?qū)ο蟮脑O(shè)計語言在執(zhí)行的時候會添加一些額外的代碼,如“析構(gòu)”、“構(gòu)造”函數(shù),會導(dǎo)致執(zhí)行效率比結(jié)構(gòu)化的設(shè)計語言要低。因此一些編譯器對面向?qū)ο蟮脑O(shè)計語言的支持遠沒有對結(jié)構(gòu)化的設(shè)計語言高。如LINUX下的GCC編譯器附帶的調(diào)試工具,在調(diào)試C++程序中有時就無法打印堆棧和函數(shù)的調(diào)用關(guān)系。 新型軟件設(shè)計方法 這種設(shè)計方法的實質(zhì)是:用面向?qū)ο蟮脑O(shè)計思想去分析嵌入式DVR的需求;用面向?qū)ο蟮脑O(shè)計模式去設(shè)計DVR軟件構(gòu)架;用結(jié)構(gòu)化的語言去實現(xiàn)DVR系統(tǒng)功能。這樣一來,就可以發(fā)揮面向?qū)ο笤O(shè)計思想在需求分析和建模方面的方便快捷直觀的優(yōu)點,同時又能保證嵌入式軟件在執(zhí)行效率和存儲方面的要求。 當(dāng)然,我們必須摒棄一些面向?qū)ο笤O(shè)計思想中需要依賴面向?qū)ο笤O(shè)計語言的一些特性,如運行中的多態(tài),類型識別等。這些行為也能夠在結(jié)構(gòu)化語言中實現(xiàn),只是有些特性對系統(tǒng)設(shè)計來說就有點無關(guān)輕重了。如果把所有面向?qū)ο蟮奶匦远寄脕碛,這就會導(dǎo)致設(shè)計走向另一個極端:在嵌入式開發(fā)上使用面向?qū)ο蟮恼Z言來設(shè)計系統(tǒng)。特別值得指出的是,面向?qū)ο笳Z言中的內(nèi)存分配,如果在嵌入式軟件上設(shè)計使用,會導(dǎo)致頻繁的動態(tài)分配不定大小的內(nèi)存,會引起系統(tǒng)堆棧破碎的風(fēng)險。 面向?qū)ο筌浖?/FONT> 設(shè)計人員采用比較實用快捷面向?qū)ο蟮腗VC結(jié)構(gòu),即模型-視圖-控制器結(jié)構(gòu),把整個系統(tǒng)分成三個部分:一部分是底層的軟件部分,我們在DVR軟件稱為“微內(nèi)核”;一部分是人機交互部分,即界面部分;另一部分則是兩者之間的接口,我們稱之為適配器。在軟件架構(gòu)上也分為三個大的部分(或者說三個軟件包):界面、“微內(nèi)核”、界面和“微內(nèi)核”之間的接口。 這三個部分在迭代中最先完成的是“微內(nèi)核”部分。而“微內(nèi)核”設(shè)計中最關(guān)鍵的就是錄像部分,這需要考慮到各種不同的錄像種類和各種錄像條件,而做好錄像部分的用例分析就可以設(shè)計出微內(nèi)核的基本架構(gòu),也就是整個軟件的“靈魂”。 完成第一次迭代設(shè)計后,DVR軟件的其它需求的開發(fā)就是一個“添枝加葉”的過程。根據(jù)面向?qū)ο笤O(shè)計“高內(nèi)聚、低耦合”的思想原則,每次迭代的過程我們都采用模塊化的設(shè)計,。在添加每一個模塊時,統(tǒng)一各個模塊的接口,采用“模塊名_domsg”做為對外接口。這樣一來,就能很好地屏蔽掉各個模塊的內(nèi)部處理機制,減少軟件開發(fā)的耦合程度。如“微內(nèi)核”中的錄像部分可能需要讀出硬盤模塊提供的分配目錄信息。,就可以通過“hdisk_domsg”來獲取。 各個模塊開發(fā) struct Module_Obj 在模塊開發(fā)中,也可以采用面向?qū)ο蟮脑O(shè)計模式。設(shè)計人員在采用軟件設(shè)計的過程就采用了很多“四人幫”(即“GOF”,四個國外開發(fā)者,提出面向?qū)ο筌浖_發(fā)中的常用設(shè)計模式)的設(shè)計模式。如在系統(tǒng)啟動后就采用創(chuàng)建式的單例模式分配系統(tǒng)內(nèi)存,保證系統(tǒng)各個模塊在系統(tǒng)中唯一。又如報警模塊中采用了observer(觀察者)模式,其它模塊如果要獲取報警信息,可先向該模塊注冊需要的報警信息,當(dāng)該報警模塊發(fā)現(xiàn)有改變報警端子有報警的時候,就會把報警信息逐個通知各個已經(jīng)注冊的模塊。這些模式的采用能夠很好地提高代碼的健壯性。 界面 |




