基于Qt/Embedded的GUI移植及應用程序開發
發布時間:2010-8-29 23:06
發布者:conniede
隨著互聯網和移動通信技術的日益成熟,兩者相互滲透和融合的步伐正在加快。21世紀被譽為“移動之王”時代,與此同時,嵌入式linux在手機、PDA(個人數字助理)等手持信息設備領域的應用出現了一個強勁的發展勢頭。手持設備的關鍵在于人機交互技術的體現,所以一個十分友好的圖形用戶界面(GUI)是必不可少的。 1 系統平臺構建 文構建的系統是實現一個掌上信息處理終端系統,集個人數字助理應用、網絡應用、多媒體應用于一身,并成功運行在XSbase255嵌入式開發板上。整個系統包括四部分: (1)引導裝載程序(BootLoader),這是一段駐留在開發板上的代碼,系統上電后首先被執行,對CPU、內存等進行初始化,完成內核映像的裝載和引導; (2)Linux內核,是在官方的2.4.18 linux內核基礎上,加入了相應的硬件驅動和新的文件系統而構成的; (3)圖形用戶界面,采用基于Qt/Embedded的Qtopia桌面環境; (4)應用程序的編寫與添加。本文重點介紹圖形用戶界面的移植和添加應用程序。表1給出了整個系統平臺的結構。 表1 系統平臺構建 2 硬件平臺的選擇 采用XSBase255開發板,這是一款比較理想的PDA、手機等等應用的開發系統。采用高性能(400MHz主頻)和低功耗的Intel PXA255 處理器,64Mb SDRAM以及32MB 的FLASH(閃存)組成。640*480分辨率的LG TFT LCD,和觸摸屏驅動ADS7843。PXA255處理器是Intel公司新近推出的取代Strong ARM的新一代嵌入式應用處理器,它擁有Thumb壓縮指令、64位長乘法指令、擴展型DSP指令等先進特性。PXA255具有眾多的擴展接口與無線接口,可支持PCMCIA、Compact Flash、MMC/SD Card、USB、Bluetooth IF、IrDA等設備。 3 嵌入式GUI的移植 3.1 Qt/Embedded選取 嵌入式Linux系統的有代表性的GUI系統主要有MiniGUI、MicroWindows、Tiny X以及Qt/Embedded。這些GUI系統在接口定義、體系結構、功能特性等方面存在著很大的差別。 Tiny-X,是標準X-windows在嵌入式系統的小巧實現,作為一個圖形環境,X-window是成功的,但由于在體系接口上的原因,限制了它對游戲、多媒體的支持能力。 MicroWindows,其主要特色在于提供了C/S體系結構,同時也提供了相對完善的圖形功能。但卻無任何硬件加速能力,圖形引擎中也存在著許多未經優化的低效算法。 MiniGUI,是建立在比較成熟的圖形引擎之上,其特點是小巧精致。它盡量保持與Win32的兼容,這樣在Win CE應用的場合,也可以使用MiniGUI。 Qt/Embedded,是一個專門為小型設備提供圖形用戶界面的應用框架和窗口系統。提供了豐富的窗口小部件(Widgets),并且還支持窗口部件的定制,因此它可以為用戶提供漂亮的圖形界面。Qt 是 KDE 等項目使用的 GUI 支持庫,所以有許多基于 Qt 的 X Window 程序可以非常方便地移植到 Qt/Embedded 版本上。最終,在分析和比較了各種GUI的特點,我們選用Qt/Embedded作為移植對象。 3.2 Qt/ Embedded底層支持分析 Qt/Embedded 以原始 Qt 為基礎,并做了許多出色的調整以適用于嵌入式環境。Qt/Embedded 通過 Qt API 與 Linux I/O 設施直接交互,成為嵌入式Linux端口。同Qt/X11相比,Qt/Embedded很省內存,因為它不需要一個X服務器或是Xlib庫,它在底層撅棄了X lib,采用framebuffer(幀緩沖)作為底層圖形接口。同時,將外部輸入設備抽象為keyboard和mouse輸入事件。Qt/Embedde的應用程序可以直接寫內核緩沖幀,這避免開發者使用繁瑣的Xlib/Server系統。 表2 Qt/Embedded與Qt/X11的比較 Qt/Embedded的底層圖形引擎基于framebuffer,framebuffer出現在2.2.x以上內核的版本當中的一種驅動程序接口。這種接口采用mmap系統調用,將顯示設備抽象為幀緩沖區。用戶可以將它看成是顯示內存的一個映象,將其映射到進程地址空間之后,就可以直接進行讀寫操作了,而寫操作可以立即反映在屏幕上。framebuffer驅動程序[1]是最重要的驅動程序之一,正是這個驅動程序才能使系統屏幕顯示內容。其實現分為兩個方面:一是對LCD及其相關部件的初始化,包括畫面緩沖區的創建和對DMA通道的設置;二是對畫面緩沖區的讀寫,具體到代碼為read、write等系統調用接口。 3.3 Qt/Embedded和Qtopia的移植 移植過程中我們采取了宿主機和目標板的開發模式。宿主機是一臺運行Linux 的PC 機,目標板即hybus開發板。先在宿主機上調試通過后,再移植到目標板上。 3.3.1 宿主機上的移植 前面介紹過Qt/Embedded直接寫入幀緩沖,在宿主機上則是通過qvfb(vitural framebuffer)來模擬幀緩沖。qvfb是X窗口用來運行和測試Qtopia應用程序的系統程序,允許我們在桌面及其上開發Qt嵌入式程序,而不需要在命令臺和X11之間來回切換。qvfb使用了共享存儲區域(虛擬的幀緩沖)來模擬幀緩沖并且在一個窗口中(qvfb)模擬一個應用來顯示幀緩沖,顯示的區域被周期性的改變和更新。通過指定顯示設備的寬度和顏色深度,虛擬出來的緩沖幀和物理的顯示設備在每個像素上保持一致。這樣我們在每次調試應用時不需要總是刷新嵌入式設備的FLASH存儲空間,從而加速了應用的編譯、連接和運行周期。 因此在最初編譯配置嵌入式Linux內核時必須使其支持幀緩沖。宿主機上的移植需要的工具及環境變量見表3。其中環境變量可以直接用export 來聲明,也可以在~/.bash_profile腳本文件中進行設置。 表3 宿主機移植所需工具及環境變量聲明 特別指出,在配置qt-2.3.7時,./configure -qconfig -qvfb -depths 4,8,16,32 就是指定Qt嵌入式開發包生成虛擬緩沖幀工具qvfb,并支持4,8,16,32位的顯示顏色深度。運行Qt的虛擬緩沖幀工具的方法是:在Linux圖形模式下運行命令:./qvfb &。如果要把Qt嵌入式應用程序的顯示結果輸出到虛擬緩沖幀時,運行時需在程序名后加上-qws選項。如./canvas-qws。 Qtopia即QPE(Qt Palmtop Environment )是由著名的Trolltech公司基于Qt的嵌入式版本Qt/Embedded庫的基礎上,專門針對PDA、SmartPhone這類運行嵌入式Linux的移動計算設備和手持設備所開發的開放源碼的一套應用程序包和開發庫。Qtopia是基于qt/embedded程序庫編寫的應用程序環境,(Qtopia是Qt在Linux/embedded Linux版本里的一個application實現。)界面優美。主要應用于高端手機,pda等嵌入式系統,具有廣闊的發展前景。 3.3.2 目標板上的移植 目標板上的移植與宿主機類似,只需將編譯參數做一定的修改即可。表4列出了qtopia移植中qtembedded共享庫的支持,環境變量聲明和關鍵的編譯配置命令,以及最后目標板上qpe的架構。圖1是在XSbase255開發系統上移植Qt/Embedded和Qtopia的顯示截圖。 表4 Qtopla配置編譯及其架構 圖1 基于XSbase的Qtopia圖形 4 添加應用程序到qtopia 如前所述,我們已經安裝好了Qtopia應用環境。下面介紹如何在Qtopia里添加我們編寫的應用程序(camera)例子,具體Qt程序的編寫不在本文內容之內。 (1) 建立camera程序的圖標文件制作一個32×32大小的PNG格式的圖標文件,將此文件存放在Qtopia/pic/inline目錄下,然后我們要用到qt-x11-free-3.3.3里的一個工具qembed將Qtopia/pics/inline下所有的圖形文件轉換成一個C語言的頭文件,此頭文件包含了該目錄下的圖形文件的rgb信息。 (2) 重新交叉編譯qtopia。 (3)建立.desktop文件,將其保存在qtopia/apps/applications目錄下,具體內容可參考qtopia自帶應用的.desktop文件。 (4)制作文件系統映像我們需要利用原有的文件系統映像,把新建的應用程序的相關文件加入其中。表5為我們下載到Flash中的JFFS2的文件系統結構。根目錄下除opt以外的文件目錄都來自原有文件系統。我們首先需要把新建的應用程序的相關文件(包括啟動器文件,包含了圖標的庫文件libqte.so.*和應用程序的可執行文件)復制到qpe的對應的目錄下。接下來通過JFFS2工具mkfs.jffs2創建生成新的文件系統映像。利用bootloader將生成的文件系統映像下載后寫入flash,從而為內核啟動作好了根文件掛載的準備。 表5 文件系統組織圖 (5)自動運行我們對嵌入式系統上的linux啟動過程進行了研究,若要使qpe能夠自動運行,我們需要改寫其腳本文件,在etc/profile腳本中,做如下添加。重新運行qtopia,就可以看到我們添加的應用的圖標,點擊此圖標就可以運行此應用程序了。圖2是我們編寫的Camera程序在Qtopia下的截圖。 圖2 添加camera程序后的Qtopia |
網友評論