《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計應(yīng)用 > 基于Linux的輕量級嵌入式GUI系統(tǒng)及實現(xiàn)
基于Linux的輕量級嵌入式GUI系統(tǒng)及實現(xiàn)
微計算機(jī)信息
趙英濤 柳翠寅 張春宇
摘要: 基于Linux的輕量級嵌入式GUI系統(tǒng)及實現(xiàn),1,、引言近年來,,隨著信息家電,、手持設(shè)備、無線設(shè)備的迅速發(fā)展,,人們對嵌入式系統(tǒng)的需求逐漸增多,要求也越來越高,。這使為嵌入式系統(tǒng)提供一個友好方便,、穩(wěn)定可靠的G UI系統(tǒng)成為非常緊迫要求[5]。嵌入式技術(shù)是當(dāng)前微電
Abstract:
Key words :

1,、引言

近年來,,隨著信息家電、手持設(shè)備,、無線設(shè)備的迅速發(fā)展,,人們對嵌入式系統(tǒng)的需求逐漸增多,要求也越來越高,。這使為嵌入式系統(tǒng)提供一個友好方便,、穩(wěn)定可靠的G UI系統(tǒng)成為非常緊迫要求[5]。嵌入式技術(shù)是當(dāng)前微電子與計算機(jī)技術(shù)中的一個重要分支[1],, 它是指以應(yīng)用為中心,, 以計算機(jī)技術(shù)為基礎(chǔ),軟件,、硬件可裁剪,,適應(yīng)應(yīng)用系統(tǒng)對功能、可靠性、成本,、體積,、功耗等的嚴(yán)格要求的專用計算機(jī)系統(tǒng)[2]。常用的PC機(jī)上的GU I因嵌入式設(shè)備對資源的嚴(yán)格要求顯得過于龐大,,而不適合嵌入式系統(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ā)展概況

目前國內(nèi)外已經(jīng)推出了很多基于Linux的GUI產(chǎn)品,, 比較成熟的面向嵌入式的GUI 系統(tǒng)有QtEmbedded 、MicroWindows ,、MiniGUI ,、WinCE 等[4]。

1)Microwindows 是一個公開源碼(LGPL)的項目,。它致力于為一些小型的設(shè)備和平臺提供現(xiàn)代圖形窗口環(huán)境的一些特性,,其主要特色是一個基于客戶/服務(wù)器體系結(jié)構(gòu)的GUI 系統(tǒng),采用了面向硬功件的驅(qū)動程序?qū)?、對硬件的接口層,、向高層操作系統(tǒng)的API 層的三層體系結(jié)構(gòu)。并提供了相對完善的圖形功能,, 以及一些其他較高級的功能,,比如Alpha 混合、三維支持,、TrueType 字體支持等,。但是有如下缺點:無任何硬件加速能力,,圖形引擎中存在許多低效算法,且代碼質(zhì)量較差,。

2)MiniGUI是在Linux 控制臺上運行的,,基于SVGALib 和LinuxThread 庫的多窗口圖形用戶界面支持系統(tǒng)。主要特色是基于線程來編寫,,所有的應(yīng)用研究程序都運行在同一個地址空間,,這樣可以提高系統(tǒng)的效率。底層增加了圖形抽象層GAL 和基于輸入設(shè)備的輸入抽象層作為提供底層Linux 控制臺或者XWindow 上的圖形接口以及輸入接口,。但是API沒有封裝,,不便移植,功能限制其不能用于更大的嵌入式系統(tǒng),。

3)Qt/Embedded 是著名的Qt庫開發(fā)商Trolltech 公司開發(fā)的,,是一個專門為嵌入式系統(tǒng)設(shè)計的圖形用戶界面工具包。它的主要特點是可移植到不同平臺上,、擁有自己的窗口系統(tǒng),、擁有自己強(qiáng)大的開發(fā)工具和編程接口,、提供壓縮字體格式,、支持Unicode, 可以輕松地使程序支持多種語言,。但是Qt/Embedded 不是免費的,,使用者必須支持license 費用。

4)OpenGL 采用LGPL 條款發(fā)布,。OpenGUI 比較適合于基于x86 平臺的實時系統(tǒng),,基于匯編實現(xiàn)的內(nèi)核,并利用MMX 指令進(jìn)行了優(yōu)化使其運行速度快,,但可移植性稍差,。

這幾種GUI 的設(shè)計目標(biāo)仍然是通用性,它們大多支持多窗口的隨意切換,、覆蓋,,以及可移動、可動態(tài)改變尺寸的窗口,,諸如此類在多數(shù)嵌入式應(yīng)用中幾乎永遠(yuǎn)用不到的特性,,使得應(yīng)用程序的開發(fā)要考慮很多不必要的細(xì)節(jié)[5]。

