當前位置:才華齋>計算機>作業系統>

嵌入式Linux系統中的GUI系統的研究與移植介紹

作業系統 閱讀(2.6W)

摘要:針對嵌入式Linux系統中幾種常見的GUI(Graphic User Interface)系統,討論嵌入式GUI實現的底層技術方式;詳細分析Microwindows、MiniGUI、Qt/Embedded等三種GUI的實現特點、體系結構、API介面。結合這三種嵌入式GUI在以Motorola i,MX1為核心的實際應用系統中移植開發的問題,討論移植技術與中文化技術。

嵌入式Linux系統中的GUI系統的研究與移植介紹

引言

嵌入式GUI為嵌入式系統提供了一種應用於特殊場合的人們互動介面。嵌入式GUI要求簡單、直觀、可靠、佔用資源小且反應快速,以適應系統硬體資源有限的條件。另外,由於嵌入式系統硬體本身的特殊性,嵌入式GUI應具備高度可移植性與可裁減性,以適應不同的硬體條件和使用需求。總體來講,嵌入式GUI具備以下特點:

*體積小;

*執行時耗用系統資源小;

*上層介面與硬體無關,高度可移植;

*高可靠性;

*在某些應用場合應具備實時性。(收集整理)

1 基於嵌入式Linux的GUI系統底層實現基礎

一個能夠移植到多種硬體平臺上的嵌入式GUI系統,應用至少抽象出兩類裝置:基於圖形顯示裝置(如VGA卡)的圖形抽象層GAL(Graphic Abstract Layer),基於輸入裝置(如鍵盤,觸控層等)的輸入抽象層IAL(Input Abstract Layer)。GAL層完成系統對具體的顯示硬體裝置的操作,極大程度上隱蔽各種不同硬體的技術實現細節,為誚程式開發人員提供統一的圖形程式設計介面。IAL層則需要實現對於各類不同輸入裝置的控制操作,提供統一的呼叫介面。GAL層與IAL層的設計概念,可以極大程式地提高嵌入式GUI的可移植性,如圖1所示。

目前應用於嵌入式Linux系統中比較成熟,功能也比較強大的GUI系統底層支援庫有SVGA lib、LibGGI、Xwindow、framebuffer等。

2 三種嵌入式GUI系統的分析與比較

2.1 Microwindows

Microwindows是一個典型的基於Server/Clinent體系結構的GUI系統,基本分為三層,如圖2所示。

最底層是面向圖形顯示和鍵盤、滑鼠或觸控式螢幕的驅動程式;中間層提供底層硬體的抽象介面,並進行視窗管理;最高層分別提供兼容於X Window和ECMA APIW(Win32子集)的API。其中使用Nano-X介面的API與X介面相容,但是該介面沒有提供視窗管理,如視窗移動和視窗剪下等高階功能,系統中需要首先啟動nano-X的Server程式nanoxserver和視窗管理程式nanowm。使用者程式連線nano-X的Server獲得自身的視窗繪製操作。使用ECMA APIW編寫的應用程式無需nanox-server和nanowm,可直接執行。

Microwindows提供了相對完善的圖形功能和一些高階的特性,如Alpha混合、三維支援和TrueType字型支援等。該系統為了提高執行速度,也改進了基於Socket套接字的X實現模式,採用了基於訊息機制的Server/Client傳輸機制。Microwindows也有一些通用的視窗控制元件,但其圖形引擎存在許多問題,可以歸納如下:

*無任何硬體加速能力;

*圖形引擎中存在許多低效演算法,如在圓弧圖函式的逐點判斷剪下的問題。

由於該專案缺乏一個強有力的核心程式碼維護人員,2003年Microwindows推出版本0.90後,該專案的發展開始陷於停滯狀態。

2.2 MiniGUI

MiniGUI是由國內自由軟體開發人員設計開發的,目標是為基於Linux的實時嵌入式系統提供一個輕量級的圖形使用者介面支援系統。MiniGUI的體系架構如圖3所示。

