唐 浩,代少升
(重慶郵電大學 信號與信息處理重點實驗室,重慶 400065)
21世紀是后計算機時代,人們每天都會接觸很多的嵌入式產品,手機、PDA等手持式信息設備發展迅速。這些設備的關鍵在于人機交互技術的體現,所以一個十分友好的圖形用戶界面(GUI)是必不可少的。
目前嵌入式Linux的主流GUI系統主要有MiniGUI,MicroWindows,OpenGUI,Qt/Embedded 等[1],這些 GUI 在接口定義、體系結構、功能特性等方面存在很大差別。MiniGUI具有良好的軟件架構,通過抽象層將其上層和底層操作系統隔離開來,開發的重點在于窗口系統,但由于支持力量比較薄弱,其維護和再開發成本不可預計。MicroWindows以較小的資源消耗、通用的幀緩沖(FrameBuffer)技術、靈活的分層設計模式和豐富的API支持等特點獲得廣泛的關注,但其圖形引擎無任何硬件加速能力,算法低效,代碼質量較差。OpenGUI基于用匯編語言實現的X86圖形內核,提供了高層的C/C++圖形/窗口接口,它的資源消耗小,但可移植性差,不支持多進程。
Qt/Embedded[2]是一個多平臺的C++圖形用戶界面應用程序框架,易擴展,可移植性好,支持多個GUI平臺的交互開發。從個人消費電子到工業控制設備,Qt/Embedded被廣泛地應用于各種嵌入式產品和設備中。
Qt/Embedded是著名的Qt庫開發商Trolletch公司(2008年6月被諾基亞公司收購)開發的圖形化界面開發工具Qt的嵌入式版本。Qt/Embedded采用Server/Client結構,延續了Qt在X上的強大功能,在底層摒棄了Xlib,僅采用FrameBuffer作為底層圖形接口。同時將外部輸入設備抽象為keyboard和mouse輸入事件,底層接口支持鍵盤、鼠標、觸摸屏以及用戶自定義的設備等[3]。
Qt/Embedded的類庫完全采用C++封裝,控件資源豐富,可移植性較好,開放的源碼使得開發人員可以在GPL許可協議下自由地進行嵌入式GUI應用程序的移植與開發。Qt/Embedded移植與開發總體流程如圖1所示。

筆者采用廣州友善之臂公司設計的Micro2440開發板作為硬件平臺,該開發板由核心板與底板組成。核心板上集成了三星公司400MHz的微處理器S3C2440,64Mbyte的SDRAM,64Mbyte NAND Flash以及2Mbyte NOR Flash。底板上則集成了一些常規外設接口。在軟件方面,使用Linux-2.6.13穩定內核的操作系統,根文件系統為缺省安裝的文件系統,采用基于arm-linuxgcc-3.4.1的函數庫。
整個系統軟件由引導裝載程序(U-Boot)、設備驅動(包括幀緩沖)、嵌入式 Linux內核、文件系統(YAFFS)以及基于 Qt/Embedded的應用程序組成[4]。系統平臺結構如圖2所示。