以上的嵌入式GUI 系統(tǒng)已很成熟,,但是對于一些需求自主開發(fā)輕型,、功能簡潔、專用性強(qiáng)GUI 系統(tǒng)的用戶來說,,以上的產(chǎn)品并不是一個很好的選擇,。以上的GUI 系統(tǒng)一部分是收費的商業(yè)產(chǎn)品,,另外是通用的GUI功能系統(tǒng),對硬件資源非??粗氐那度胧较到y(tǒng)來說,,多余無用的功能浪費硬件資源絕不是好的選擇。本文針對開發(fā)小型專用的嵌入式GUI 系統(tǒng)進(jìn)行了研究,,實現(xiàn)專用的GUI 系統(tǒng)的開發(fā),。

3 輕量級GUI 的設(shè)計與實現(xiàn)嵌入式GUI 系統(tǒng)采取分層設(shè)計的結(jié)構(gòu),對不同層次進(jìn)行封裝,。在最低層建立了硬件抽象層(HAL,,Hard Abstract Layer),為基于圖形顯示設(shè)備(如VGA 卡)的圖形抽象層(Graphic Abstract Layer,GAL)和基于輸入設(shè)備(如鍵盤,、觸摸屏等)的輸入抽象層(Input Abstract Layer,,IAL) 。圖形抽象層GAL 建立在各種流行的繪圖引擎之上,,屏蔽各種繪圖引擎的具體實現(xiàn),,對上層提供統(tǒng)一的底層繪圖接口。輸入抽象層IAL建立在各硬件設(shè)備驅(qū)動程序之上,,屏蔽各種不同的輸入設(shè)備硬件實現(xiàn),,對上層提供統(tǒng)一的應(yīng)用輸入接口;圖形引擎通過FrameBuffer 來獲得,,而輸入設(shè)備的處理卻沒有統(tǒng)一的接口,。在PC上,通常使用鍵盤和鼠標(biāo),,而在嵌入式系統(tǒng)上,, 可能只有觸摸屏或為數(shù)不多的幾個鍵,在這種情況下,,提供一個抽象輸入層就顯得格外重要,。圖形設(shè)備接口(GDI,Ggraphic Device Interface) 建立在圖形抽象層之上,,主要包括點,、線、面,、文本,、的繪制等功能。圖形用戶接口及相關(guān)API則建立在圖形設(shè)備接口之上,,實現(xiàn)消息隊列,、窗口、控件以及應(yīng)用程序管理等各種功能,。系統(tǒng)的層次結(jié)構(gòu)如圖1所示,。

3.1 嵌入式LIGHT GUI系統(tǒng)層次結(jié)構(gòu)


GAL 層完成系統(tǒng)對具體的顯示硬件設(shè)備的操作,, 極大程度上隱藏各種不同硬件的技術(shù)實現(xiàn)細(xì)節(jié),為應(yīng)用程序開發(fā)人員提供統(tǒng)一的圖形編程接口,。IAL 層則需要實現(xiàn)對于各類不同輸入設(shè)備的控制操作,,提供統(tǒng)一的調(diào)用接口。GAL 層與IAL 層的設(shè)計屏蔽了底層硬件的多樣性,,可以極大程度地提高嵌入式GUI 的可移植性,。另外利用GAL 可大大提高GUI 的可移植性,并且使程序的開發(fā)和擴(kuò)展變得更加容易,。圖形抽象層使用GFX 數(shù)據(jù)結(jié)構(gòu)來表示圖形引擎系統(tǒng),;系統(tǒng)通過輸入設(shè)備層將底層的各種設(shè)備統(tǒng)一映射成上層應(yīng)用程序支持的兩種基本輸入設(shè)備——鼠標(biāo)設(shè)備和鍵盤設(shè)備。對于具體的硬件設(shè)備,,只要根據(jù)驅(qū)動程序提供的接口,,編寫程序?qū)崿F(xiàn)相應(yīng)的抽象接口,就能將各種設(shè)備模擬成為鼠標(biāo)或者鍵盤進(jìn)行輸入,。

系統(tǒng)通過維護(hù)一個已注冊圖形引擎數(shù)組,,保存每個圖形引擎數(shù)據(jù)結(jié)構(gòu)的指針。系統(tǒng)利用一個指針保存當(dāng)前使用的圖形引擎,。每個圖形引擎的數(shù)據(jù)結(jié)構(gòu)定義了該圖形引擎的一些信息,,實現(xiàn)GAL 所定義的各個接口,包括初始化和終止,、畫點處理函數(shù),、畫線處理函數(shù)、矩形框填充函數(shù),、調(diào)色板函數(shù)等。

