嵌入式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做的抽象接口类全都由此继承并重载虚函数实现。
linux操作系统文章专题:linux操作系统详解(linux不再难懂)
评论