Qtopia Core在嵌入式Linux上的移植及应用

1 引言

嵌入式Linux以其开放的源代码,精简高效的内核、易定制和易裁减的特征以及硬件支持广泛等优势,而深受嵌入式开发者的青睐,在消费类电子产品和工业控制、智能仪表等领域中有着广泛的应用。Qt Trolltech公司推出的一个跨平台的 C++图形用户界面应用程序开发框架。Qt是完全面向对象的,很容易扩展,并且允许真正的组件编程。

Qtopia Core
是适用于嵌入式 Linux 所支持的单一应用设备的主导性应用框架,能够稳定、可靠地运行于嵌入式 Linux下,并且可以快速构建一个可视化嵌入式软件系统。 Qtopia Core的前身是 Qt/Embedded,继承了Qt 4的功能与优点,拥有与桌面系统的 Qt相同的应用程序编程接口(API)和工具包。当编译 Qtopia Core时,可以去除不用的功能和组件,以昀小化软件的占用空间。

2 Qtopia Core
介绍

Qtopia Core
是一个为嵌入式设备上的图形用户接口和应用开发而订做的C++工具开发包。Qtopia Core采用与桌面版本同样的一套 API,但在其内部实现上作了很多出色的调整来适应硬件有所限制的嵌入式环境。Qtopia Core包含多个 Qt工具,可以进行快速和优化开发,如 Qt 4增强的 GUI布局和窗体构建器 Qt DesignerQtopia Core Qt/X11昀大的区别在于 Qtopia Core不依赖于 X Server Xlib,而是直接访问帧缓存( FrameBuffer),这样显著减少了内存消耗。

2.1   Qtopia Core
的窗口系统

Qtopia Core
的窗口系统采用 Client/Server模型,任何一个 Qtopia Core的应用程序都需要运行在一个 Server应用上,而 Qtopia Core的应用程序本身也可以作为 Server来运行。 Server进程通常会生成 QWSServer类的一个对象,主要用来分配 Client进程的显示区域,并产生鼠标和键盘事件等。而 Client进程则通常生成 QWSClient类的一个对象,负责处理与各种应用相关的逻辑。Server Client之间的通信通过 socket来实现,这种通信通常被保持在一个较低的水平以减少通信的开销——比如窗口的绘制,并不是像 X那样完全由 Server来完成,而是由 Client进行直接操作 FrameBuffer来实现,Server进程所作的仅仅是通知 Client需要重绘的事件等。

2.2
信号与槽机制 (Signals and Solts)

信号与槽机制是 Qt的核心机制,它是一种高级接口,用于对象间的通讯,是 Qt区别于其它工具包的昀具特性的部分。信号与槽是 QT自行定义的一种通信机制,它独立于标准的 C/C++语言,需要借助一个称为 mocMeta Object Compiler)的 QT工具对信号和槽在编译之前进行预处理,为高层次的事件处理自动生成所需要的附加代码。

Qt
中使用信号与槽机制取代原始的回调和消息映射机制,信号与槽是类型安全的,完全面向对象的,并且它们之间的耦合比较松散,可以使得我们编写的通信程序更为简洁明了。当一个特定的事件发生时,一个被指定的信号就被发射,槽则是响应信号的函数,如果存在一个槽和该信号相连接,那在该信号被发射后,这个槽就会立刻执行。多个信号可以连接一个槽,一个信号也可以连接多个槽,甚至可以把信号与信号相连接。信号与槽构造了一个强大的组件编程机制,可以创建彼此互不了解的对象,利用信号就可以把信息正确的传递到对应的槽函数进行处理。

3 Qtopia Core
的安装与移植

3.1
建立交叉编译环境

文中采用 Trolltech公司的 Qtopia Core 4.3.2自由版作为目标板 Linux图形界面库。与 Qt/Embedded 3.x不同,Qtopia Core 4系列指明编译器需要 3.2以上的版本,此处选用 arm-linux-gcc-3.4.1的交叉编译工具链,将其拷贝到根目录 /下,运行解压命令:

tar xjvf arm-linux-gcc-3.4.1.tar.bz2

交叉编译器会被安装在/usr/local/arm/3.4.1/bin目录下,编辑 /etc/bashrc文件,将其添加到环境变量 PATH中:

export PATH=/usr/local/arm/3.4.1/bin:$PATH

3.2
交叉编译 Qtopia Core

Trolltech公司主页上下载 Qtopia Core 4源代码软件包qtopia-core-opensource-src-4.3.2.tar.gz,解压:

tar zxvf qtopia-core-opensource-src-4.3.2.tar.gz

cd qtopia-core-opensource-src-4.3.2

由于项目中使用带有触摸功能的 TFT液晶屏作为显示和输入设备,需要添加对触摸屏的支持。一种方法是利用 Qtopia Core Linux TP协议提供的鼠标驱动接口类,修改触摸屏驱动的源代码,并在执行 configure配置时传递-qt-mouse-linuxtp选项激活;另一种方法是嵌入 TslibTslib是一个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能。这里使用第一种方法,过程如下:

首先在源码树 src/gui/embedded/qmouselinuxtp_qws.h中加入宏定义:

#define QT_QWS_IPAQ

#define QT_QWS_IPAQ_RAW

然后修改 qmouselinuxtp_qws.cpp文件,把 QWSLinuxTPMouseHandlerPrivate函数中打开的设备文件节点 ”/dev/h3600_tsraw”替换为自己的触摸屏设备文件,如笔者目标板中为”/dev/touchscreen/0”

