Qt/Embedded GUI移植及应用程序开发


摘要:介绍了系统平台构建;重点分别从主机环境和XSbase 255嵌入式开发板两部分介绍Qt/Embedded图形界面的移植,最后结合实例阐述了如何开发基于嵌入式Linux的应用程序以及文件系统镜像的制作。

    随着互联网和移动通信技术的日益成熟,两者相互渗透和融合的步伐正在加快。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.1Qt/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驱动程序是最重要的驱动程序之一,正是这个驱动程序才能使系统屏幕显示内容。其实现分为两个方面:一是对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脚本文件中进行设置。
    特别指出,在配置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 PalmtopEnvironment)是由著名的Trolltech公司基于Qt的嵌入式版本Qt/Embedded库的基础上,专门针对PDA、 SmartPhone这类运行嵌入式Linux的移动计算设备和手持设备所开发的开放源码的一套应用程序包和开发库。Qtopia是基于 qt/embedded程序库编写的应用程序环境,(Qtopia是Qt在Linux/embedded Linux版本里的一个application实现。)界面优美。主要应用于高端手机,pda等嵌入式系统,具有广阔的发展前景。
 
表3  宿主机移植所需工具及环境变量声明
3.3.2 目标板上的移植
    目标板上的移植与宿主机类似,只需将编译参数做一定的修改即可。表4列出了qtopia移植中qtembedded共享库的支持,环境变量声明和关键的编译配置命令,以及最后目标板上qpe的架构。图1是在 XSbase255开发系统上移植Qt/Embedded和Qtopia的显示截图。
 
表4  Qtopla配置编译及其架构
 
图1  基于XSbase的Qtopia图形
 
表5 文件系统组织图

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)自动运行
    我们对嵌入式系统上的linux启动过程进行了研究,若要使qpe能够自动运行,我们需要改写其脚本文件(表6),在etc/profile脚本中,做如下添加。

表6  脚本文件的改写
    重新运行qtopia,就可以看到我们添加的应用的图标,点击此图标就可以运行此应用程序了。图2是我们编写的Camera程序在Qtopia下的截图。
 
图2  添加camera程序后的Qtopia


你可能感兴趣的:(QT)