彭均键,史步海,刘洋
GUI的广泛应用是当今计算机发展的重大成就之一,它极大地方便了非专业用户的使用。而嵌入式 GUI本身具有着轻型、占用资源少、高性能、高可靠性、便于移植、可配置等特点,具有强大的发展潜力。作为主流之一的Linux嵌入式系统,主要的 GUI开发应用软件包括 GTK(GIMP Toolkit)、Qt和wxWidgets这3大GUI框架。其中Qt是挪威的 Trolltech公司的旗舰产品,作为跨平台的应用程序框架,是开源左面系统KDE的基石。因此,本文将介绍以此为基础的嵌入式 GUI开发平台的搭建,并且结合深圳优龙公司所提供的FS2410DEV开发套件进行详细讲解。
首先在进行开发的PC机上建立Linux编译环境,然后根据目标机的硬件总类对Qt应用程序源码包进行定制,进而交叉编译,生成相关的函数库。接着就是制作根文件系统,下载到目标板中。至此,平台的搭建工作就算完成。
为了在用于开发的PC主机上得到Linux的开发环境,我们选择在Windows操作系统中安装VMware虚拟机软件,再在其中安装我们需要的Linux操作系统。使用虚拟机的一大好处是,当在Linux因为不熟悉而遇到问题的时候,可以很容易的回到 Windows中寻求解决方案,避免了在双系统中来回重启切换的麻烦。虚拟机的版本尽量选择当前的最新版,因为Linux系统的发展迅速,如果安装在旧版的虚拟机当中,不能保证有很好的兼容性,有关VMware虚拟机软件的信息,可以登陆 http://www.vmware.com/进行了解。虚拟机安装完成之后,就可以开始安装Linux操作系统了,比较常见的版本有Red Hat Linux、Fedora Core、Ubuntu、SUSE Linux等等,这里我们采用的是Fedora Core 7。
要进行Qt应用程序的开发,需要qt-x11-free-3.3.8.tar.gz和qt-embdedded-free-3.3.8.tar.gz,这两个源码包,可以登陆http://www.qtopia.org.cn/下载。版本可以自己选择,但两者最好保持一致。此外,还需要一个交叉编译器,这里选用的是arm-linux-gcc-3.4.1.tar.gz编译器。
在下载完上述3个源码包后,把它们放在同一个目录下面就可以开始编译了。
第一步,首先是解压安装包并设置环境变量,用到的命令如下:
对于交叉编译器arm-linux-gcc-3.4.1来说,只需要解压并设置环境变量即可使用,不需要对其进行编译,而上述命令中把解压出来的 Qt/Embedded目录改名成"qt-embedded-host",是为了区分下面要讲到的交叉编译。上述环境变量的设置是非常重要的,因为它关系到能否正确的安装及编译这些安装包。
第二步,下面开始编译qt-x11安装包,命令如下:
配置参数-no-xft是指本次编译不支持xft,xft主要是为X程序提供了一个客户端的API,如果不把这一项支持去掉,make的过程中会因为找不到相关的头文件而出错。在这里,我们编译qt-x11的原因就是为了接下来得到里面的qvfb工具。
第三步,编译qvfb,命令如下:
cd $QTEDIR/tools/qvfb
make clean
qmake -o Makefile qvfb.pro
make
cp qvfb $QTEDIR/bin/
这里提到的qvfb是为Qt做的一个虚拟frambuffer的应用程序,它的最终目的就是把Qt应用程序运行的结果显示在qvfb上(实际中是要通过linux的frambuffer驱动显示在目标板的 lcd屏上的),并提供键盘、鼠标的外设仿真从而提高研发时的工作效率。
第三步,编译qt-embedded-host,命令如下:
对于这里的配置选项,可以通过./configure –h命令来查看,根据自己的需要定制。如果用这一步编译出来的相关函数库去编译自己开发的程序,最后生成的可执行文件只能在PC上的 qvfb上运行。这就是为什么要在配置中加上 qvfb的支持,以及在第二步里面拷贝qvfb过来的原因了。
第四步,交叉编译Qt/Embedded,这一步就是要根据开发板的硬件配置来定制编译参数,最终生成合适的函数库,再对开发程序进行编译。下面先退出到一开始存放3个源码包的目录,重新解压qt-embedded-free-3.3.8.tar.gz代码包并且改名为qt-embedded-target,这个名字表示这个步骤编译是按照目标板定制的,在这里我们需要用到第三步编译后生成的两个工具,分别是 moc和 uic,把它们复制到qt-embedded-target的bin目录下。
如果缺少这两个工具将会导致编译出错,不能生成我们需要的库文件。另外,由于我们的优龙FS2410DEV开发套件选配的是一个 8寸的液晶触摸屏,因此在使用 configure命令对makefile进行定制的时候要添加触摸屏支持。但是在开始定制之前,我们需要根据触摸屏的种类,对源码包里面相关的源文件进行修改,这样才能让我们编译出来库文件支持该触摸屏。否则,触摸屏就无法使用了。
需要修改的文件有两个分别是 qmouselinuxtp_qws.cpp和 qmouselinuxtp_qws.h,这两个文件所在的目录是"qt-embedded-target/src/embedded/"。在qmouselinuxtp_qws.cpp文件中查找"/dev/h3600_tsraw"字段并且替换成"/dev/touchscreen/0",这个是开发板/dev目录下对应的名字;然后在 qmouselinuxtp_qws.h中增加两个宏定义"#define QT_QWS_IPAQ"和"#define QT_QWS_IPAQ_RAW"。修改完成后,我们就可以开始编译库文件了:
定制时的一个embedded参数表明了我们的目标板采用的是arm核心处理器,而最后一个参数则是添加触摸屏的支持。在定制的时候可以尽可能的把不需要的支持去掉,因为这样可以缩减库文件的大小,节省开发板上的存储空间。编译顺利通过以后,就可以得到 lib目录下的四个库文件libqte-mt.so、 libqte-mt.so.3、 libqte-mt.so.3.3、libqte-mt.so.3.3.8,其实前 3个都是指向最后一个文件的连接,我们可以通过file命令来查看libqte-mt.so.3.3.8这个库文件是否是我们需要的在开发板上跑的库。另外,在lib目录下还有一个fonts文件夹,里面包含Qt程序运行时所需要的字体,因此该文件夹也需要添加到根文件系统中。
要开发板运行起来,需要把内核和根文件系统烧写进去。内核,可以使用开发板自带的,也可以登陆http://download.chinaunix.net/download/0007000/6156.shtml/下载,然后根据硬件的实际情况来定制,重新编译该内核,再烧写到开发板上。采用新版本的内核,可以得到一些新的支持,实现更多的功能。对于根文件系统,可以开发板自带的作为模板,根据实际情况裁减,增加自己的库文件与程序,就可以烧写到开发板上,并最终运行了。
在所有的千其准备工作都顺利完成以后,就可以开始根据用户的需求来开发各种各样的嵌入式 GUI程序了,开发的主要流程如图1所示。
图1 Qt程序一般开发流程
在开发过程中,其实可以省掉用qvfb工具测试的步骤,因为最终的程序需要交叉编译才能放到开发板上运行,但对于界面的设计,通过qvfb工具进行调试更为直观、方便,避免了因为一些小的调整而来回烧写根文件系统。在界面的设计敲定以后,对于一些关系到其它硬件资源部分的程序的调试,qvfb工具也就不能满足了,这时候就需要真正把交叉编译好的程序下载到开发板上进行运行调试了。
最后值得注意的是,在利用之前的qt-embedded-host和qt-embedded-target里面的函数库,对应用程序代码进行编译之前,必须先设置好PATH、QTDIR、LD_LIBRARY_PATH等相应的环境变量。
下面通过Qt/Embedded本身自带的"hello world"例子,演示一个Qt界面程序分别在qvfb和开发板上运行的情况。首先是在qvfb上运行,先把编译host程序的环境变量设置好,然后进入qt-embedded-host中的example目录,再进入hello文件夹,该例子的源程序和可执行文件都在这个文件夹中。接着先启动 qvfb,再运行可执行文件hello。运行后的结果如图2所示:
图2 "hello"在qvfb上运行
接下来就是把文件放到跟文件系统,烧写在板上运行,这里用到的是qt-embedded-target的可执行文件。假设Qt的交叉编译库放在根文件系统的/usr/lib目录下,程序的可执行文件放在了根目录下,然后就可以用开发板自带的DNW工具用命令行登陆到板上,设置一下环境变量:
然后就可以运行根目录下的可执行文件"hello"了,运行结果如图3所示。
图3 "hello"在开发板上运行
本文讲述了如何利用Qt这款GUI开发软件,在PC机上搭建一个嵌入式的 GUI开发平台,并且结合优龙公司的FS2410DEV(v6.0)开发套件给出了实际例子。对于嵌入式GUI开发来说,虽然应用程序的代码编写直接关系到一个工程的成功与否,但在编写代码之前,开发环境的搭建往往更为重要,只有在有了一个完好的开发平台以后,才可以真正开始应用程序的开发。
另外,以上所采用的Qt/Embedded版本是3.3.8,在实际的开发过程中,会遇到有极为少数的类,例如"QTextEdit",能够编译生成可执行文件,并且在qvfb上成功运行,但下载到开发板上却不能显示,同时也没有任何的错误信息。通过试验可以发现,如果采用 Qt/Embedded4.0以上的版本,这些在3.3.8里面不能使用的类,也可以在开发板上正确显示。因此,在开发板的性能允许的情况下,应该使用版本较新的Qt软件来进行开发平台的搭建,以获得最好的效果。
本文作者创新点:文中以Qt/Embedded这种国内外比较流行的嵌入式 GUI软件作为研究对象,结合优龙公司的FS2410DEV(v6.0)开发套件,讲述了如何搭建一个完整的Qt嵌入式GUI开发环境,并列举了一个具体的运行例子。在开发平台搭建完成以后,就可以十分便利的让广大用户在此基础上进行各种各样的嵌入式GUI开发。
[1] 段鹏,金敏.嵌入式Linux组态软件图形界面设计实现[J] .微计算机信息,2008,(5): 50,54-55.
[2] 孙琼.嵌入式Linux应用开发详解[M] .北京:人民邮电出版社,2006:107-124.
[3] 尤盈盈,孟利民. 构建嵌入式Linux交叉编译环境[J] .计算机与数字工程,2006,34(6):31-33.
[4] 何剑锋,邬文彪等.嵌入式Linux系统的Qt/Embedded图形界面开发[J] .电子工程师,2007,33(7):46-48.
[5] 张方辉,王建群.Qt/Embedded在嵌入式Linux上的移植[J] .计算机技术与发展,2006,16(7):65-67.
[6] 陈文星,张辉宜.嵌入式 Linux操作系统的特性[J] .计算机技术与发展,2006,16(3):21-24.