配置编译参数:

./configure -embedded arm -xplatform qws/linux-arm-g++ -depths 8,16,32 -no-qt3support -no-qvfb -qt-mouse-linuxtp

根据 configure生成的 Makefile文件编译并安装:

gmake

gmake install

交叉编译完后,程序和库默认会安装到 /usr/local/Trolltech/QtopiaCore-4.3.2-arm目录下。设置环境变量,修改$HOME/.bash_profile文件,加入

export PATH=/usr/local/Trolltech/QtopiaCore-4.3.2-arm/bin:$PATH

这样就可以直接使用 qmake工具交叉编译 Qtopia Core应用程序,生成可运行在 ARM平台的二进制可执行文件。

3.3
构建根文件系统和移植到目标平台

可以选择使用 Busybox工具构建一个全新的根文件系统,也可对开发板上原有的文件系统进行剪裁和修补。此处利用原有的文件系统映像,把新建的应用程序的相关文件加入其中。首先把原有的根文件系统映像 mount到工作的机器上,然后复制其内容到一临时目录下。将交叉编译好的 Qtopia Core库文件拷贝到目标板文件系统对应/lib目录下,其中主要库包括libQtCore.so.xlibQtGui.so.xlibQtNetwork.so.x等。此外,还需将交叉编译器所在目录下的 libstdc++.so.6库文件也拷贝过来。

为使应用程序能正确执行,需要设定系统的运行环境,将以下环境变量写入目标文件系统/etc/profile文件中:

export QTDIR=”/usr/local/Trolltech/QtopiaCore-4.3.2-arm”

export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

export QWS_MOUSE_PROTO=”LinuxTp:/dev/touchscreen/0”

要使我们的程序在系统启动后能够自动运行,还需在目标文件系统/usr/etc/rc.local脚本文件中,添加应用程序的路径和执行命令:

exec /apps/harmonic -qws

此时在开发板运行 Qtopia Core应用程序后,触摸屏还不能正确响应用户的点击,主要原因是目标板文件系统中用于存放校准信息的/etc/pointercal文件不存在或该文件中对触摸屏进行调整的参数不正确。Qtopia Core示例程序中提供了一个校准程序 mousecalibration,将其下载至目标板并运行,在出现校准界面后采用 5点校准会在 /etc目录下生成 pointercal校准文件。以后每次触摸屏启动都会读取该文件内容进行触摸屏设定。

4 Qtopia Core
应用程序开发实例

本实例的背景是为嵌入式电力谐波检测设备设计开发其上的图形用户界面程序,系统采用了 DSP+ARM双处理器构架的设计模式,通过串口通信实现数据传输和协同工作。基于 Qtopia Core的应用程序运行在 ARM平台上,其软件设计主要包括完成与 DSP的通信,接收传来的数据,并加以计算分析和统计,将电力谐波参数值及信息以波形曲线、频谱柱状图、表格等形式实时显示出来,通过人机交互界面反馈给用户,便于用户操作与控制。程序框架结构如图 1所示:

下载 (5.1 KB)

2010-3-22 12:06



设计上利用 Qtopia Core的多线程机制分前后台处理,前台为用户界面主线程,用来保持对用户操作的响应,控制和调度其他线程。其他执行起来耗时的任务如数据读取、处理分别设计成专门的线程放置在后台,各线程间使用互斥信号量方式通信达到同步工作。数据读取线程在编程实现上主要是依靠Linux系统提供的 termios结构对串口属性参数进行设置,并对串口对应的设备文件(位于 /dev目录下,串口一为 /dev/ttyS0)进行访问,将接收到的数据按照规定的协议格式加以解析,从而为数据处理线程提供数据支持。数据处理线程中自定义 PowerQuality类实现对电能质量各项性能指标的计算方法的封装,并将结果分析统计后发送至显示线程。数据显示线程通过子类化 Qtopia Core提供的相应的窗体控件,重新实现其绘制事件处理器 paintEvent()虚函数,在函数中创建并调用 QPainter类变量实现各类图形信息的绘制显示。程序以屏幕点触事件驱动,通过 Qtopia Core的信号与槽机制与终端用户交互。图2为开发实例运行在虚拟仿真窗口qvfb中的截图。

下载 (14.63 KB)

2010-3-22 12:06



5
结论

随着嵌入式 Linux应用的不断发展,嵌入式处理器运算能力的不断增强,对外设支持的不断丰富,越来越多的嵌入式设备开始采用较为复杂的 GUI系统,嵌入式 Linux系统下的 GUI应用程序开发也越来越深入。开发出优秀的的人机界面,是嵌入式发展的趋势,拥有广阔的市场前景。Qtopia Core延续了 Qt在桌面系统的所有功能,丰富的 API接口和基于组件的编程模型使得嵌入式 Linux系统中的应用程序开发更加便捷。

本文的创新点是:详细讲述了 Qtopia Core图形系统在嵌入式 Linux平台上的移植过程,并通过修改 Qtopia Core源代码,使得 Qtopia Core库支持触摸屏设备的使用。基于 Qtopia Core设计与实现了嵌入式电力谐波检测设备的系统界面,其界面友好、运行稳定,为其他嵌入式系统软件开发和应用提供一个参考。

 

你可能感兴趣的:(QT,GUI)