MiniGUI分為最底層的GAL層和IAL層,向上為基於標準POSIX介面中pthrea

d庫的Mini-thread架構和基於Server/Client的Mini-Lite架構。其中前者受限於thread模式對於整個系統的可靠性影響——程序中某個thread的意外錯誤可能導致整個程序的崩潰,該架構應用於系統功能較為單一的場合。Mini-Lite應用於多程序的應用場合,採用多程序執行方式設計的Server/Client架構能夠較好地解決各個程序之間的視窗管理、Z序剪下等問題。MiniGUI還有一種從Mini-Lite衍生出的standalone執行模式。與Lite架構不同的是,standalone模式一次只能以視窗最大化的方式顯示一個視窗。這在顯示屏尺寸較小的應用場合具有一定的應用意義。

MiniGUI的GAL層技術SVGA lib、LibGGI、基於framebuffer的native圖形引擎以及啞圖形引擎等,對於Trolltech公司的QVFB在X Window下也有較好的支援。IAL層則支援Linux標準控制檯下的GPM滑鼠服務、觸控式螢幕、標準鍵盤等。

MiniGUI下豐富的控制元件資源也是MiniGUI的特點之一。當前MiniGUI的最新版本是1.3.3。該版本的控制元件中已經添加了視窗面板、工具條等桌面GUI中的高階控制元件支援。

2.3 QT/Embedded

Qt/Embedded是著名的Qt庫開發商Trolltech公司開發的面向嵌入式系統的Qt版本。因為Qt是KDE等專案使用的GUI支援庫,許多基於Qt的X Window程式因此可以非常方便地移植到Qt/Embedded上。Qt/Embedded同樣是Server/Client結構。

Qt/Embedded延續了Qt在X上的強大功能,在底層摒棄了X lib,僅採用framebuffer作為底層圖形介面。同時,將外部輸入裝置抽象為keyboard和mouse輸入事件,底層介面支援鍵盤、GPM滑鼠、觸控式螢幕以及使用者自定義的裝置等。

Qt/Embedded類庫完全採用C++封裝。豐富的控制元件資源和較好的可移植性是Qt/Embedded最為優秀的一方面。它的類庫介面完全兼容於同版本的Qt-X11,使用X下的開發工具可以直接開發基於Qt/Embedded的應用程式QUI介面。

與前兩種GUI系統不同的是,Qt/Embedded的底層圖形引擎只能採用framebuffer。這就註定了它是針對高階嵌入式圖形領域的應用而設計的。由於該庫的程式碼追求面面俱到,以增加它對多種硬體裝置的支援,造成了其底層程式碼比較凌亂,各種補丁較多的問題。Qt/Embedded的結構也過於複雜臃腫,很難進行底層的擴充、定製和移植,尤其是用來實現signal/slot機制的moc檔案。

Qt/Embedded當前的最新版本為3.3.2,能夠支援Trolltech的手持應用套件Qtopia的Qt/Embedded最高版本為2.3.8。Trolltech公司將於2004年末推出的Qt/Embedded 3為基礎的Qtopia 2應用套件。

3 三種嵌入式GUI的移植與中文化

在進行以上三種嵌入式GUI的研究和移植過程中,硬體平臺採用自行設計的以Motorola MC9328 MX1為核心的開發系統。該系統採用CPU內部LCD控制器和320×240解析度的16bpp TFT LCD作為顯示裝置,使用I2C匯流排擴展出16按鍵的鍵盤,同時配置了9位A/D量化精度的電阻觸控式螢幕作為滑鼠類輸入裝置;同時移植了ARM Linux作為作業系統。以下分別討論這三種嵌入式GUI的底層移植和中文化技術。

