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