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