移植以上三種嵌入式GUI系統,需要首先實現Linux核心中的framebuffer驅動。對應於開發系統為MC9328中的LCD控制器,該部分驅動程式必須以靜態方式編譯進核心,在系統啟動時由傳遞進核心的啟動引數啟用該裝置。I2C鍵盤的驅動程式和觸控式螢幕的驅動程式實現後,作為Linux核心模組在使用時動態載入。

3.1 Microwindows的移植

Microwindows驅動層相應的原始碼目錄為src/drivers/。其中以scr*開頭的原始碼是針對顯示裝置的驅動介面,以mou*開頭的原始碼檔案為滑鼠裝置(包括觸控式螢幕)的驅動介面,以kbd*開頭的原始碼檔案針對鍵盤裝置的驅動介面。移植過程中需要實現自己的裝置驅動介面提供給Microwindows使用,就必須按照指定的介面格式編寫相應的scr、mou、kbd的底層支援。這種方式實現簡單,條理也很清晰。

顯示裝置驅動介面:Microwindows的圖形發生引擎支援framebuffer,修改src/中的config檔案指定使用framebuffer作為底層圖形支援引擎;但需要注意嵌入式Linux的framebuffer較少支援控制檯字元模式,需要修改Microwindows中對framebuffer的操作部分以關閉顯示模式的轉換。

在應用程式開發移植中需要注意的是:使用ECMAAPIW介面設計的程式無需nano-X的Server程式和nanowm。系統中可以直接啟動使用該介面編寫的使用者程式;但需要注意的是,一個系統中如同時存在使用兩種不同的API介面編寫的程序,會造成nano-X的Server與ECMA APIW的程序對系統硬體資源的使用競爭,雙方的程式將無法正常顯示或響應應使用者輸入。

在為Microwindows增加中文顯示的支援時,主要工作包括兩個部分。一部分是系統字型的中文支援。此處使用等寬光柵字型,主要負責視窗標題和內建控制元件的中文繪製,將字型編譯進Microwindows核心中,光柵資訊作為一維陣列,顯示時按照字元偏移量從該陣列中調出相應的光柵資訊顯示即可。除此之外,當程式呼叫CreateFont時,需要在內部實現為開啟檔案系統中的字型檔案。通過修改src/engine/devfont.c中的GdCreateFont部分,新增相應的hzk(漢字型檔)支援,便可以實現在CreateFont時創建出一個支援GB2312字符集的邏輯字型,並使用外部字型進行顯示。在應用程式設計時,如果沒有呼叫SelectObjectu將外部字型選入,中文顯示時將預設使用系統字型。

3.2 MiniGUI

由於MiniGUI較好地將硬體裝置抽象為GAL層和IAL層,移植時只需要針對自身的硬體特點按照GAL層呼叫介面和IAL層呼叫介面來做內部實現即可。圖4為MiniGUI的GAL層結構示意,IAL層結構類似。

實現了framebuffer的Linux驅動後,配置MiniGUI選擇Native的GAL引擎,便可以使用framebuffer作為MiniGUI的圖形發生引擎。

MiniGUI的IAL層將輸入裝置的輸入事件最終對映為GUI系統API層的訊息事件。IAL層預設處理兩種裝置的輸入操作:鍵盤裝置和滑鼠裝置。鍵盤裝置向上層提供不同的按鍵輸入資訊,滑鼠裝置提供點選、抬起和落筆座標等的資訊。在實現MiniGUI與輸入裝置驅動的介面時,採用Select的方式獲得輸入裝置的動作,並轉換為訊息佇列中的訊息。訊息引數按照Win32介面定義為點選鍵編號或滑鼠當前的座標(其中觸控式螢幕事件與滑鼠事件類似)。通過編寫針對硬體開發系統的IAL支援程式碼,實現了IAL層的移植。

