区的创建和设置DMA通道;另外一方面是对画面缓冲区的读写,read、write及lseek等系统调用接口可以调用驱动程序的读写函数。至于将画面缓冲区的内容输出到LCD显示屏上,则由硬件自动完成。当设置DMA通道和画面缓冲区后,DMA开始正常工作并将缓冲区中的内容不断发送到LCD上,这个过程基于DMA对于LCD的不断刷新。帧缓冲驱动程序则将数据写入帧缓存中,这通过映射MMAP来实现[2]。
在Qt/E中,QScreen类为抽象出的底层显示设备基类,其中声明了对于显示设备的基本描述和操作方式,如打开、关闭、获得显示能力、创建 GFX操作对象等。另外一个重要的基类是QGFX类。该类抽象出对于显示设备的具体操作接口(图形设备环境),如选择画刷、画线、画矩形、alpha操作等。以上两个基类是Qt/E图形引擎的底层抽象,其中许多函数是虚函数。当具体的显示设备(如具体的帧缓冲设备和虚拟帧缓冲设备)从其派生类时,这些派生类会继承并重载基类中的虚函数来实现[3]。
3.2 Qt系统的信号与槽(Signal and Slot)机制
信号/槽是一种高级接口,应用于对象之间的通信,是Qt的核心特性,也是Qt区别于其他工具包的重要地方。信号/槽是Qt自行定义的一种通信机制,独立与标准的C/C++语言,因此要正确的处理信号和槽,必须借助于一个称为MOC(Meta Object Compiler)的Qt工具,该工具是一个C++预处理程序,它为高层次的事件处理自动生成所需要的附加代码。
Qt中使用信号/槽机制替代原始回调和消息映射机制。当一个特定事件发生的时候,一个信号被发射。Qt的窗口部件有很多预定义的信号,但是程序员总是可以通过继承来加入自定义的信号。槽就是一个可以被调用处理特定信号的函数。Qt的窗口部件有很多预定义的槽,但是通常的习惯是加入程序员自己的槽,这样就可以处理自己所感兴趣的信号。
所有从QObject或其子类派生的类都能够包含信号和槽。当对象改变其状态时,信号就由该对象发射出去,这就是对象所要做的全部事情。它不知道另一端是谁在接收这个信号,这就是真正的信息封装,它确保对象被当作一个真正的软件组件来使用。槽用于接收信号,但它们是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且,对象并不了解具体的通信机制,这样就可以相对容易地开发出代码可高重用的类[4]。
多个信号可以连接一个槽,一个信号也可以连接多个槽,甚至一个信号与另外一个信号相连接也是可能的,这时无论第一个信号什么时候发射系统都将立刻发射第二个信号,如图3所示[5]。总之,信号与槽构造了一个强大的部件编程机制。
图3 信号与槽的连接
4 Qt/E的移植
在PC上基于Qt/X11和qvfb的应用程序调试通过以后就可以将应用程序软件移植到目标平台上,但前提是要保证frame buffer、触摸屏等驱动程序的正常运行[6]。Qt/E移植过程如下:
1) 交叉工具链的安装。
本文选用的交叉工具链是arm-linux-gcc系列。安装包为:cross-2.95.3.tar.bz2将其拷贝到某个目录下,依次执行如下命令:
tar -jxvf cross-2.95.3.tar.bz2
这个工具链应该安装的路径是:/usr/local/arm/2.95.3(或者可以通过查看GCC版本号,可以得到一些信息,从版本信息中可以看到“-prefix=……”,这就是GCC安装的路径,它是在GCC编译前通过prefix选项配置的)。
$ mkdir -p /usr/local/arm
$mv ./2.95.3 /usr/local/arm
然后,在环境变量PATH中添加路径,就可以直接使用arm-linux-gcc命令了。
$export PATH=/usr/local/arm/2.95.3/bin:$PATH
2) 交叉编译Qt/E库
安装完交叉工具链之后,需要对Qt/E软件包进行交叉编译。将Qt/E的源代码拷贝到另外一个目录下,依次执行如下命令序列:
tar xfz qt-embedded-free-3.2.1.tar.gz
cd qt-embedded-free-3.2.1
export QTDIR=$PWD
export QTEDIR=$QTDIR
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
export PATH=/usr/local/arm/2.95.3/bin:$PATH
./configure -embedded arm -thread
Qt/E的配置选项可以参考./configure –help。其中比较关键的是-embeddded arm 表示配置为目标板为ARM的嵌入式用途,在编译过程中会进行多级优化以减小体积,提高效率。
3) 交叉编译Qt/E应用程序。
有了交叉工具链以及经过交叉编译的Qt/E库之后,就可以将驱动程序或应用程序进行编译,然后发布到ARM平台上。
首先,编写项目工程文件.pro,然后用qmake工具生成Makefile文件,最后调用Make指令编译、链接即可。这个过程中,在生成 Makefile文件之前,需要修改环境变量使其指向交叉编译后的Qt/E库所在目录。最终生成AR
|