3.2 圖形設(shè)備接口(GDI) 圖形設(shè)備接口是建立在圖形抽象層上的一個獨立的繪圖應(yīng)用接口,,它將圖形抽象層提供的接口功能進(jìn)一步封裝和擴(kuò)充,,向更高層的應(yīng)用程序提供使用更為簡便,功能完善的繪圖功能,。lightGUI 采用了Windows 類似于Windows 中的GDI 模塊,。它提供設(shè)備上下文(Device Context) 操作、基本GDI 對象操作(包括畫筆,、畫刷,、字體、位圖,、區(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)原點
GetDrawRange(PDC,POINT*):獲取上下文繪圖坐標(biāo)范圍
GetBackColor(PDC,,int* ):獲取上下文繪圖背景色

3.3 消息驅(qū)動機(jī)制的設(shè)計實現(xiàn)系統(tǒng)的基本通信機(jī)制是事件驅(qū)動消息機(jī)制,。系統(tǒng)線程與系統(tǒng)中所有的窗口擁有自己的消息隊列,。系統(tǒng)線程,該隊列中存放所有從底層輸入設(shè)備接收到的各類控制消息,,等待系統(tǒng)線程分配到應(yīng)用程序窗口,;系統(tǒng)中所有的窗口私有消息隊列用來存放發(fā)送到該窗口的所有消息,等待窗口進(jìn)一步處理,。在系統(tǒng)中消息分為四類:系統(tǒng)消息,、外部時間消息、窗口菜單消息,、窗口控件消息,。在消息驅(qū)動的應(yīng)用程序中,外設(shè)發(fā)生的事件(例如鍵的敲擊)都由支持系統(tǒng)收集,,將其以事先約定格式翻譯為特定的消息,。應(yīng)用程序一般包含有自己的消息隊列,系統(tǒng)將消息發(fā)送到應(yīng)用程序的消息隊列中,。應(yīng)用程序可以建立一個循環(huán),,在這個循環(huán)中讀取消息并處理消息,直到特定的消息傳來為止,。當(dāng)窗口沒有消息可處理時,,消息循環(huán)處理阻塞狀態(tài),這時不消耗CPU 資源,。在GUI 中應(yīng)用程序處理消息隊列中的消息分為GetMessage()從消息隊列中獲取消息,。GetMe

ssage()函數(shù)有2個參數(shù),一個用來存放接收到的消息數(shù)據(jù),,另一個是應(yīng)用程序主窗口句柄,。當(dāng)獲得一個消息時,會將該消息的目標(biāo)窗口確認(rèn)為應(yīng)用程序主窗口,。如果收到的消息不是MSG_QUIT

3.4 窗口的設(shè)計實現(xiàn)窗口管理模塊支持多窗口的同時顯示,,可進(jìn)行窗口的創(chuàng)建、移動,、大小調(diào)整等操作,。窗口設(shè)計中包括主窗口、窗口菜單,、窗口控件,、窗口主過程和窗口相關(guān)的API函數(shù)。在設(shè)計中對每個窗口都采用自身的主過程來完成自身消息的處理工作3.5  控件層(Controls) 控件層是窗口的子窗口,。這些子窗口的行為與主窗口一樣,,既能夠接收鍵盤和鼠標(biāo)等外部輸入,也可以在自己的區(qū)域內(nèi)進(jìn)行輸出,,只是其所有活動被限制在主窗口中,??丶釉O(shè)計實現(xiàn)了基本控件,包括按鈕,、靜態(tài)文本框,、單選(多選)框、繪圖框等多種通用控件,??丶映浞滞诰蛄嘶敬翱谙到y(tǒng)的潛力。向用戶提供最常用的功能,,極大地簡化用戶開發(fā)的過程,。

 4 結(jié)束語

本文介紹了嵌入式圖形用戶界面系統(tǒng)的基本架構(gòu)和實現(xiàn)原理,提出了嵌入式環(huán)境下自主,、輕型,、占用資源少可配置的GUI 系統(tǒng)的解決方案。輕量級 GUI 系統(tǒng)已在Linux 系統(tǒng)上測試通過,。本文所開發(fā)所采用的體系結(jié)構(gòu)以及面向?qū)夹g(shù)對窗口用戶控件的開發(fā)極大的提高了開發(fā)效率和代碼的重用率,,對開發(fā)自主的GUI 系統(tǒng)有一定的借鑒和參考價值。本文作者創(chuàng)新點:利用Linu x開發(fā)平臺,,研發(fā)適用于小型嵌入式系統(tǒng)的專用GUI系統(tǒng),,使用層次結(jié)構(gòu)和面向?qū)ο蟮目丶_發(fā)技術(shù),縮短開發(fā)周期,,降低開發(fā)成本,,為嵌入式GUI系統(tǒng)的開發(fā)提供結(jié)開發(fā)方法的參考。

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權(quán)禁止轉(zhuǎn)載,。