嵌入式系統(tǒng)圖形用戶界面(GUI)的設(shè)計(jì)與研究
掃描二維碼
隨時(shí)隨地手機(jī)看文章
1 引 言
在工業(yè)控制領(lǐng)域里,各種、智能工控設(shè)備也廣泛采用了嵌入式技術(shù),但由于資源有限, 這些系統(tǒng)一般不希望建立在龐大累贅的、非常消耗系統(tǒng)資源的操作系統(tǒng)和GUI之上,比如Windows或X Window。這些系統(tǒng)對(duì)輕型GUI的需求更加突出。因此,在工業(yè)控制系統(tǒng)中實(shí)現(xiàn)一個(gè)簡(jiǎn)潔、快速、方便的嵌入式GUI系統(tǒng)具有廣闊的市場(chǎng)應(yīng)用前景。
嵌入式系統(tǒng)往往是一種定制設(shè)備,它們對(duì)GUI的需求也各不相同。有些系統(tǒng)只要求一些圖形功能,而有些系統(tǒng)要求完備的GUI支持,所以嵌入式GUI必須呈模塊結(jié)構(gòu),便于配置和定制。本文根據(jù)嵌入式系統(tǒng)的特點(diǎn)提出一種嵌入式GUI的實(shí)現(xiàn)方案,通過本方案設(shè)計(jì)實(shí)現(xiàn)滿足工控要求的嵌入式GUI系統(tǒng)不僅具有很好的通用性,還具有輕型、占用資源少,高性能,高可靠性,可配置等特點(diǎn),可以方便地移植到各種工控嵌入式系統(tǒng)中。
2 嵌入式GUI系統(tǒng)的關(guān)鍵技術(shù)
2.1 消息驅(qū)動(dòng)機(jī)制
所謂的“消息驅(qū)動(dòng)”或 “事件驅(qū)動(dòng)”,就是用戶可以用點(diǎn)擊任意的窗口和控件,也可以用鍵盤在當(dāng)前輸入焦點(diǎn)輸入內(nèi)容;由用戶主導(dǎo)程序下一步如何操作,而不是像字符時(shí)代那樣由程序來主導(dǎo)用戶。嵌入式GUI采用了這一思想,以消息驅(qū)動(dòng)機(jī)制為核心,把GUI系統(tǒng)的各個(gè)組成部分有機(jī)地結(jié)合起來。
2.2 窗口管理技術(shù)
為了實(shí)現(xiàn)對(duì)多窗口的支持,即允許用戶把內(nèi)容顯示在不同的、而且可以重疊的窗口區(qū)域內(nèi),這必然涉及到各個(gè)窗口在屏幕上的層疊順序,需要GUI系統(tǒng)提供一種有效的窗口管理機(jī)制,我們采用一種稱為窗口Z序的機(jī)制來進(jìn)行管理。
2.3 實(shí)現(xiàn)平臺(tái)無關(guān)性
嵌入式系統(tǒng)應(yīng)用的領(lǐng)域不同,要求的GUI底層設(shè)備也不同,為了便于GUI移植到不同硬件平臺(tái),應(yīng)設(shè)計(jì)隔離硬件設(shè)備的硬件抽象層。它定義了一組不依賴于任何特殊硬件的抽象接口,所有頂層的圖形操作和輸入處理都建立在抽象接口之上。它位于硬件設(shè)備和軟件之間,實(shí)現(xiàn)對(duì)顯示輸出設(shè)備(如顯示器)、用戶輸入設(shè)備(鍵盤、)的控制,向GUI上層軟件提供統(tǒng)一的編程接口。我們封裝了硬件抽象接口的實(shí)現(xiàn)函數(shù),移植到不同的硬件,只需考慮修改直接和硬件打交道的幾個(gè)函數(shù)即可,移植者無需關(guān)心硬件抽象接口的實(shí)現(xiàn)。通過這個(gè)設(shè)備硬件抽象層隔離具體的物理實(shí)現(xiàn),以實(shí)現(xiàn)GUI硬件無關(guān)性。
3 嵌入式GUI的體系結(jié)構(gòu)
根據(jù)上面的分析,嵌入式GUI系統(tǒng)采取分層設(shè)計(jì)的結(jié)構(gòu),其分層結(jié)構(gòu)圖如圖1所示。
從圖中可以看出,最底層GAL和IAL是與底層輸入輸出設(shè)備接口,便于GUI掛接不同的輸入輸出設(shè)備,實(shí)現(xiàn)GUI系統(tǒng)良好的可移植性和通用性。中間的核心層包含了嵌入式GUI全部功能的算法。上層是API層,提供操作各種GUI對(duì)象(如窗口、菜單等)的應(yīng)用編程接口函數(shù)。
4 嵌入式GUI核心層的總體設(shè)計(jì)
GUI核心層主要由三個(gè)子系統(tǒng)組成,分別是服務(wù)管理子系統(tǒng)、事件管理子系統(tǒng)、窗口管理子系統(tǒng),各子系統(tǒng)相對(duì)獨(dú)立又彼此聯(lián)系。圖2為GUI系統(tǒng)核心層的實(shí)現(xiàn)框架圖。
4.1服務(wù)管理子系統(tǒng)
4.1.1 圖形設(shè)備接口
圖形設(shè)備接口(GDI)是建立在圖形輸出抽象層上的一個(gè)獨(dú)立的繪圖應(yīng)用接口,它將圖形輸出抽象層提供的接口功能進(jìn)一步封裝和擴(kuò)充,向更高層的應(yīng)用程序接口提供使用更為簡(jiǎn)便,功能更為完善的繪圖功能。GDI提供的圖形服務(wù)包括:基本繪圖原語、文本和字體支持、圖像格式支持、高級(jí)圖形功能。
4.1.2 內(nèi)存堆管理
內(nèi)存堆管理是為了避免在系統(tǒng)運(yùn)行過程中動(dòng)態(tài)分配和釋放內(nèi)存時(shí)引起存儲(chǔ)碎片。
4.1.3 器管理
系統(tǒng)的時(shí)間管理需采用器管理來實(shí)現(xiàn)。當(dāng)用戶需要的處理某項(xiàng)操作將會(huì)使用該模塊,在系統(tǒng)中也有使用,如編輯框控件中光標(biāo)的閃爍等。
4.2 事件管理子系統(tǒng)
事件管理子系統(tǒng)主要以消息驅(qū)動(dòng)機(jī)制為核心,負(fù)責(zé)定義、分發(fā)、處理所有的GUI事件。事件管理子系統(tǒng)支持GUI對(duì)象間通信和GUI系統(tǒng)與GUI外部系統(tǒng)間通信。
4.3 窗口管理子系統(tǒng)
窗口管理子系統(tǒng)負(fù)責(zé)創(chuàng)建、刪除、管理各種窗口,實(shí)現(xiàn)各種預(yù)定義窗口(控件)邏輯,進(jìn)行裁剪以保證多窗口的正確顯示,以及各種窗口邏輯事件的產(chǎn)生和處理。
4.3.1 屏幕和窗口管理
窗口是GUI的基礎(chǔ),一切的GUI操作都是在窗口的基礎(chǔ)上完成的。在用戶主任務(wù)中,我們首先建立一個(gè)基準(zhǔn)窗體,覆蓋整個(gè)幕,此窗口可稱為桌面,然后在其上建立任務(wù)窗口以及子窗口。窗口管理支持多線程,以方便進(jìn)行窗口的移動(dòng)、大小改變、隱藏恢復(fù)、焦點(diǎn)切換等,并最終維護(hù)由于多窗口操作引起的Z序變化。窗口管理主要負(fù)責(zé)窗口的繪制、窗口的重畫及消息處理。
4.3.2 基本控件
控件可以理解為主窗口中的子窗口。一般地,GUI系統(tǒng)都會(huì)預(yù)先定義一些控件類,當(dāng)利用某個(gè)控件類創(chuàng)建控件之后,所有屬于這個(gè)控件類的控件均會(huì)具有相同的行為和外觀。利用這些技術(shù),可以確保一致的人機(jī)操作界面;而對(duì)程序員來講,可以像搭積木一樣地組建圖形用戶界面。本模塊提供了常用的預(yù)定義控件類,包括按鈕、單選框、復(fù)選框、靜態(tài)框等。
5 嵌入式GUI系統(tǒng)核心層的具體設(shè)計(jì)與實(shí)現(xiàn)
5.1 窗口剪切算法的設(shè)計(jì)
GUI采用窗口剪切算法來支持多窗口風(fēng)格。窗口剪切算法以矩形為基本單位來表示剪切域,算法以設(shè)備上下文中全局剪切域、局部剪切域和有效剪切域等屬性,根據(jù)一定的工作機(jī)制來限定圖形輸出區(qū)域,任何超過該設(shè)備上下文輸出區(qū)域的部分均被裁剪。底層圖形引擎在進(jìn)行輸出時(shí),根據(jù)當(dāng)前輸出的剪切域進(jìn)行輸出的剪切操作,從而保證了窗口間重疊也不會(huì)混亂。
GUI系統(tǒng)一般利用Z序來管理窗口之間的互相剪切關(guān)系,根據(jù)窗口在Z序中所處的位置計(jì)算每個(gè)窗口的剪切域。我們可以將某個(gè)窗口全局剪切域歸納為原有剪切域中排除某個(gè)矩形而生成的:窗口的全局剪切域初始化為窗口矩形;當(dāng)窗口之上有窗口覆蓋時(shí),則該窗口的全局剪切域?yàn)榕懦麓翱诰匦沃蟮募羟杏?沿Z序迭代第2步,直到最頂層窗口。
顯然,在剪切域非常復(fù)雜,或者窗口非常多時(shí),需要大量的矩形來表示每個(gè)窗口的全局剪切域,為支持運(yùn)行時(shí)大量的剪切運(yùn)算,剪切域的實(shí)現(xiàn)采用動(dòng)態(tài)內(nèi)存分配。
而在C程序中,如果頻繁使用malloc和申請(qǐng)和釋放每個(gè)剪切矩形,將帶來許多問題。第一,malloc和是非常耗時(shí)的操作:第二,頻繁的malloc和將導(dǎo)致C程序堆的碎片化,從而可能導(dǎo)致將來的內(nèi)存分配失敗。為了避免頻繁使用malloc和free,在初始化時(shí),建立了一個(gè)私有的堆,自行管理剪切域數(shù)據(jù)塊的申請(qǐng)和釋放。我們可以直接從這個(gè)堆中分配剪切矩形,而不需要從進(jìn)程的全局堆中分配剪切矩形。這個(gè)私有堆實(shí)際是由一些空閑待用的剪切矩形組成的。每次分配時(shí)返回該鏈表的頭節(jié)點(diǎn),而在釋放時(shí)放進(jìn)該鏈表的尾節(jié)點(diǎn)。如果該鏈表為空,則利用malloc從進(jìn)程的全局堆中分配剪切矩形。
與排除矩形相反的操作是包含某個(gè)矩形到剪切域中。這個(gè)操作用于隱藏或者銷毀某個(gè)窗口時(shí)。當(dāng)一個(gè)窗口被隱藏或銷毀時(shí),該窗口之下的所有窗口將受到影響,此時(shí),要將被隱藏或銷毀窗口的矩形包含到這些受影響窗口的全局剪切域中??稍O(shè)置一個(gè)函數(shù)專用于該類操作。為確保剪切域中矩形互不相交,該函數(shù)首先計(jì)算與每個(gè)剪切矩形的相交矩形,然后將自己添加到該剪切域中。
5.2 消息驅(qū)動(dòng)機(jī)制的設(shè)計(jì)與實(shí)現(xiàn)
5.2.1 消息隊(duì)列及消息循環(huán)的設(shè)計(jì)
GUI系統(tǒng)的每個(gè)輸入設(shè)備隨時(shí)可能產(chǎn)生輸入事件,同時(shí)系統(tǒng)內(nèi)部也可能發(fā)生各種事件, GUI系統(tǒng)的輸入層接收到這些事件后就合成各種不同的消息,然后向上傳遞。對(duì)于操作系統(tǒng)來說只能順序地向應(yīng)用程序傳送消息,因此,若同時(shí)出現(xiàn)多個(gè)事件,必須有一個(gè)機(jī)制來管理這些同時(shí)產(chǎn)生的事件。在GUI系統(tǒng)中這種機(jī)制就稱為消息隊(duì)列,按照事件的時(shí)序把它們的消息送入隊(duì)列,窗口系統(tǒng)再依次向應(yīng)用程序發(fā)送。消息隊(duì)列的數(shù)據(jù)結(jié)構(gòu)為一個(gè)全局的循環(huán)隊(duì)列,同時(shí)定義一組基于該循環(huán)隊(duì)列的操作:初始化消息隊(duì)列、清空消息隊(duì)列、壓入消息隊(duì)列和彈出消息隊(duì)列等等。在實(shí)際設(shè)計(jì)消息隊(duì)列時(shí)要考慮消息的傳遞方式、優(yōu)先級(jí)和特殊消息的處理等問題。
GUI系統(tǒng)采用消息驅(qū)動(dòng)的框架結(jié)構(gòu);應(yīng)用程序建立一個(gè)循環(huán),GUI不斷輪詢消息隊(duì)列,把獲得的消息根據(jù)消息路由算法進(jìn)行分發(fā)和投遞,送達(dá)目的對(duì)象,由目的對(duì)象提供消息處理。處理結(jié)束后,重新進(jìn)入消息循環(huán),直至退出消息出現(xiàn),消息循環(huán)的流程如圖3所示。
如果消息隊(duì)列為空,GUI將優(yōu)先等待外部事件的發(fā)生,然后把等待到的事件(外部輸入事件或超時(shí)事件)封裝為消息壓入消息隊(duì)列。窗口在創(chuàng)建時(shí)一定要提供一個(gè)消息處理函數(shù),用戶在該函數(shù)中對(duì)每一個(gè)關(guān)心的消息作出判斷和處理。
5.2.2 消息路由算法
GUI的消息路由基本主線(自頂向下):桌面-->某個(gè)主窗口-->某個(gè)控件。系統(tǒng)消息路由算法包括鍵盤路由算法和路由算法。
6 用戶應(yīng)用程序舉例
圖4給出的是一個(gè)典型的嵌入式GUI方案設(shè)計(jì)的流程圖。假設(shè)這個(gè)系統(tǒng)有n個(gè)頁面,每個(gè)頁面有若干GUI元件。當(dāng)有消息或事件時(shí),系統(tǒng)進(jìn)行消息處理,如需轉(zhuǎn)換界面進(jìn)入下一界面,系統(tǒng)則進(jìn)行窗口之間的切換,包括窗口的關(guān)閉、剪切、刪除、隱藏等動(dòng)作。
7 結(jié)束語
本文詳細(xì)介紹一種為工業(yè)控制嵌入式系統(tǒng)應(yīng)用而開發(fā)的的輕量級(jí)、功能豐富、易定制、易移植的圖形人機(jī)界面開發(fā)包,與同類產(chǎn)品相比具有代碼量小、執(zhí)行效率高的特點(diǎn)。用C語言編寫的GUI程序可以方便地移植到各種工業(yè)控制嵌入式系統(tǒng)中,使用簡(jiǎn)單、通用性好,能滿足一些較復(fù)雜界面顯示的需要,其已運(yùn)行于基于ARM微處理器的嵌入式硬件平臺(tái)之上,已經(jīng)在工控嵌入式系統(tǒng)中得到應(yīng)用。實(shí)用表明,我們?cè)O(shè)計(jì)的GUI系統(tǒng)運(yùn)行良好,很好地滿足了人機(jī)交互界面的要求。
本文作者創(chuàng)新點(diǎn):本GUI系統(tǒng)設(shè)計(jì)方案完全用C語言編寫,可移植性好,與同類產(chǎn)品相比,具有輕型、占用資源少,可剪裁、執(zhí)行效率高、高可靠性等特點(diǎn),特別適合在基于ARM微處理器的工控嵌入式系統(tǒng)中應(yīng)用。