一種可移植的嵌入式圖形支持系統(tǒng):MiniGUI
基于MiniGUI的嵌入式系統(tǒng)軟件結(jié)構(gòu)
為什么MiniGUI能夠在如此眾多的嵌入式操作系統(tǒng)上運(yùn)行?這是因?yàn)?a class="contentlabel" href="http://butianyuan.cn/news/listbylabel/label/MiniGUI">MiniGUI具有良好的軟件架構(gòu),通過(guò)抽象層將MiniGUI上層和底層操作系統(tǒng)隔離開(kāi)來(lái)。如圖2所示,基于MiniGUI的應(yīng)用程序一般通過(guò) ANSI C庫(kù)以及MiniGUI自身提供的API來(lái)實(shí)現(xiàn)自己的功能;MiniGUI中的“可移植層”可將特定操作系統(tǒng)及底層硬件的細(xì)節(jié)隱藏起來(lái),而上層應(yīng)用程序則無(wú)需關(guān)心底層的硬件平臺(tái)輸出和輸入設(shè)備。
另外,MiniGUI特有的運(yùn)行模式概念,也為跨操作系統(tǒng)的支持提供了便利。
與Linux這樣的類UNIX操作系統(tǒng)相比,一般意義上的傳統(tǒng)嵌入式操作系統(tǒng)具有一些特殊性。舉例而言,諸如uClinux、uC/OS-II、eCos、VxWorks等操作系統(tǒng),通常運(yùn)行在沒(méi)有內(nèi)存管理單元的CPU上;這時(shí),往往就沒(méi)有進(jìn)程的概念,而只有線程或者任務(wù)的概念,這樣,GUI系統(tǒng)的運(yùn)行環(huán)境也就大相徑庭。因此,為了適合不同的操作系統(tǒng)環(huán)境,我們可將MiniGUI配置成三種運(yùn)行模式:
1.MiniGUI-Threads。運(yùn)行在MiniGUI-Threads上的程序可以在不同的線程中建立多個(gè)窗口,但所有的窗口在一個(gè)進(jìn)程或者地址空間中運(yùn)行。這種運(yùn)行模式非常適合于大多數(shù)傳統(tǒng)意義上的嵌入式操作系統(tǒng),如uC/OS-II、eCos、VxWorks、pSOS等等。當(dāng)然,在Linux和uClinux上,MiniGUI也能以MiniGUI-Threads的模式運(yùn)行。
2. MiniGUI-Lite。與MiniGUI-Threads相反,MiniGUI-Lite上的每個(gè)程序是單獨(dú)的進(jìn)程,每個(gè)進(jìn)程也可以建立多個(gè)窗口。MiniGUI-Lite適合于具有完整UNIX特性的嵌入式操作系統(tǒng),比如嵌入式Linux。
3. MiniGUI-Standalone。這種運(yùn)行模式下,MiniGUI能以獨(dú)立進(jìn)程的方式運(yùn)行,既不需要多線程也不需要多進(jìn)程的支持,這種運(yùn)行模式適合功能單一的應(yīng)用場(chǎng)合。例如在一些使用uClinux的嵌入式產(chǎn)品中,因?yàn)楦鞣N原因而缺少線程支持,這時(shí),就可以使用MiniGUI-Standalone來(lái)開(kāi)發(fā)應(yīng)用軟件。
一般而言,MiniGUI-Standalone模式的適應(yīng)面最廣,可以支持幾乎所有的操作系統(tǒng),甚至包括類似DOS這樣的操作系統(tǒng);MiniGUI-Threads模式的適用面次之,可運(yùn)行在支持多任務(wù)的實(shí)時(shí)嵌入式操作系統(tǒng),或者具備完整UNIX特性的普通操作系統(tǒng);MiniGUI-Lite模式的適用面較小,它僅適合于具備完整UNIX特性的普通操作系統(tǒng)。
不論采用哪種運(yùn)行模式,MiniGUI為上層應(yīng)用軟件提供了最大程度上的一致性;只有少數(shù)幾個(gè)涉及初始化的接口在不同運(yùn)行模式上有所不同。
MiniGUI在uC/OS-II操作系統(tǒng)上的移植
下面以u(píng)C/OS-II操作系統(tǒng)為例,簡(jiǎn)單介紹MiniGUI到該操作系統(tǒng)上的移植。
uC/OS-II非常簡(jiǎn)單,只要有一個(gè)普通的C編譯器,就能完成編譯并運(yùn)行該操作系統(tǒng),因此,uC/OS-II首先在教學(xué)中得到了廣泛應(yīng)用。因?yàn)槠浜?jiǎn)單及實(shí)時(shí)性好的特點(diǎn),現(xiàn)在也有一些用戶開(kāi)始使用uC/OS-II操作系統(tǒng)開(kāi)發(fā)正式的嵌入式產(chǎn)品。
將MiniGUI移植到uC/OS-II是相對(duì)復(fù)雜的一項(xiàng)工作。因?yàn)閡C/OS-II中缺乏象malloc/free甚至是printf/fprintf/sprintf這樣的接口,不過(guò),最重要的還是缺乏與POSIX-Threads兼容的接口。為此,我們編寫(xiě)了POSIX-Threads的繞轉(zhuǎn)接口,這些繞轉(zhuǎn)接口兼容于POSIX-Threads。同時(shí),我們還實(shí)現(xiàn)了 malloc/free,以及printf/sprintf/fprintf等接口。
因涉及到如此多底層特性的增強(qiáng)和修改,整個(gè)系統(tǒng)的調(diào)試將是非常困難的。為解決調(diào)試問(wèn)題,我們首先在SkyEye(清華大學(xué)陳渝主持的自由軟件項(xiàng)目)模擬器上運(yùn)行uC/OS-II操作系統(tǒng)及MiniGUI for uC/OS-II。我們首先使用了MiniGUI內(nèi)部的Dummy GAL引擎和Dummy/Auto IAL 引擎(這兩個(gè)引擎分別通過(guò)軟件方法來(lái)模擬實(shí)際的輸出和輸入設(shè)備,如LCD顯示屏及鍵盤(pán))來(lái)運(yùn)行MiniGUI的應(yīng)用程序。盡管我們看不到真實(shí)的屏幕輸出,但從應(yīng)用程序在運(yùn)行過(guò)程中打印的輸出信息,我們可以看到MiniGUI for uC/OS-II已經(jīng)正常工作了。接下來(lái)的工作就是將MiniGUI for uC/OS-II移植到正式的硬件產(chǎn)品中。
我們?cè)赟3C2410開(kāi)發(fā)板上用ADS的armcc編譯并測(cè)試了MiniGUI的uC/OS-II版本。這次,我們針對(duì)這個(gè)開(kāi)發(fā)板編寫(xiě)了正式的圖形和輸入引擎。MiniGUI的所有示例程序都可以在這塊開(kāi)發(fā)板上正常運(yùn)行。
評(píng)論