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