搭建編譯平臺是嵌入式GUI的必要工作。Qt/Embedded的軟件開發環境主要包括嵌入式Linux操作系統、軟件開發工具鏈以及相關源碼包。本文的開發環境是在個人PC上安裝VMware Workstation 6.5.1和Red Hat Linux 9.0操作系統,內核版本是2.6.13,與目標板上運行的版本一致。采用的交叉編譯器為armlinux-gcc-3.4.1,源碼包為qt-embedded-linux-opensource-src-4.5.3和 qt-x11-opensource-src-4.5.3。
在PC機上編譯好的qt-x11可以生成Qt開發工具,如用戶界面編譯器(UIC)與虛擬幀緩沖服務器(QVFB),作為交叉編譯環境的支持。虛擬環境搭建過程如下:
1)在PC平臺文件系統中建立工具包目錄,將源碼包分別用tar命令解壓并放置其中。
2)進入qt-x11目錄,在終端鍵入./configure命令對qt-x11安裝環境進行配置,根據源碼包配置選項和系統情況生成makefile文件,為make做準備。
3)配置完成以后,鍵入make命令,從makefile中讀取指令進行編譯,用來創建庫文件,編譯例程和指南,需要等待一段比較長的時間。
4)編譯完成之后,進入tools目錄下的qvfb目錄,鍵入make對其進行編譯。最后回到qt-x11目錄,鍵入make install進行安裝。
5)make install完成之后,會在/usr/local目錄下生成一個Trolltech目錄,這就是qt-x11-opensource-src-4.5.3安裝后所在目錄。將/usr/local/qt/qt-x11-opensource-src-4.5.3/tools/qvfb目錄下的qvfb相關文件拷貝到/usr/local/Trolltech/Qt-4.5.3/bin目錄下。至此X11環境就搭建好了。
通過qt-x11提供的庫和開發工具,可以進行Qt應用程序的開發,但是若需要在目標板上運行該程序,則還需使用qt-embedded庫對該程序進行交叉編譯,才能得到在ARM平臺上運行的可執行程序。這就需要搭建qt-embedded交叉編譯環境,其實現過程如下:
1)安裝交叉編譯器。工具包目錄中鍵入tar xvzf arm-linux-gcc-3.4.1.tgz-C/,執行該命令將arm-linuxgcc安裝到/usr/local/arm/3.4.1。然后設置路徑變量,修改/etc/profile文件,在最后一行添加export PATH=/usr/local/arm/3.4.1/bin:$PATH。
2)進入qt-embedded目錄,鍵入./configure-embedded arm-xplatform qws/linux-arm-g++-depths 4,8,16,32,配置參數指定 ARM 平臺,并支持 4,8,16,32 位的顯示顏色深度。
3)使用make命令進行編譯,用來生成qt-embedded庫。
4)使用make install進行安裝。完成后,qt-embe-dded被安裝在/usr/local/Trolltech/QtEmbedded-4.5.3目錄下。
Qt/Embedded應用程序在S3C2440平臺上的運行需要有qt-embedded庫支持。在開發板的根目錄下新建如下目錄:
/usr/local/Trolltech/QtEmbedded-4.5.3/bin//安裝運行庫文件
/usr/local/Trolltech/QtEmbedded-4.5.3/lib/fonts//安裝字體庫文件
把PC上對應目錄下交叉編譯后生成的qtembedded庫文件和字體文件,分別拷貝到上述目錄中。注意,運行庫文件一般只拷貝libQtGui.so.4,libts-0.0.so.0,libQtCore.so.4,libQtNetwork.so.4,如果文件是到共享庫的鏈接文件,則把該共享庫也要拷貝上,字體庫則需拷貝一種就可以了。設置開發板環境變量:
export QTDIR=/usr/local/Trolltech/QtEmbbed-4.5.3
export QPEDIR=/usr/local/Trolltech/QtEmbedded-4.5.3
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:/usr/local/lib:$LD_LIBRARY_PATH
Qt是一個創建GUI程序的C++類庫,編寫Qt應用程序的主要工作是基于已有的Qt類去編寫用戶類。筆者以發布一個圖片瀏覽工具(ImgViewer)為例,簡單地介紹Qt/Embedded應用程序的開發過程。
強大的工具支持是進行Qt/Embedded圖形用戶開發的優勢所在。除了前面提到的QVFB和UIC工具外,Qt designer(圖形設計器)工具為GUI窗口組建,提供了一種可視化的設計能力,非常方便高效;qmake工具能為不同平臺的開發項目創建makefile配置文件;編程助手assistant能隨時隨地給編程帶來幫助。
筆者采用Qdevelop4.4.3來編寫Qte程序。Qdevelop是一個跨平臺集成開發環境,完全致力于Qt4的開發。
Qt/Embedded源程序一般應該包含以下文件:1個主程序文件(main.cpp)、多個源程序文件(source.cpp)與對應的頭文件(source.h)以及用來生成makefile的項目文件(.pro)。在本次開發中,并沒有使用Qt designer來進行可視化窗口設計,完全借助Qdevelop純代碼進行編寫,這樣能更好地體會Qt/Embedded GUI設計的精髓所在。基本操作步驟如下:
1)編寫頭文件imgviewer.h。在Qdevelop中新建工程imgviewer.pro,并添加頭文件imgviewer.h。頭文件定義了實例中需要用到的各種窗體控件,包括菜單(QMenu)、工具條(QtoolBar)、動作(Qaction)以及各種操作的槽函數(slots)。
2)編寫源文件imgviewer.cpp。源文件中設置了字體,規定了窗口屬性,并且創建了動作、菜單和工具條等一系列的實現函數。這里會接觸到Qt最重要的特性:信號與槽機制(signal&slot)。信號與槽機制提供了任意兩個Qt對象之間的通信機制,信號會在某個特定情況或動作下被觸發,槽是用于接收并處理信號的函數。其常用格式為 bool QObject::connect(Object1,SIGNAL(signal1),Object2,SLOT(slot)),以及與這個函數對應的disconnect函數,可以將信號和槽斷開連接。下面介紹一段簡單的程序,該程序設置了打開單個文件這一動作:
openFileAction=new QAction(QIcon(":/images/openfile.png"),tr("Open"),this);//創建一個 Open 動作,并調用openfile.png圖標,圖標位于資源庫images文件夾下。
openFileAction->setStatusTip(tr("Open File"));//設置該圖標的狀態提示為"Open File"。
connect(openFile-Action,SIGNAL(triggered()),this,SLOT(slotOpenFile()));//連接信號與槽,觸發 openFileAction這一動作時,將進行slotOpenFile()這一過程的處理。
3)編寫主函數main.cpp。Qt/Embedded應用程序應該包含一個主函數,該函數是應用程序的入口點。結合imgviewer.h和imgviewer.cpp,可以看到所有應用程序開發主函數main.cpp編寫的框架結構:
#include"imgviewer.h"
#include
//QApplication包含了Qt圖形化應用程序的各種資源、基本設置、控制流以及事件處理等。若是Qt的非圖形化應用程序,則需包含

