摘要:在嵌入式系統(tǒng)越來(lái)越復(fù)雜的情況下,一個(gè)設(shè)計(jì)糟糕的系統(tǒng),其運(yùn)行行為很難、甚至不可能預(yù)測(cè),設(shè)計(jì)所帶來(lái)的風(fēng)險(xiǎn)也越來(lái)越大。該文為嵌入式系統(tǒng)軟件提供了一種實(shí)用、簡(jiǎn)捷的開(kāi)發(fā)和設(shè)計(jì)模式,仿真系統(tǒng)。仿真系統(tǒng)將嵌入式系統(tǒng)的圖形界面、業(yè)務(wù)控制流程和輸入/輸出設(shè)備操作進(jìn)行有效的解耦合。提高了開(kāi)發(fā)效率,使得系統(tǒng)的易于實(shí)現(xiàn)、測(cè)試與維護(hù)。
關(guān)鍵詞:仿真系統(tǒng);嵌入式系統(tǒng);LCD仿真; Win32
中圖分類(lèi)號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2008)26-1837-03
The Research and Development of Embed Simulate System
YAO Li
(Dept. of Software Engineering, TongJi University, Shanghai 201804, China)
Abstract: In the present complex situation, the control of test and forecast about an embed system become more and more hard. Along with this condition, we will get more and more risks in development of an embed production. In this page, a new effective, brief development module will be introduced. In the simulate system, the coupling among each modules, such as graphical interfaces, business flow, I/O control and so on, will be more flexible, and the coding, unit test and maintenance will be more effective.
Key words: simulate system; embed system; LCD simulator; Win32
1 引言
20世紀(jì)40年代末以來(lái)伴隨著計(jì)算機(jī)技術(shù)的發(fā)展,傳統(tǒng)嵌入式產(chǎn)品開(kāi)發(fā)的模式越來(lái)越不能滿(mǎn)足現(xiàn)代高效率低成本開(kāi)發(fā)的需要。如何將先進(jìn)的計(jì)算機(jī)技術(shù)應(yīng)用到傳統(tǒng)嵌入式產(chǎn)品開(kāi)發(fā)中來(lái)成為該領(lǐng)域的一個(gè)熱門(mén)問(wèn)題。最初,仿真技術(shù)主要用于航空、航天、原子反應(yīng)堆等價(jià)格昂貴、周期長(zhǎng)、危險(xiǎn)性大、實(shí)際系統(tǒng)試驗(yàn)難以實(shí)現(xiàn)的少數(shù)領(lǐng)域,后來(lái)逐步發(fā)展到電力、石油、化工、冶金、機(jī)械等一些主要工業(yè)部門(mén),并進(jìn)一步擴(kuò)大到社會(huì)系統(tǒng)、經(jīng)濟(jì)系統(tǒng)、交通運(yùn)輸系統(tǒng)、生態(tài)系統(tǒng)等一些非工程系統(tǒng)領(lǐng)域。近年來(lái),隨著高新技術(shù)的飛速發(fā)展對(duì)硬件仿真的應(yīng)用變的迫切的需要。
2 典型嵌入式系統(tǒng)
典型嵌入式系統(tǒng)結(jié)構(gòu)如圖1所示,包括界面顯示、輸入/輸出設(shè)備管理、業(yè)務(wù)控制流程管理以及數(shù)據(jù)管理4部分功能模塊。其他類(lèi)型的嵌入式系統(tǒng)都可在此基礎(chǔ)上縮減或擴(kuò)展,其基本的軟件設(shè)計(jì)思路是完全相同的。系統(tǒng)的一致性為研究統(tǒng)一軟件架構(gòu)設(shè)計(jì)模式提供了廣闊的應(yīng)用空間。
但是,在這樣的軟件架構(gòu)設(shè)計(jì)模式下很多嵌入式系統(tǒng)隨心所欲地構(gòu)建了系統(tǒng),把界面顯示、輸入/輸出設(shè)備管理、業(yè)務(wù)控制流程管理以及數(shù)據(jù)管理功能模塊糾纏在一起,導(dǎo)致設(shè)計(jì)的系統(tǒng)具有極高的耦合性。任何事物之間都要進(jìn)行通信,所有重要的狀態(tài)數(shù)據(jù)都可能是全局的。在狀態(tài)信息被隔開(kāi)的地方,需要通過(guò)錯(cuò)綜復(fù)雜的后端通道雜亂地傳遞,以繞開(kāi)系統(tǒng)的原有結(jié)構(gòu)。變量名和函數(shù)名信息量不足,甚至?xí)鹫`導(dǎo)作用。函數(shù)可能使用大量全局變量以及定義模糊的冗長(zhǎng)的參數(shù)列表。函數(shù)本身冗長(zhǎng)、費(fèi)解,完成多項(xiàng)毫無(wú)關(guān)聯(lián)的任務(wù)。代碼重復(fù)很多,控制流很難看清,難以找到來(lái)龍去脈,程序員的意圖幾乎無(wú)法理解,代碼完全不可讀。
總之,在這樣的開(kāi)發(fā)模式下,產(chǎn)品的質(zhì)量以及開(kāi)發(fā)周期等等都是無(wú)法控制的,帶來(lái)的后果也是無(wú)法預(yù)測(cè)的。而本文提的供仿真系統(tǒng)可以很好的解決這樣的問(wèn)題。
3 仿真系統(tǒng)原理
仿真系統(tǒng)模擬各種硬件資源和單片機(jī)的效果,給開(kāi)發(fā)系統(tǒng)提供資源從而替代傳統(tǒng)的實(shí)體開(kāi)發(fā)燒寫(xiě)。同是該系統(tǒng)僅向開(kāi)發(fā)系統(tǒng)提供使用接口很好的控制了代碼的范疇。
仿真系統(tǒng)模將傳統(tǒng)的系統(tǒng)結(jié)構(gòu)各個(gè)模塊獨(dú)立出來(lái),采用MOP的設(shè)計(jì)模式。使的開(kāi)發(fā)人員可以按照自己的模塊來(lái)開(kāi)發(fā),而不需去理會(huì)其他的情況,如代碼重復(fù)等等。仿真系統(tǒng)擁有一個(gè)固定的框架基礎(chǔ),低耦合的模塊劃分,從而使調(diào)用操作對(duì)象和控制操作對(duì)象有效的解耦合。
4 仿真系統(tǒng)基于西門(mén)子PAC3100的應(yīng)用
硬件仿真系統(tǒng),除開(kāi)引語(yǔ)中提到的必然的原因外,在實(shí)際的產(chǎn)品項(xiàng)目開(kāi)發(fā)中由于封裝了嵌入式產(chǎn)品的整個(gè)框架,使的開(kāi)發(fā)只需要定制系統(tǒng)。從而大大提高了產(chǎn)品開(kāi)發(fā)的效率,使程序員可以更專(zhuān)注于功能的開(kāi)發(fā)。
PAC3100系統(tǒng)是主要由LCD,LCD RAM,系統(tǒng),系統(tǒng)RAM組成。其中LCD由顯示主屏(如圖2LCD),導(dǎo)航條,滾動(dòng)條,菜單標(biāo)題和按鍵組成,而LCD RAM由于采用的是模塊化設(shè)計(jì)響應(yīng)的針對(duì)各個(gè)模塊有自己的RAM空間。在系統(tǒng)模塊部分,主要有文件系統(tǒng),目標(biāo)仿真系統(tǒng)和通信系統(tǒng)。他們分別承擔(dān)各自的任務(wù),并不互相影響,他們的數(shù)據(jù)共用系統(tǒng)內(nèi)存。
系統(tǒng)結(jié)構(gòu)設(shè)計(jì)圖如下:
4.1 系統(tǒng)的軟件設(shè)計(jì)
4.1.1 系統(tǒng)仿真
在系統(tǒng)仿真的過(guò)程中,操作系統(tǒng)的仿真最為重要是整個(gè)仿真的核心部分。他的基本控制類(lèi)有os和task類(lèi),他們分別模擬系統(tǒng)環(huán)境和系統(tǒng)的任務(wù)管理,由于嵌入式系統(tǒng)對(duì)資源要求很高,故只具備必須的管理能力,而且這些模塊也是根據(jù)需要來(lái)裁減的。
class os{
public:
static unsigned long getSystemTime();//獲取系統(tǒng)時(shí)間
… //初試化系統(tǒng)參數(shù)
os(){}; //構(gòu)建虛擬系統(tǒng)環(huán)境
};
class Task{
public:
Task(){}; //任務(wù)控制對(duì)象
static Sleep(int ms, int type){
…//控制任務(wù)休眠,或掛起,模擬真實(shí)系統(tǒng)工作
};
static voidDisableTaskSwitch(){…};//阻塞任務(wù)
static voidEnableTaskSwitch(){…};//停止阻塞
};
4.1.2 LCD仿真
如果說(shuō)系統(tǒng)的仿真是核心,那LCD的仿真則是關(guān)鍵所在90%以上的嵌入式產(chǎn)品都是應(yīng)用LCD來(lái)顯示信息,如:測(cè)量的數(shù)據(jù),計(jì)算的結(jié)果等等。下面就介紹一下在該系統(tǒng)中LCD的仿真。圖3為類(lèi)的結(jié)構(gòu)圖。
class CLcdSim{
public:
unsigned char*GetShadowRam(); //獲取LCD的FALSH的地址
unsigned charReadDisplayStatus(){…};//讀取當(dāng)前要顯示的狀態(tài)
unsigned charReadDisplayData(){…};//讀取當(dāng)前要顯示的數(shù)據(jù)
…
voidWash(unsigned char ucColor); //將LCD內(nèi)存清空數(shù)據(jù)
voidSetBacklightLevel(unsigned char ucLevel);//設(shè)置背景亮度等級(jí)
boolm_bReadModify;//讀寫(xiě)模式標(biāo)記
static unsigned charm_ShadowRam[kPages*kSegments*kCOLOR_BITS];
//LCD內(nèi)存分配
CLcdSim(const CLcdSim);
};
class CGrayLcd : public CLcdSim{
public:
voidClear();
voidSetPixel(int x, int y, int iColor, bool NoModify=FALSE); //進(jìn)行象素控制
voidSetText(const char * szText, int x, int y, Font font, int iColor, int iBGColor,unsigned int iTabPosition=0);//進(jìn)行文字控制
}
voidCGrayLcd::SetText(const char * szText, int x, int y, Font font, int iColor, int iBGColor, unsigned int iTabPosition){
SetTextMono(szText, x, y, font, iColor, iBGColor, iTabPosition);//通過(guò)調(diào)用SetTextMono系統(tǒng)獨(dú)立的API數(shù)據(jù)寫(xiě)入函數(shù)
}
VoidSetTextMono(const char * szText, int x, int y, Font font, int iColor, int iBGColor, unsigned int iTabPosition){ //控制拿到各種語(yǔ)言的文字
#if defined FONT_MEG5
case meg5:pGlyph = (unsigned char*) meg5Versal[ch - 0x20]; break;
#endif
……
default: return;
}
BitmapDesc bmp(pGlyph[3],pGlyph[4], 1,pGlyph+5);//將文字構(gòu)造成系統(tǒng)獨(dú)立的類(lèi)位圖形式
BlitBitmap(…);//將類(lèi)位圖形式寫(xiě)入內(nèi)存
szText++;x += pGlyph[0];
}
顯示效果如圖4:
該種LCD仿真設(shè)計(jì)的優(yōu)點(diǎn)在于,完全的結(jié)構(gòu)化和處理數(shù)據(jù)分離技術(shù)。在結(jié)構(gòu)化方面,不在需要去手動(dòng)控制顯示何種數(shù)據(jù)。如:多國(guó)語(yǔ)言等;完全通過(guò)宏的定義來(lái)處理,大大提高了效率。在處理數(shù)據(jù)分離方面,如果有新的數(shù)據(jù)需要新建在也不是麻煩的在程序中造字了,我們只需要將文字在外部數(shù)據(jù)excel中添加,SetTextMono函數(shù)將會(huì)處理實(shí)現(xiàn),同時(shí)還可以設(shè)計(jì)文字的各種參數(shù)。給開(kāi)發(fā)帶來(lái)了方便,可以使我們更關(guān)注于產(chǎn)品功能的實(shí)現(xiàn)。
5 結(jié)論
仿真系統(tǒng)通過(guò)仿真主控程序可以做到讓這些目標(biāo)程序做特定的運(yùn)行,比如單步、指定斷點(diǎn)、指定地址等。仿真器和電腦主機(jī)就像是兩個(gè)精密的齒輪相互咬合的關(guān)系,這也體現(xiàn)了仿真的特性,即“所見(jiàn)即所得”。這些都是編程器無(wú)法做到的。這些給調(diào)試、修改、以及生成最終程序創(chuàng)造了比較有力的保證,從而實(shí)現(xiàn)較高的效率。
可以說(shuō),現(xiàn)代系統(tǒng)仿真技術(shù)和綜合性仿真系統(tǒng)已經(jīng)成為任何復(fù)雜系統(tǒng),特別是高技術(shù)產(chǎn)業(yè)不可缺少的分析、研究、設(shè)計(jì)、評(píng)價(jià)、決策和訓(xùn)練的重要手段。其應(yīng)用范圍在不斷擴(kuò)大,應(yīng)用效益也日益顯著。
參考文獻(xiàn):
[1] Dickel D M.軟件架構(gòu)組織原則與模式[M].北京:機(jī)械工業(yè)出版社,2003.
[2] 馬忠梅.ARM嵌入式處理器結(jié)構(gòu)與應(yīng)用基礎(chǔ)[M].北京:航空航天大學(xué)出版社,2002.
[3] MikeyWilliams.Windows2000編程技術(shù)內(nèi)幕[M].北京:機(jī)械工業(yè)出版社,2001.
[4] 龍楊喜,孫書(shū)鷹.基于WinDriver的設(shè)備驅(qū)動(dòng)開(kāi)發(fā)基礎(chǔ)[J].微機(jī)計(jì)算機(jī)信息,2004,20(7):63-64,75.
[5] Gamma E, Helm R, Johnson R,et al.設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)[M].李英,譯.北京:機(jī)械工業(yè)出版社,2000.
[6] McConnell S.代碼大全[M].2版.金戈,譯.北京:電子工業(yè)出版社,2006.
[7] Fowler M.重構(gòu)—改善既有代碼的設(shè)計(jì)[M].侯捷,譯.北京:中國(guó)電力出版社,2003.
[8] Solter M A, Kleper S J.C++高級(jí)編程[M].劉鑫,譯.北京:機(jī)械工業(yè)出版社,2006.