1、引言
近年來,隨著信息家電、手持設備、無線設備的迅速發(fā)展,人們對嵌入式系統(tǒng)的需求逐漸增多,要求也越來越高。這使為嵌入式系統(tǒng)提供一個友好方便、穩(wěn)定可靠的G UI系統(tǒng)成為非常緊迫要求[5]。嵌入式技術是當前微電子與計算機技術中的一個重要分支[1], 它是指以應用為中心, 以計算機技術為基礎,軟件、硬件可裁剪,適應應用系統(tǒng)對功能、可靠性、成本、體積、功耗等的嚴格要求的專用計算機系統(tǒng)[2]。常用的PC機上的GU I因嵌入式設備對資源的嚴格要求顯得過于龐大,而不適合嵌入式系統(tǒng)[6]。與普通環(huán)境下的GUI 系統(tǒng)相比較.嵌入式環(huán)境下的GUI 系統(tǒng)要求輕型、占用資源少、高性能、高可靠性、可配置等。同時,由于嵌入式環(huán)境的多樣性,跨平臺、高移植性也是嵌入式GUI系統(tǒng)必須具備的特點。
盡管嵌入式系統(tǒng)對GUI 的需求越來越明顯,但目前GUI的實現(xiàn)方法各有不同,主要有二種; 第一種方法是某些大型廠商針對自身需要自主開發(fā)滿足自身需要的GUI 系統(tǒng);第二種方法是某些廠商使用某些比較成熟的GUI系統(tǒng)。對于大部分廠商來說,第二種方法不失為一個省時省力、又可取得較好效果的方法。
2 GUI 系統(tǒng)發(fā)展概況
目前國內外已經推出了很多基于Linux的GUI產品, 比較成熟的面向嵌入式的GUI 系統(tǒng)有QtEmbedded 、MicroWindows 、MiniGUI 、WinCE 等[4]。
1)Microwindows 是一個公開源碼(LGPL)的項目。它致力于為一些小型的設備和平臺提供現(xiàn)代圖形窗口環(huán)境的一些特性,其主要特色是一個基于客戶/服務器體系結構的GUI 系統(tǒng),采用了面向硬功件的驅動程序層、對硬件的接口層、向高層操作系統(tǒng)的API 層的三層體系結構。并提供了相對完善的圖形功能, 以及一些其他較高級的功能,比如Alpha 混合、三維支持、TrueType 字體支持等。但是有如下缺點:無任何硬件加速能力,圖形引擎中存在許多低效算法,且代碼質量較差。
2)MiniGUI是在Linux 控制臺上運行的,基于SVGALib 和LinuxThread 庫的多窗口圖形用戶界面支持系統(tǒng)。主要特色是基于線程來編寫,所有的應用研究程序都運行在同一個地址空間,這樣可以提高系統(tǒng)的效率。底層增加了圖形抽象層GAL 和基于輸入設備的輸入抽象層作為提供底層Linux 控制臺或者XWindow 上的圖形接口以及輸入接口。但是API沒有封裝,不便移植,功能限制其不能用于更大的嵌入式系統(tǒng)。
3)Qt/Embedded 是著名的Qt庫開發(fā)商Trolltech 公司開發(fā)的,是一個專門為嵌入式系統(tǒng)設計的圖形用戶界面工具包。它的主要特點是可移植到不同平臺上、擁有自己的窗口系統(tǒng)、擁有自己強大的開發(fā)工具和編程接口、提供壓縮字體格式、支持Unicode, 可以輕松地使程序支持多種語言。但是Qt/Embedded 不是免費的,使用者必須支持license 費用。
4)OpenGL 采用LGPL 條款發(fā)布。OpenGUI 比較適合于基于x86 平臺的實時系統(tǒng),基于匯編實現(xiàn)的內核,并利用MMX 指令進行了優(yōu)化使其運行速度快,但可移植性稍差。
這幾種GUI 的設計目標仍然是通用性,它們大多支持多窗口的隨意切換、覆蓋,以及可移動、可動態(tài)改變尺寸的窗口,諸如此類在多數(shù)嵌入式應用中幾乎永遠用不到的特性,使得應用程序的開發(fā)要考慮很多不必要的細節(jié)[5]。
以上的嵌入式GUI 系統(tǒng)已很成熟,但是對于一些需求自主開發(fā)輕型、功能簡潔、專用性強GUI 系統(tǒng)的用戶來說,以上的產品并不是一個很好的選擇。以上的GUI 系統(tǒng)一部分是收費的商業(yè)產品,另外是通用的GUI功能系統(tǒng),對硬件資源非??粗氐那度胧较到y(tǒng)來說,多余無用的功能浪費硬件資源絕不是好的選擇。本文針對開發(fā)小型專用的嵌入式GUI 系統(tǒng)進行了研究,實現(xiàn)專用的GUI 系統(tǒng)的開發(fā)。
3 輕量級GUI 的設計與實現(xiàn)嵌入式GUI 系統(tǒng)采取分層設計的結構,對不同層次進行封裝。在最低層建立了硬件抽象層(HAL,Hard Abstract Layer),為基于圖形顯示設備(如VGA 卡)的圖形抽象層(Graphic Abstract Layer,GAL)和基于輸入設備(如鍵盤、觸摸屏等)的輸入抽象層(Input Abstract Layer,IAL) 。圖形抽象層GAL 建立在各種流行的繪圖引擎之上,屏蔽各種繪圖引擎的具體實現(xiàn),對上層提供統(tǒng)一的底層繪圖接口。輸入抽象層IAL建立在各硬件設備驅動程序之上,屏蔽各種不同的輸入設備硬件實現(xiàn),對上層提供統(tǒng)一的應用輸入接口;圖形引擎通過FrameBuffer 來獲得,而輸入設備的處理卻沒有統(tǒng)一的接口。在PC上,通常使用鍵盤和鼠標,而在嵌入式系統(tǒng)上, 可能只有觸摸屏或為數(shù)不多的幾個鍵,在這種情況下,提供一個抽象輸入層就顯得格外重要。圖形設備接口(GDI,Ggraphic Device Interface) 建立在圖形抽象層之上,主要包括點、線、面、文本、的繪制等功能。圖形用戶接口及相關API則建立在圖形設備接口之上,實現(xiàn)消息隊列、窗口、控件以及應用程序管理等各種功能。系統(tǒng)的層次結構如圖1所示。
3.1 嵌入式LIGHT GUI系統(tǒng)層次結構[!--empirenews.page--]
GAL 層完成系統(tǒng)對具體的顯示硬件設備的操作, 極大程度上隱藏各種不同硬件的技術實現(xiàn)細節(jié),為應用程序開發(fā)人員提供統(tǒng)一的圖形編程接口。IAL 層則需要實現(xiàn)對于各類不同輸入設備的控制操作,提供統(tǒng)一的調用接口。GAL 層與IAL 層的設計屏蔽了底層硬件的多樣性,可以極大程度地提高嵌入式GUI 的可移植性。另外利用GAL 可大大提高GUI 的可移植性,并且使程序的開發(fā)和擴展變得更加容易。圖形抽象層使用GFX 數(shù)據(jù)結構來表示圖形引擎系統(tǒng);系統(tǒng)通過輸入設備層將底層的各種設備統(tǒng)一映射成上層應用程序支持的兩種基本輸入設備——鼠標設備和鍵盤設備。對于具體的硬件設備,只要根據(jù)驅動程序提供的接口,編寫程序實現(xiàn)相應的抽象接口,就能將各種設備模擬成為鼠標或者鍵盤進行輸入。
系統(tǒng)通過維護一個已注冊圖形引擎數(shù)組,保存每個圖形引擎數(shù)據(jù)結構的指針。系統(tǒng)利用一個指針保存當前使用的圖形引擎。每個圖形引擎的數(shù)據(jù)結構定義了該圖形引擎的一些信息,實現(xiàn)GAL 所定義的各個接口,包括初始化和終止、畫點處理函數(shù)、畫線處理函數(shù)、矩形框填充函數(shù)、調色板函數(shù)等。
3.2 圖形設備接口(GDI) 圖形設備接口是建立在圖形抽象層上的一個獨立的繪圖應用接口,它將圖形抽象層提供的接口功能進一步封裝和擴充,向更高層的應用程序提供使用更為簡便,功能完善的繪圖功能。lightGUI 采用了Windows 類似于Windows 中的GDI 模塊。它提供設備上下文(Device Context) 操作、基本GDI 對象操作(包括畫筆、畫刷、字體、位圖、區(qū)域等)。在該系統(tǒng)中,設備上下文的定義采用如下數(shù)據(jù)結構:typedef struct gdi_DC{ int DrawPointx; int DrawPointy; int DrawOrgx; int DrawOrgy; int DrawRangx; int DrawRangy; int DrawRop; COLORREF BackColor;
COLORREF FontColor;
}DC,*PDC
系統(tǒng)中設置和設備上下文主要的API 如表所示
CreateDC(): 創(chuàng)建新的設備上下文
DispatchDC(PDC):釋放設備上下文
GetDrawDes (PDC,POINT*): 獲取設備上下繪圖坐標原點
GetDrawRange(PDC,POINT*):獲取上下文繪圖坐標范圍
GetBackColor(PDC,int* ):獲取上下文繪圖背景色
3.3 消息驅動機制的設計實現(xiàn)系統(tǒng)的基本通信機制是事件驅動消息機制。系統(tǒng)線程與系統(tǒng)中所有的窗口擁有自己的消息隊列。系統(tǒng)線程,該隊列中存放所有從底層輸入設備接收到的各類控制消息,等待系統(tǒng)線程分配到應用程序窗口;系統(tǒng)中所有的窗口私有消息隊列用來存放發(fā)送到該窗口的所有消息,等待窗口進一步處理。在系統(tǒng)中消息分為四類:系統(tǒng)消息、外部時間消息、窗口菜單消息、窗口控件消息。在消息驅動的應用程序中,外設發(fā)生的事件(例如鍵的敲擊)都由支持系統(tǒng)收集,將其以事先約定格式翻譯為特定的消息。應用程序一般包含有自己的消息隊列,系統(tǒng)將消息發(fā)送到應用程序的消息隊列中。應用程序可以建立一個循環(huán),在這個循環(huán)中讀取消息并處理消息,直到特定的消息傳來為止。當窗口沒有消息可處理時,消息循環(huán)處理阻塞狀態(tài),這時不消耗CPU 資源。在GUI 中應用程序處理消息隊列中的消息分為GetMessage()從消息隊列中獲取消息。GetMe
ssage()函數(shù)有2個參數(shù),一個用來存放接收到的消息數(shù)據(jù),另一個是應用程序主窗口句柄。當獲得一個消息時,會將該消息的目標窗口確認為應用程序主窗口。如果收到的消息不是MSG_QUIT
3.4 窗口的設計實現(xiàn)窗口管理模塊支持多窗口的同時顯示,可進行窗口的創(chuàng)建、移動、大小調整等操作。窗口設計中包括主窗口、窗口菜單、窗口控件、窗口主過程和窗口相關的API函數(shù)。在設計中對每個窗口都采用自身的主過程來完成自身消息的處理工作3.5 控件層(Controls) 控件層是窗口的子窗口。這些子窗口的行為與主窗口一樣,既能夠接收鍵盤和鼠標等外部輸入,也可以在自己的區(qū)域內進行輸出,只是其所有活動被限制在主窗口中??丶釉O計實現(xiàn)了基本控件,包括按鈕、靜態(tài)文本框、單選(多選)框、繪圖框等多種通用控件。控件層充分挖掘了基本窗口系統(tǒng)的潛力。向用戶提供最常用的功能,極大地簡化用戶開發(fā)的過程。
4 結束語
本文介紹了嵌入式圖形用戶界面系統(tǒng)的基本架構和實現(xiàn)原理,提出了嵌入式環(huán)境下自主、輕型、占用資源少可配置的GUI 系統(tǒng)的解決方案。輕量級 GUI 系統(tǒng)已在Linux 系統(tǒng)上測試通過。本文所開發(fā)所采用的體系結構以及面向對技術對窗口用戶控件的開發(fā)極大的提高了開發(fā)效率和代碼的重用率,對開發(fā)自主的GUI 系統(tǒng)有一定的借鑒和參考價值。本文作者創(chuàng)新點:利用Linu x開發(fā)平臺,研發(fā)適用于小型嵌入式系統(tǒng)的專用GUI系統(tǒng),使用層次結構和面向對象的控件開發(fā)技術,縮短開發(fā)周期,降低開發(fā)成本,為嵌入式GUI系統(tǒng)的開發(fā)提供結開發(fā)方法的參考。