4)生成makefile文件及編譯鏈接生成可執行文件。借助qmake工具可以生成makefile文件,實現過程為:qmake-o Makefile imgviewer.pro。然后在命令行下輸入make命令對整個工程進行編譯,就能生成X86架構的二進制文件,這便是QVFB能執行的應用程序。如果再用Qt/Embedded的庫對整個工程進行交叉編譯鏈接,就能得到在S3C2440平臺上運行的可執行文件。
將交叉編譯好的可執行程序imgviewer拷貝進開發板/usr/local/Trolltech/QtEmbedded-4.5.3/bin目錄下,在終端下鍵入./imgviewer,即可運行程序。運行結果見圖3。

嵌入式技術的關鍵在于人機交互技術的體現,基于Qt/Embedded的GUI為嵌入式Linux系統用戶提供了良好的使用和交互環境。筆者通過一個簡單的應用程序,對Qt/Embedded在S3C2440平臺下的移植與開發進行了詳細介紹,為類似的GUI程序開發提供了一個參考。
[1]AHN S H,SUL D M,CHOI S C,et al.Implementation of lightweight graphic library builder for embedded system[C]//Proc.The 8th International Conference on Advanced Communication Technology.Phoenix,USA: IEEE Press,2006:166-168.
[2]Trolltech.Online reference documentation[EB/OL].[2010-05-05].http://doc.trolltech.com/.
[3]梅寬勤.基于Qt/Embedded的圖像用戶界面移植[D].上海:復旦大學,2007.
[4]趙拯宇,張雪英,金剛.Qt/Embedded和Qtopia在OMAP5912平臺上的移植及應用[J]. 儀器儀表用戶,2009,16(2):108-110.
[5]孫瓊.嵌入式Linux應用程序開發詳解[M].北京:人民郵電出版社,2006.
[6]成潔,盧紫.Linux窗口程序設計[M].北京:清華大學出版社,2008.
[7]BLANCHETTE J,SUMMERFIELD M.C++GUIQt 4編程[M].2版.閆鋒欣,曾泉人,張志強,譯.北京:電子工業出版社,2008.