基于Framebuffer的嵌入式GUI系統(tǒng)實現(xiàn)
摘要:本文研究了基于Framebuffer的嵌入式GUI的系統(tǒng)實現(xiàn),包括其體系結(jié)構(gòu)層次的建立、驅(qū)動機制的分析、微型客戶端/服務器模式的實現(xiàn),以及基于Framebuffer的GAL與GDI的設計等關(guān)鍵內(nèi)容。
關(guān)鍵詞:嵌入式;GUI;Linux;Framebuffer
0 前言
當前流行的商業(yè)化的GUI 系統(tǒng)包括Palm OS、Windows CE和Symbian OS 等。這些GUI 性能出眾,一般都提供完整的解決方案,對Java、多媒體的支持較好,使用它們可以很方便地構(gòu)建自己的嵌入式系統(tǒng),縮短開發(fā)周期。但這些都是商業(yè)化產(chǎn)品,使用它們不可避免地要付出昂貴的授權(quán)費用,沒有公開源代碼,用戶也不能很自由地定制自己的產(chǎn)品。
Linux 的出現(xiàn)給嵌入式產(chǎn)品的開發(fā)帶來了新的活力,它擁有很多的優(yōu)良特性非常適合于嵌入式開發(fā)。目前國內(nèi)外基于Linux的GUI產(chǎn)品比較流行的包括MiniGUI、MicroWindows、QT/Embedded 等,其中QT/Embedded 屬于商業(yè)化的產(chǎn)品,其他屬于開源軟件。從性能、功能各個方面來說QT/Embedded 比較優(yōu)秀,但是使用它需要支付高昂的授權(quán)費用,一般應用在高端的PDA 和SmartPhone 等產(chǎn)品上。MiniGUI和MicroWindows均為自由軟件,只是前者遵循LGPL條款,后者遵循MPL條款,這兩個系統(tǒng)的技術(shù)路線也有所不同,MiniGUI的策略是首先建立在比較成熟的圖形引擎之上,比如Svgalib和LibGGI,開發(fā)的重點在于窗口系統(tǒng)、圖形接口之上,而MicroWindows目前的開發(fā)重點則在底層的圖形引擎之上,窗口系統(tǒng)和圖形接口方面的功能還比較欠缺,而且MiniGUI在1.6版本以后也不再提供免費的完整功能版本下載。
FrameBuffer是Linux控制臺下的一個通用的圖形接口,它擁有良好的平臺無關(guān)性,可以支持絕大多數(shù)的硬件,因而得到愈來愈多廠家的支持,一些流行的圖形庫如QT、GTK便是基于FrameBuffer的。它的接口非常簡單,通過它可以十分方便地構(gòu)建一個圖形系統(tǒng)。而對GUI的實現(xiàn)做一個系統(tǒng)深入的分析和研究也是嵌入式系統(tǒng)研究必不可少的一個步驟。本項目在開發(fā)嵌入式數(shù)字控制系統(tǒng)的過程中對現(xiàn)有的嵌入式GUI系統(tǒng)做了深入的研究,包括嵌入式GUI的體系結(jié)構(gòu)層次、驅(qū)動機制,并實現(xiàn)了對自身量身定做的GAL和GDL,實現(xiàn)了滿足自身需求的嵌入式GUI系統(tǒng)。
1嵌入式GUI需求分析
與運行在PC 機上的GUI相比,作為運行在嵌入式設備上的程序,不可避免的要受到設備環(huán)境的限制,其實這也是所有嵌入式編程都要遇到的問題。嵌入式設備對GUI 的限制主要體現(xiàn)在:(1) CPU速度相對來說較慢,一般不具備浮點運算功能或浮點運算功能較弱;(2)內(nèi)存、外存容量?。?3)電量有限需要考慮節(jié)電因素。
同時,嵌入式平臺具有多樣性,不同的平臺之間性能、功能部件千差萬別,很難設計出一個GUI產(chǎn)品能夠適合任何平臺,因此就必需對GUI產(chǎn)品進行準確的定位,包括所要運行的平臺、最終用戶的需求等等,它是產(chǎn)品成功的關(guān)鍵,也決定了我們的設計方針和思想,比如實時和非實時產(chǎn)品的設計是完全不同的。這里我們設計的GUI 系統(tǒng)是為中低端嵌入式系統(tǒng)提供圖形界面能力的中間件產(chǎn)品,它應該能滿足以Linux OS 作為產(chǎn)品系統(tǒng)平臺的中低端客戶對圖形用戶界面開發(fā)的要求,并易于第三方應用程序的移植。具體來說,其運行在CPU 主頻不高于400MHz(實際使用200MHz),內(nèi)存容量在64MB(實際使用16M)以下的中低端嵌入式系統(tǒng),兼容POSIX標準的操作系統(tǒng),擁有完整或經(jīng)過裁減的C庫。
在設計的時候要充分考慮到這些因素,在編程時也要注意一些原則:盡量讓CPU少做事,盡量不進行浮點運算,盡量減少文件操作,盡量減少內(nèi)存分配。
2 基于Linux的嵌入式GUI構(gòu)建
2.1 嵌入式GUI的體系結(jié)構(gòu)層次
嵌入式GUI的實現(xiàn)一般要劃分成四大功能模塊:GUI用戶接口模塊、GUI對象模塊、GUI基本圖形模塊和GUI消息驅(qū)動模塊。具體功能定義如下:
1)GUI用戶接口模塊 該模塊為上層應用軟件開發(fā)人員提供方便、易用的API接口函數(shù),對上層開發(fā)人員屏蔽了GUI的設備實現(xiàn)細節(jié),讓開發(fā)人員很簡單的就可以編寫出良好的圖形用戶界面的應用程序。
2)GUI對象模塊 GUI對象模塊對窗口環(huán)境中的邏輯對象進行組織管理。其中包括對象的添加、刪除引發(fā)的對象鏈表的更新,以及GUI窗口顯示的維護,如窗口切換、焦點切換、對象的隱藏和恢復等操作引發(fā)的對象屬性的更新,還有對不同控件的各種事件的響應。
3)GUI基本圖形模塊 在該模塊中實現(xiàn)了對顯示輸出設備的操作,如畫點、畫線、畫矩形等基本功能,還有對于字符的解析輸出,以及對圖形的解析輸出。一般它獨立于具體的設備驅(qū)動程序,與物理設備之間形成“設備抽象層”。
4)GUI消息驅(qū)動模塊 該模塊是GUI系統(tǒng)的通訊模塊,負責GUI的消息接收和與其它任務的通訊以及消息隊列的維護。
我們在自我裁減的Linux操作系統(tǒng)基礎(chǔ)上具體實現(xiàn)了一個輕量級的嵌入式GUI系統(tǒng),在C語言中,采用了類似于面向?qū)ο蟮募夹g(shù),同時將GUI系統(tǒng)的核心模塊設計的盡量小巧,便于測試。GUI系統(tǒng)內(nèi)核對GUI特性和使用環(huán)境進行了高度抽象,為了增加GUI系統(tǒng)的可移植性和可擴展性,本系統(tǒng)將與特定設備相關(guān)的功能全部分裝到了獨立的函數(shù)之中,如果要移植到其它不同的設備上去,只需要把這些與特點設備相關(guān)的函數(shù)部分重寫即可達到目的。本GUI系統(tǒng)采用的垂直分層的系統(tǒng)結(jié)構(gòu)圖如下:
圖1、嵌入式GUI系統(tǒng)結(jié)構(gòu)圖
用戶和嵌入式系統(tǒng)交互的過程即是用戶通過輸入設備操作GUI的應用程序,GUI系統(tǒng)在接到用戶對該輸入事件的處理消息之后,將處理后的結(jié)果顯示在輸出設備上。因此GUI系統(tǒng)涉及的主要技術(shù)有事件驅(qū)動、輸出顯示、資源管理。其中事件驅(qū)動是GUI系統(tǒng)的核心,輸出顯示是GUI的關(guān)鍵,資源管理是GUI系統(tǒng)的基礎(chǔ)。
2.2 嵌入式GUI的驅(qū)動機制分析
GUI系統(tǒng)的事件驅(qū)動機制主要是消息驅(qū)動機制。從消息機制方面來說,本GUI系統(tǒng)可以劃分為三個子系統(tǒng):圖形處理子系統(tǒng),輸入設備子系統(tǒng)和輸出設備子系統(tǒng),各子系統(tǒng)以圖形處理子系統(tǒng)為核心,既相對獨立又彼此聯(lián)系。
所謂消息有兩層含義:1、消息發(fā)生的時間(事件,動態(tài)概念):2、消息內(nèi)容(信息,靜態(tài)概念)。消息發(fā)生觸發(fā)一個事件,用以主動通知信息的到來。系統(tǒng)中消息發(fā)生時間是隨機的,由操作系統(tǒng)異步捕獲此事件,再分發(fā)給對應的處理程序。程序起著信息處理的作用,而消息則代表到達的信息。對于可以事先判定信息的種類范圍,而不能事先預測信息到達時間的情況,有兩種處理方法:被動輪詢和主動通知。消息屬于主動通知一類。利用消息驅(qū)動計算機輸入的機制,顯得自然、簡潔。
消息處理機制包括消息的產(chǎn)生、傳遞(發(fā)送和接收)和處理等過程。消息作為一種任務、程序、系統(tǒng)等應用之間的信息和數(shù)據(jù)聯(lián)系,它可以由硬件事件產(chǎn)生,也可以由其它任務、程序、系統(tǒng)等應用中產(chǎn)生,并將它們發(fā)到其它應用中,以控制應用的行為。
本GUI系統(tǒng)的消息處理機制如圖2所示。
圖2、系統(tǒng)的消息處理機制圖
采用這種消息機制后,模塊之間形成完全松散的耦合關(guān)系,增加了整個連接和集成的靈活性,這是通過消息和響應的非直接、隱式調(diào)用實現(xiàn)的。
選用這種消息機制作為嵌入式GUI系統(tǒng)的設計,正好適合了嵌入式系統(tǒng)本身要求可以配置、裁剪的特點。嵌入式GUI本身只需要維持一個消息處理機即可,可以大大增加系統(tǒng)的可移植性。采用這種消息機制,只需要重新定義消息和響應處理,GUI系統(tǒng)中的任何控件都可以簡單地替換為另一個控件,這一特點可以滿足GUI系統(tǒng)本身要求的可擴展性,用戶可以根據(jù)自己的要求對控件進行修改、定制和擴展GUI系統(tǒng)的界面風格。
對于激勵和響應之間沒有嚴格的時間邏輯關(guān)系的系統(tǒng),消息是一種非常好的控制機制。消息機制完全可以滿足嵌入式GUI的調(diào)度要求。
2.3 微型客戶端/服務器模式的實現(xiàn)
從系統(tǒng)整體角度看,根據(jù)是否采用多進程C/S 機制和服務程序的具體功能,基本可以將Linux 下的嵌入式GUI 劃分為類X GUI 和非X GUI 兩大類。
圖3、類X GUI的系統(tǒng)C/S交互機制示意圖
是否采用C/S客戶服務機制,決定于用戶的設計需求和實時性考慮。當實時能力能夠得到滿足時,類X的GUI在系統(tǒng)健壯性和功能完備性上要大大超過非X的GUI。非X GUI往往采用單進程多線程,所有數(shù)據(jù)和操作共享同一內(nèi)存區(qū)域,當某個線程出現(xiàn)錯誤時容易造成整個進程癱瘓,因此用于復雜場合的成熟的GUI大多數(shù)都采用類X GUI多進程多客戶單服務的機制。由于類X的嵌入式GUI具有應用普遍性,我們采用了類X GUI客戶服務結(jié)構(gòu)模式。
X GUI的原理是借鑒X Window的客戶服務機制,采用了事件驅(qū)動的設計方法。應用程序在客戶端,輸入接口在服務器端,應用程序通過和服務器通訊間接和輸入輸出硬件設備交互。如圖3是系統(tǒng)的類X GUI的系統(tǒng)C/S交互機制示意圖
客戶程序向服務器程序提交感興趣的事件或要阻止的事件請求,服務器主程序啟動循環(huán)收集事件(包括輸入設備上的事件),由輸入引擎接口上的系統(tǒng)調(diào)用來接收輸入設備事件。將客戶感興趣的事件發(fā)送給客戶程序,客戶程序處理后再向服務器程序提交圖形繪制和其它操作請求。兩者之間通過IPC或socket連接的辦法來傳送事件和請求。
3 基于Framebuffer的GAL與GDI的設計
FrameBuffer是出現(xiàn)在2.2.xx內(nèi)核當中的一種驅(qū)動程序接口。這種接口將顯示設備抽象為幀緩沖區(qū)。用戶可以將它看成是顯示內(nèi)存的一個映像,將其映射到進程地址空間之后,就可以直接進行讀寫操作,而寫操作可以立即反應在屏幕上。該驅(qū)動程序的設備文件一般是/dev/fb0,/dev/fbl等等。在應用程序中,一般通過將FrameBuffer設備映射到進程地址空間的方式使用。FrameBuffer設備還提供了若干ioctl命令,通過這些命令,可以獲得顯示設備的一些固定信息(比如顯示內(nèi)存大小)、與顯示模式相關(guān)的可變信息(比如分辨率、象素結(jié)構(gòu)、每掃描線的字節(jié)寬度),以及偽彩色模式下的調(diào)色板信息等等。通過FrameBuffer設備,還可以獲得當前內(nèi)核所支持的加速顯示卡的類型(通過固定信息得到),這種類型通常是和特定顯示芯片相關(guān)的
研究中我們發(fā)現(xiàn),雖然己有的幾種嵌入式GUI庫在窗口管理、消息機制等應用層的實現(xiàn)各不相同;但為了便于移植的特性,都有相似的設備驅(qū)動層設計。
一個能夠移植到多種硬件平臺上的嵌入式GUI庫,應用至少抽象出兩類設備:基于圖形顯示設備(如VGA卡)的圖形抽象層GAL ( Graphic Abstract Layer );基于輸入設備(如鍵盤,觸摸層等)的輸入抽象層IAL ( Input Abstract Layer )。GAL層完成系統(tǒng)對具體的顯示硬件設備的操作,極大程度上隱蔽各種不同硬件的技術(shù)實現(xiàn)細節(jié),為程序開發(fā)人員提供統(tǒng)一的圖形編程接口。先進的嵌入式GUI,比如MicroWindows和MiniGUI,都支持Framebuffer。
因為MicroWindows的GAL層代碼量小,結(jié)構(gòu)清晰而且模塊性好,非常方便修改和擴充。因此我們借鑒MicroWindows的設備抽象層構(gòu)建,實現(xiàn)需要在文件中包含src/include/device.h和src/include/mwtypes.h頭文件。前者包含對MicroWindows底層調(diào)用函數(shù)接口的聲明,后者包含MicroWindows中特定結(jié)構(gòu)的定義和一些宏定義。
GDI對象對于GUI系統(tǒng)來說是一個很重要的概念,它可以提供給用戶更加靈活的操作方式,所以本GUI系統(tǒng)實現(xiàn)了類似于Windows下的GDI系統(tǒng),不像有些GUI系統(tǒng),放棄了GDI對象概念,窗口層直接跟繪圖層交互,導致用戶操作起來不靈活,這樣設計也容易在遵循嵌入式軟件平臺API標準的前提下與Windows的圖形用戶接口相兼容。系統(tǒng)GDI提供了設備上下文(Device Context)操作、基本GDI對象操作〔包括畫筆、畫刷、字體、位圖、區(qū)域、填充等),還有映射模式、背景模式和光柵操作。盡管系統(tǒng)GDI吸取了Windows GDI的一些概念和設計方法,但其作為嵌入式GUI系統(tǒng)的一部分,特別針對嵌入式環(huán)境的特點,取消了一些不常用的、影響效率的功能,充分挖掘GDI層的性能。由于硬件抽象層提供的圖形操作接口只有一個Surface,所以所有的基本圖形繪制及操作都需要GDI實現(xiàn),所以提高GDI性能的重點是好的圖形學算法。本系統(tǒng)GDI對原有的組成元素做了一些取舍,其組成元素如表1所示:
表1、系統(tǒng)GDI組成元素表
設備上下文 |
GDI對象 |
繪圖屬性 |
位圖操作 |
字體 |
DC |
畫筆、畫刷 |
光柵、背景模式、坐標模式 |
DIB、DDB |
點陣、True Type |
4 結(jié)束語
本文研究了基于Framebuffer的嵌入式GUI的系統(tǒng)實現(xiàn),包括其體系結(jié)構(gòu)層次的建立、驅(qū)動機制的分析、微型客戶端/服務器模式的實現(xiàn),以及基于Framebuffer的GAL與GDI的設計等關(guān)鍵內(nèi)容,提供了除現(xiàn)行流行方案外的嵌入式GUI的解決方案,并可根據(jù)自己系統(tǒng)需求量身定做,在實際項目實施中獲得了很好的效果。
作者簡介:趙霞 (1968-)女(漢族),河北人,高級講師,碩士,新僑職業(yè)技術(shù)學院計算機信息系.主要研究領(lǐng)域:計算機應用與軟件研究.
Biography:Zhao Xia(1968-), Female(Han), Senior instructor, Master, Department of computer, Xinqiao Professional Technological Institute. Research area: Research on computer application and software development.
參考文獻:
[1]王田苗.嵌入式系統(tǒng)設計與實例分析.清華大學出版社,2003年10月第二版.
[2]王同洋,熊偉,嵌入式Linux中圖形用戶界面的研究與設計.微計算機信息,2006, (08),90-92
[3]張娟,張雪蘭.基于嵌入式Linux的GUI應用程序的實現(xiàn).計算機應用,2003 (04):116-117