唐 浩,代少升
(重慶郵電大學(xué) 信號與信息處理重點(diǎn)實(shí)驗(yàn)室,重慶 400065)
21世紀(jì)是后計(jì)算機(jī)時(shí)代,人們每天都會接觸很多的嵌入式產(chǎn)品,手機(jī)、PDA等手持式信息設(shè)備發(fā)展迅速。這些設(shè)備的關(guān)鍵在于人機(jī)交互技術(shù)的體現(xiàn),所以一個(gè)十分友好的圖形用戶界面(GUI)是必不可少的。
目前嵌入式Linux的主流GUI系統(tǒng)主要有MiniGUI,MicroWindows,OpenGUI,Qt/Embedded 等[1],這些 GUI 在接口定義、體系結(jié)構(gòu)、功能特性等方面存在很大差別。MiniGUI具有良好的軟件架構(gòu),通過抽象層將其上層和底層操作系統(tǒng)隔離開來,開發(fā)的重點(diǎn)在于窗口系統(tǒng),但由于支持力量比較薄弱,其維護(hù)和再開發(fā)成本不可預(yù)計(jì)。MicroWindows以較小的資源消耗、通用的幀緩沖(FrameBuffer)技術(shù)、靈活的分層設(shè)計(jì)模式和豐富的API支持等特點(diǎn)獲得廣泛的關(guān)注,但其圖形引擎無任何硬件加速能力,算法低效,代碼質(zhì)量較差。OpenGUI基于用匯編語言實(shí)現(xiàn)的X86圖形內(nèi)核,提供了高層的C/C++圖形/窗口接口,它的資源消耗小,但可移植性差,不支持多進(jìn)程。
Qt/Embedded[2]是一個(gè)多平臺的C++圖形用戶界面應(yīng)用程序框架,易擴(kuò)展,可移植性好,支持多個(gè)GUI平臺的交互開發(fā)。從個(gè)人消費(fèi)電子到工業(yè)控制設(shè)備,Qt/Embedded被廣泛地應(yīng)用于各種嵌入式產(chǎn)品和設(shè)備中。
Qt/Embedded是著名的Qt庫開發(fā)商Trolletch公司(2008年6月被諾基亞公司收購)開發(fā)的圖形化界面開發(fā)工具Qt的嵌入式版本。Qt/Embedded采用Server/Client結(jié)構(gòu),延續(xù)了Qt在X上的強(qiáng)大功能,在底層摒棄了Xlib,僅采用FrameBuffer作為底層圖形接口。同時(shí)將外部輸入設(shè)備抽象為keyboard和mouse輸入事件,底層接口支持鍵盤、鼠標(biāo)、觸摸屏以及用戶自定義的設(shè)備等[3]。
Qt/Embedded的類庫完全采用C++封裝,控件資源豐富,可移植性較好,開放的源碼使得開發(fā)人員可以在GPL許可協(xié)議下自由地進(jìn)行嵌入式GUI應(yīng)用程序的移植與開發(fā)。Qt/Embedded移植與開發(fā)總體流程如圖1所示。
筆者采用廣州友善之臂公司設(shè)計(jì)的Micro2440開發(fā)板作為硬件平臺,該開發(fā)板由核心板與底板組成。核心板上集成了三星公司400MHz的微處理器S3C2440,64Mbyte的SDRAM,64Mbyte NAND Flash以及2Mbyte NOR Flash。底板上則集成了一些常規(guī)外設(shè)接口。在軟件方面,使用Linux-2.6.13穩(wěn)定內(nèi)核的操作系統(tǒng),根文件系統(tǒng)為缺省安裝的文件系統(tǒng),采用基于arm-linuxgcc-3.4.1的函數(shù)庫。
整個(gè)系統(tǒng)軟件由引導(dǎo)裝載程序(U-Boot)、設(shè)備驅(qū)動(dòng)(包括幀緩沖)、嵌入式 Linux內(nèi)核、文件系統(tǒng)(YAFFS)以及基于 Qt/Embedded的應(yīng)用程序組成[4]。系統(tǒng)平臺結(jié)構(gòu)如圖2所示。
搭建編譯平臺是嵌入式GUI的必要工作。Qt/Embedded的軟件開發(fā)環(huán)境主要包括嵌入式Linux操作系統(tǒng)、軟件開發(fā)工具鏈以及相關(guān)源碼包。本文的開發(fā)環(huán)境是在個(gè)人PC上安裝VMware Workstation 6.5.1和Red Hat Linux 9.0操作系統(tǒng),內(nèi)核版本是2.6.13,與目標(biāo)板上運(yùn)行的版本一致。采用的交叉編譯器為armlinux-gcc-3.4.1,源碼包為qt-embedded-linux-opensource-src-4.5.3和 qt-x11-opensource-src-4.5.3。
在PC機(jī)上編譯好的qt-x11可以生成Qt開發(fā)工具,如用戶界面編譯器(UIC)與虛擬幀緩沖服務(wù)器(QVFB),作為交叉編譯環(huán)境的支持。虛擬環(huán)境搭建過程如下:
1)在PC平臺文件系統(tǒng)中建立工具包目錄,將源碼包分別用tar命令解壓并放置其中。
2)進(jìn)入qt-x11目錄,在終端鍵入./configure命令對qt-x11安裝環(huán)境進(jìn)行配置,根據(jù)源碼包配置選項(xiàng)和系統(tǒng)情況生成makefile文件,為make做準(zhǔn)備。
3)配置完成以后,鍵入make命令,從makefile中讀取指令進(jìn)行編譯,用來創(chuàng)建庫文件,編譯例程和指南,需要等待一段比較長的時(shí)間。
4)編譯完成之后,進(jìn)入tools目錄下的qvfb目錄,鍵入make對其進(jìn)行編譯。最后回到qt-x11目錄,鍵入make install進(jìn)行安裝。
5)make install完成之后,會在/usr/local目錄下生成一個(gè)Trolltech目錄,這就是qt-x11-opensource-src-4.5.3安裝后所在目錄。將/usr/local/qt/qt-x11-opensource-src-4.5.3/tools/qvfb目錄下的qvfb相關(guān)文件拷貝到/usr/local/Trolltech/Qt-4.5.3/bin目錄下。至此X11環(huán)境就搭建好了。
通過qt-x11提供的庫和開發(fā)工具,可以進(jìn)行Qt應(yīng)用程序的開發(fā),但是若需要在目標(biāo)板上運(yùn)行該程序,則還需使用qt-embedded庫對該程序進(jìn)行交叉編譯,才能得到在ARM平臺上運(yùn)行的可執(zhí)行程序。這就需要搭建qt-embedded交叉編譯環(huán)境,其實(shí)現(xiàn)過程如下:
1)安裝交叉編譯器。工具包目錄中鍵入tar xvzf arm-linux-gcc-3.4.1.tgz-C/,執(zhí)行該命令將arm-linuxgcc安裝到/usr/local/arm/3.4.1。然后設(shè)置路徑變量,修改/etc/profile文件,在最后一行添加export PATH=/usr/local/arm/3.4.1/bin:$PATH。
2)進(jìn)入qt-embedded目錄,鍵入./configure-embedded arm-xplatform qws/linux-arm-g++-depths 4,8,16,32,配置參數(shù)指定 ARM 平臺,并支持 4,8,16,32 位的顯示顏色深度。
3)使用make命令進(jìn)行編譯,用來生成qt-embedded庫。
4)使用make install進(jìn)行安裝。完成后,qt-embe-dded被安裝在/usr/local/Trolltech/QtEmbedded-4.5.3目錄下。
Qt/Embedded應(yīng)用程序在S3C2440平臺上的運(yùn)行需要有qt-embedded庫支持。在開發(fā)板的根目錄下新建如下目錄:
/usr/local/Trolltech/QtEmbedded-4.5.3/bin//安裝運(yùn)行庫文件
/usr/local/Trolltech/QtEmbedded-4.5.3/lib/fonts//安裝字體庫文件
把PC上對應(yīng)目錄下交叉編譯后生成的qtembedded庫文件和字體文件,分別拷貝到上述目錄中。注意,運(yùn)行庫文件一般只拷貝libQtGui.so.4,libts-0.0.so.0,libQtCore.so.4,libQtNetwork.so.4,如果文件是到共享庫的鏈接文件,則把該共享庫也要拷貝上,字體庫則需拷貝一種就可以了。設(shè)置開發(fā)板環(huán)境變量:
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是一個(gè)創(chuàng)建GUI程序的C++類庫,編寫Qt應(yīng)用程序的主要工作是基于已有的Qt類去編寫用戶類。筆者以發(fā)布一個(gè)圖片瀏覽工具(ImgViewer)為例,簡單地介紹Qt/Embedded應(yīng)用程序的開發(fā)過程。
強(qiáng)大的工具支持是進(jìn)行Qt/Embedded圖形用戶開發(fā)的優(yōu)勢所在。除了前面提到的QVFB和UIC工具外,Qt designer(圖形設(shè)計(jì)器)工具為GUI窗口組建,提供了一種可視化的設(shè)計(jì)能力,非常方便高效;qmake工具能為不同平臺的開發(fā)項(xiàng)目創(chuàng)建makefile配置文件;編程助手assistant能隨時(shí)隨地給編程帶來幫助。
筆者采用Qdevelop4.4.3來編寫Qte程序。Qdevelop是一個(gè)跨平臺集成開發(fā)環(huán)境,完全致力于Qt4的開發(fā)。
Qt/Embedded源程序一般應(yīng)該包含以下文件:1個(gè)主程序文件(main.cpp)、多個(gè)源程序文件(source.cpp)與對應(yīng)的頭文件(source.h)以及用來生成makefile的項(xiàng)目文件(.pro)。在本次開發(fā)中,并沒有使用Qt designer來進(jìn)行可視化窗口設(shè)計(jì),完全借助Qdevelop純代碼進(jìn)行編寫,這樣能更好地體會Qt/Embedded GUI設(shè)計(jì)的精髓所在。基本操作步驟如下:
1)編寫頭文件imgviewer.h。在Qdevelop中新建工程imgviewer.pro,并添加頭文件imgviewer.h。頭文件定義了實(shí)例中需要用到的各種窗體控件,包括菜單(QMenu)、工具條(QtoolBar)、動(dòng)作(Qaction)以及各種操作的槽函數(shù)(slots)。
2)編寫源文件imgviewer.cpp。源文件中設(shè)置了字體,規(guī)定了窗口屬性,并且創(chuàng)建了動(dòng)作、菜單和工具條等一系列的實(shí)現(xiàn)函數(shù)。這里會接觸到Qt最重要的特性:信號與槽機(jī)制(signal&slot)。信號與槽機(jī)制提供了任意兩個(gè)Qt對象之間的通信機(jī)制,信號會在某個(gè)特定情況或動(dòng)作下被觸發(fā),槽是用于接收并處理信號的函數(shù)。其常用格式為 bool QObject::connect(Object1,SIGNAL(signal1),Object2,SLOT(slot)),以及與這個(gè)函數(shù)對應(yīng)的disconnect函數(shù),可以將信號和槽斷開連接。下面介紹一段簡單的程序,該程序設(shè)置了打開單個(gè)文件這一動(dòng)作:
openFileAction=new QAction(QIcon(":/images/openfile.png"),tr("Open"),this);//創(chuàng)建一個(gè) Open 動(dòng)作,并調(diào)用openfile.png圖標(biāo),圖標(biāo)位于資源庫images文件夾下。
openFileAction->setStatusTip(tr("Open File"));//設(shè)置該圖標(biāo)的狀態(tài)提示為"Open File"。
connect(openFile-Action,SIGNAL(triggered()),this,SLOT(slotOpenFile()));//連接信號與槽,觸發(fā) openFileAction這一動(dòng)作時(shí),將進(jìn)行slotOpenFile()這一過程的處理。
3)編寫主函數(shù)main.cpp。Qt/Embedded應(yīng)用程序應(yīng)該包含一個(gè)主函數(shù),該函數(shù)是應(yīng)用程序的入口點(diǎn)。結(jié)合imgviewer.h和imgviewer.cpp,可以看到所有應(yīng)用程序開發(fā)主函數(shù)main.cpp編寫的框架結(jié)構(gòu):
#include"imgviewer.h"
#include
//QApplication包含了Qt圖形化應(yīng)用程序的各種資源、基本設(shè)置、控制流以及事件處理等。若是Qt的非圖形化應(yīng)用程序,則需包含
4)生成makefile文件及編譯鏈接生成可執(zhí)行文件。借助qmake工具可以生成makefile文件,實(shí)現(xiàn)過程為:qmake-o Makefile imgviewer.pro。然后在命令行下輸入make命令對整個(gè)工程進(jìn)行編譯,就能生成X86架構(gòu)的二進(jìn)制文件,這便是QVFB能執(zhí)行的應(yīng)用程序。如果再用Qt/Embedded的庫對整個(gè)工程進(jìn)行交叉編譯鏈接,就能得到在S3C2440平臺上運(yùn)行的可執(zhí)行文件。
將交叉編譯好的可執(zhí)行程序imgviewer拷貝進(jìn)開發(fā)板/usr/local/Trolltech/QtEmbedded-4.5.3/bin目錄下,在終端下鍵入./imgviewer,即可運(yùn)行程序。運(yùn)行結(jié)果見圖3。
嵌入式技術(shù)的關(guān)鍵在于人機(jī)交互技術(shù)的體現(xiàn),基于Qt/Embedded的GUI為嵌入式Linux系統(tǒng)用戶提供了良好的使用和交互環(huán)境。筆者通過一個(gè)簡單的應(yīng)用程序,對Qt/Embedded在S3C2440平臺下的移植與開發(fā)進(jìn)行了詳細(xì)介紹,為類似的GUI程序開發(fā)提供了一個(gè)參考。
[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].上海:復(fù)旦大學(xué),2007.
[4]趙拯宇,張雪英,金剛.Qt/Embedded和Qtopia在OMAP5912平臺上的移植及應(yīng)用[J]. 儀器儀表用戶,2009,16(2):108-110.
[5]孫瓊.嵌入式Linux應(yīng)用程序開發(fā)詳解[M].北京:人民郵電出版社,2006.
[6]成潔,盧紫.Linux窗口程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2008.
[7]BLANCHETTE J,SUMMERFIELD M.C++GUIQt 4編程[M].2版.閆鋒欣,曾泉人,張志強(qiáng),譯.北京:電子工業(yè)出版社,2008.