MiniGUI中多字型和字符集支援是通過裝置上下文(DC)的邏輯字型(LOGFONT)實現的,建立邏輯字型時指定相應的字符集,其內部實現為對於所需顯示字元的.所屬字符集的識別處理,最終呼叫相應字符集的處理函式族。應用程式在啟動時,可切換系統字符集,如GB2312、BIG5、EUCKR、UJIS。MiniGUI的這種字符集支援方式不同於採用UNICODE的解決方案。在節省系統資源的意義上講,這種實現更加適合於嵌入式系統應用,是MiniGUI的一大創新點。MiniGUI同時支援包括ttf、bdf、type 1、vbf等多種字型格式,可以根據需要配置MiniGUI來支援相應字型的顯示。

3.3 Qt/Embedded的移植

Qt/Embedded的底層圖形引擎完全依賴於framebuffer,因此在移植時需考慮目標平臺的Linux核心版本和framebuffer驅動程式的實現情況,包括解析度和顏色深度等在內的資訊。當前嵌入式CPU大多內部整合LCD控制器,並支援多種配置方式。除少數CPU低色彩配置時的endian問題外,Qt/Embedded能夠較好地根據系統已有的framebuffer驅動介面構建上層的圖形引擎。

Qt/Embedded圖形發生引擎中的圖形繪製操作函式都是由源泉碼目錄src/kernel/中的src/kernel/qgfxreaster_中所定義的QgfxRasterBase類發起宣告的。對於裝置更加底層的抽象描述,則在src/kernel目錄中的qgfx_中的Qscreen類中給予相應定義。這些是對framebuffer裝置直接操作的基礎,包括點、線、區域填充、alpha混合、螢幕繪製等函式均在其中定義實現。在framebuffer驅動程式除錯通過後,配置Qt/Embedded的編譯選項,可以保證Qt/Embedded的圖形引擎正常工作。

Qt/Embedded中的輸入裝置,同樣分為滑鼠類與鍵盤類。其中滑鼠裝置在源泉碼目錄中的src/kernel/qwsmouse_中實現,從該類又重新派生出一些特殊滑鼠類裝置的實現類,其派生結構如圖5所示。

根據具體的硬體驅動程式實現的介面,可以實現類似的介面函式。

Qt/Embedded中對於鍵盤響應的實際函式位於src/kernel/qkeyboard_中,在qkeyboard_qws.h中,定義了鍵盤類裝置介面的基類QWSKeyboardHandler。具體的鍵盤硬體介面依然要建立在鍵盤驅動程式基礎上,移植時需要根據鍵盤驅動程式從該類派生出實現類,實現鍵盤事件處理函式processKeyEvent()即可。

Qt/Embedded內部對於字符集的處理採用了UNICODE編碼標準。Qt/Embedded內部對於字符集的處理採用了UNICODE編碼標準。Qt/Embedded同時支援兩種對於其它編碼標準(如GB2312和GBK)的支援方式:靜態編譯和動態

外掛裝載。通過配置config.h檔案新增相應的編碼支援巨集定義,可以獲得其它編碼標準向UNICODE的轉換支援,從而在Qfont類中得以轉換與顯示。由於UNICODE涵蓋了中文部分,Qt/Embedded對中文支援也非常好。

Qt/Embedded能夠支援TTF、PFA/PFB、BDF 和QPF字型格式。由於自身採用UNICODE編碼方式對字元進行處理,在一定程式上導致了能夠使用的字型檔案體積的增大。為了解決這一問題,Qt/Embedded採用了QPF格式,使用makeqpf等工具可以將TTF等格式的字型轉換至QPF格式。圖6為筆者在自行設計的MC9328系統上移植Qt/Embedded和Qtopia套件後,增加中文支援後的顯示截圖。Qt/Embedded版本為2.3.7,Qtopia版本為1.7.0。

4 結論

綜上所述,一個具備良好移植性的嵌入式GUI系統,其底層介面應該在很大程度上隱藏具體硬體的實現細節,抽象出GAL與IAL層。對於字符集的支援,也可以從MiniGUI的字符集支援方式和Qt/Embedded的UNICODE支援方式上獲得啟發。