|
嵌入式学习stm32_嵌入式Linux下Qt/Embedded应用关键技术研究,
随着后PC时代的到来,嵌入式系统的性能有了大幅度的提高,应用范围也越来越广,当初的一些简单的人机交互接口已经无法满足人们的要求,在嵌入式系统中也逐渐出现了图形用户界面(Graphic User Interface,GUI),特别是在一些消费类产品中。嵌入式系统中的GUI就是在嵌入式系统中为特定的硬件设备或环境而设计的图形用户界面系统,由于受到目前嵌入式系统本身特点的影响,并受其发展限制,所以嵌入式系统中的GUI应该有如下特点[1]:
1)占用的存储空间以及运行时占用资源少。
2)运行速度以及响应速度快。
3)可靠性高。
4)便于移植和定制。
Linux有开放的源码、高效稳定的内核、良好的开发环境以及支持多种硬件平台等特点,而且由于Linux的可配置性和模块化,一个Linux内核经过配置和裁减可以只占用几百K左右的存储空间,使其在嵌入式系统中也得到广泛应用[2]。
QT/Embedded是一个用于嵌入式系统的图形用户界面系统,能够高效、稳定地运行于嵌入式 Linux系统下,能为用户提供可靠的交互功能。
本文就旨在于对这样的嵌入式GUI QT/Embedded应用中的一些关键问题进行研究。
1 嵌入式Linux操作系统
嵌入式操作系统目前主要有Vxwork、pSOS、Palm OS、Neculeus 和 Windows CE。但这些专用操作系统都是商业化产品,其价格昂贵,不适合低端嵌入式产品开发。而且,源代码的封闭性在很大程度上限制了开发者的开发。嵌入式 Linux操作系统弥补了这些不足,Linux操作系统是遵循GPL公约,并且有运行稳定、源码开放的特点,被认为是未来嵌入式操作系统的最佳选择。
2 QT/Embedded的特点和结构
QT/Embedded是著名的QT库开发商Trolltech公司开发的面向嵌入式系统的Qt版本[3]。许多基于Qt的 X Window程序可以非常方便地移植到Qt/Embedded上,仅采用Framebuffer作为底层图形接口。Qt/Embedded类库完全采用 C++封装。丰富的控件资源和较好的可移植性是Qt/Embedded最为优秀的一方面,使用X下的开发工具Qt Designer可以直接开发基于Qt/Embedded的UI(用户操作接口)界面。下图为Qt/Embedded的实现结构。
图1 Qt/Embedded的实现结构
Qt/Embedded在代码设计上,巧妙地利用了C++的面向对象机制,如继承、多态、模板等,具体实现非常灵活。
3 关键技术
3.1 Qt/Embedded的图形引擎实现
Qt/Embedded的底层图形引擎基于Framebuffer。Framebuffer是在Linux内核架构版本2.2以后新推出的标准显示设备驱动接口。采用mmap系统调用,可以将Framebuffer的显示缓存映射为可连续访问的一段内存空间。由于目前比较高级的ARM体系的嵌入式 CPU中大多集成了LCD控制模块,LCD控制模块一般采用双DMA控制器组成的专用DMA通道。其中一个DMA可以自动从一个数据结构队列中取出并装入新的参数,直到整个队列中的DMA操作都已完成为止。另外一个DMA与画面缓冲区相关。虽然使用了双DMA,但这两个DMA控制器的交替使用对于CPU来说是不可见的,CPU所获得只是由两个DMA组成的一个通道而已。
Framebuffer驱动程序的实现分为两个方面:一方面是对LCD及其相关部分的初始化,包括缓冲区的创建和对DMA通道的设置;另外一方面是对画面缓冲区的读写,有read、write、lseek等系统调用接口。对于将画面缓冲区的内容输出到LCD显示屏上,由硬件自动完成,对于软件来说是透明的。当对于DMA通道和画面缓冲区设置完成后,DMA开始正常工作,并将缓冲区中的内容不断发送到LCD上。这个过程是基于DMA对于LCD的不断刷新。
在Qt/Embedded中,Qscreen类是抽象出的底层显示设备基类,它声明了对于显示设备的基本描述和操作方式,如打开、关闭、获得显示能力等。另外还有一个重要的基类是QGfx类,此类抽象出对于显示设备的具体操作接口,如选择画刷、画线、画矩形等。这两个基类是Qt/Embedded图形引擎的底层抽象,其中所有具体函数基本上都是虚函数,Qt/Embedded对于具体的显示设备,如Linux的Framebuffer、Qt Virtual Framebuffer做的抽象接口类全都由此继承并重载虚函数实现。
图2 Qt/Embedded中鼠标设备抽象派生结构
3.2 Qt/Embedded的事件驱动
Qt/Embedded中与用户输入事件相关的信号是建立在对底层输入设备的接口调用。Qt/Embedded中的输入设备主要有鼠标和键盘设备。在2.x和3.x版本系列中鼠标设备的抽象基类为QWSMouseHander,从该类又重新派生出一些具体的鼠标类设备的实现类,鼠标类设备的派生结构如图2。键盘类设备接口的基类QWSKeyboardHandler,移植时需要根据键盘驱动程序从该类派生出实现类,实现键盘事件处理函数 processKeyEvent(),并在QWSServer::setKeyboardHandler函数中注册自已的键盘类设备。其中对于点击键码定义在QT/Embedded的命名空间src/kernel/qnamespace.h中。
3.3 QT/Embedded的移植
本文使用的系统采用320*240分辨率的TFT LCD和S3C2410内部LCD控制模块为显示设备,S3C2410有内部触摸屏控制器和USB Host控制器,可采用USB接口的鼠标、键盘或触摸屏作为输入设备。Linux操作系统内核为2.4.18。
Qt/Embedded的移植首先要准备好要使用的源文件。需要准备的源文件有:qt-x11-2.3.2.tar.gz,提供qvfb虚拟缓冲帧工具,uic用户界面编译器和Designer Qt应用程序设计工具等。Qt/Embedded直接写入帧缓冲,而在宿主机上则是通过qvfb(vitural framebuffer)来模拟帧缓冲。qvfb是X窗口用来运行和测试Qtopia应用程序的系统程序,允许在桌面上开发Qt嵌入式程序,而不需要在命令台和X11之间来回切换。qvfb使用了共享存储区域(虚拟的帧缓冲)来模拟帧缓冲并且在一个窗口中模拟一个应用,显示的区域被周期性的改变和更新。通过指定显示设备的宽度和颜色深度,虚拟出来的缓冲帧和物理的显示设备在每个像素上保持一致。这样在每次调试应用时不需要总是刷新嵌入式设备的Flash存储空间,从而加速了应用的编译、链接和运行周期。qt-embedded-2.3.7.tar.gz和qt-embedded- 2.3.7.tar.bz2,提供Qt库的支持。qtopia-free-1.7.0.tar.gz,提供应用程序开发包桌面环境。tmake- 1.11.tar.gz,用于生成和管理Makefile。[!--empirenews.page--]
Qt/Embedded到目标设备的移植也需要相应的交叉编译工具链,交叉编译就是在主机平台编译器链接产生运行于目录平台的可执行文件,可采用Cygwin平台下的arm-linux-gcc.exe系列编译器。
3.4 添加应用到qtopia
Qtopia即QPE(Qt Palmtop Environment)是由著名的Trolltech公司基于Qt的嵌入式版本Qt/Embedded库的基础上,专门针对PDA、智能手机这类运行嵌入式Linux的移动计算设备和手持设备所开发的开放源码的一套应用程序包和开发库。移植好Qt/Embedded和Qtopia后,需要将编写的应用程序添加到Qtopia。要为开发的应用程序建立好一个图标文件,然后要重新交叉编译Qtopia,建立.desktop文件,将其保存在 qtopia/apps/applications目录下。最后制作新的文件系统映像文件,把新建的应用程序文件加入其中,若要使QPE能够自动运行,需要对嵌入式系统上的Linux启动过程进行修改,主要是要修改etc/profile里的脚本文件。
4 结论
QT能稳定、可靠地运行于Linux 系统下,并且可以快速构建一个可视化嵌入式软件系统。本文的创新之处是分析了嵌入式Linux+QT/Embedded图形系统的嵌入式图形软件开发中的关键技术,这种开发模式可以大大缩短嵌入式可视化软件的开发周期。
参考文献:
[1] 纪竞舟,付宇卓.基于ARMLINUX的嵌入式GUI的研究和移植[J].计 算 机 仿 真,2004,22(3):224-238
[2]吴姣梅,李红艳等.改善嵌入式Linux实时性能的方法研究[J].微计算机信息,2006,1:72-74
[3] Xterm(中国)软件技术有限公司.Qt程序设计[M].北京:清华大学出版社,2002 |
|