嵌入式Linux下的图形化窗口QT的移植与研究.docx
《嵌入式Linux下的图形化窗口QT的移植与研究.docx》由会员分享,可在线阅读,更多相关《嵌入式Linux下的图形化窗口QT的移植与研究.docx(13页珍藏版)》请在冰豆网上搜索。
嵌入式Linux下的图形化窗口QT的移植与研究
嵌
入
式
Linux
课
程
设
计
课题:
嵌入式Linux下的图形化窗口QT的移植与研究
:
专业班级:
电子信息工程2班
学号:
指导老师:
一.前言
随着嵌入式的技术的飞速发展,嵌入式已经得到了越来越广泛的应用。
应用领域涉与无线、网络、消费娱乐、影像、汽车电子、安全应用与存储装置。
如今越来越多的嵌入式需要一个图形用户界面(GUI),它是计算机与其使用者之间的对话接口,是嵌入式的重要组成部分。
本文重要针对嵌入式开发平台中Qt移植的过程进行详细的分析和研究,并且通过一个控制嵌入式开发平台的led数
码灯的Qt应用程序实例来说明移植和实现的过程。
1.系统平台组成
根据设计需要,本文目的是实现一个具有图形接口
界面的嵌入式显示终端,改系统使用嵌入式设计技术。
硬件上,采用基于Samsung$3C2410[1]CpU的目标板;在
软件上,选择嵌入式Linux为操作系统。
整个系统软件由
引导程序(ViVi公司的bootloader)、设备驱动(包括帧缓
存framebuffer)、嵌入式Linux核、文件系统(cramfs)、
基j:
QT/EmbeddedL21和Qtopia的用户图形界面以与应用程
序组成.
2.Qt的移植
2.1开发环境的建立
本文采用的开发环境是Pc机+CygWin+arm-Linux-Qt。
2.1.1Cygwin的建立
从:
//WWw.cygwin.com上下载并安装最新版本Cygwin,本文采用的是Cygwinl.5.1的版本。
需要注意的是,Cygwin的安装目录必须位于硬盘的NTFS分区,否则会影响文件的属性和权限操作。
本文安装Cygwin的路径为F:
\cygwin。
2.1.2编译器安装
下载arm-linux-gcc-3.4.1.tar.bz2至1]/usr/local下,生成的编译工具会在目录/usr/10cal/arm/3.4.i/bin下,然后修改/etc/profile文件,重新启动Cygwin就可以直接运行arm—linux~gcc。
2.1.3Ljnux的安装
从官方fttp:
//.1inux.org-F载linux安装包,本文采用的inux-2.4.18版本。
2.2安装与建立0t桌面运行环境
从官方ftp:
//ftp.trolltech.com下载以下文件:
qt—xll一2.3.2.tar.gz
qt—embedded一2.3.7.tar.bz2
tmake—1.11.tar.gzQTOPIA—free一1.7.0.tar.gz
解压这三个文件到/usr/local/gui/qt,设置环境变量:
exportTMAKEDIR=
lusr/local/gui/qt/tmake/lib/qws/cygwin—a]mrg++
exportQTDIR=
/usr/local/gui/qt/qt—X1I-2.3.2
exportQTEDIR=
/usr/local/gui/qt/qt—embedded一2.3.7
exportQPEDIR=
/usr/local/gui/qt/OTOPIA—free一1.7.0
分别编译上面的文件最后生成所需的编译器moc.ere(定义用户的信号和槽是所用)、uic.exe(Qt中的用户界面编译器)、tmaRe.exe(生成makefile文件)progen.exe(生成工程管理文件)和在开发平台上运行程序的所需的函数库。
2.3制作带0t的根文件系统(RootF.1eSystem)根文件系统是Linux系统的核心部分,包含系统使用的软件和库,以与所有用来为用户提供支持架构和用户使用的应用软件,并作为存储数据读/写结果的区域。
在Linux系统启动时,首先完成核安装与环境初始化,之后会寻找一个文件系统作为根文件系统,并
将其加载。
嵌入式系统常可以选择的根文件系统有:
ronfs、cramfs、ramfS、jffs2、ext2等。
文件系统包括以下目录:
/bin(应用程序存放目录)/sbin(存放系统管理员服务程序)/1ib(存放程序运行所需的动态库)/proc(系统状态文件目录)/dev(驱动程序存放路径)/etc(系统配置文件与用户数据存放目录)/mnt(用于设备安装的目录)/usr(用于存放用户程序和配置文件的目录)/qt(存放QTOPIA运行文件)。
使用烧写工具mkcramfs将其专成一个映像文件。
2.4在9TOPIA中增加应用程序
QTOPIA是为基于Linux的PDA、智能和其他移动设备设计的一个全面的,可以用户化的应用程序平台和用户界面。
当编写好QTOPIA应用程序源文件(在本文中的源文件为led.cppled.hmain.cpp,存放路径/home/led)安下面的命令就可以生成arm板子上跑的程序:
cd/home/led
progen—nled一0led.pro
tmakehello.pro一0makefile
make
cpled/usr/10cal/root/qt/bin
然后在/usr/local/root/qt/apps/Applications下
添力Hled.desktop(启动后可以在屏幕上显示led程序),
最后用mkcramfs烧写就可以了。
交叉编译Qt/Embedded库
当有了ARM的linux编译器后,就可以使用这个编译器进行交叉编译Qt/Embedded库的源代码,从而产生一个以ARM为目标代码的Qt/Embedded库。
具体过程如下:
(1)解压0t,Embedded
在Linux命令模式下运行如下命令:
#tarxfzqt—embedded-2.3.7.tar.gz
(2)配置Qt/Embedded的安装
#cdqt一2.3.7
#exportQrfDIR=$PWD
#exportQTEDIR=$QTDIR
#.cp,配置文件所在路径,/qconfig-local.h
/src/tools
#makeclean
#/cofigure–xplatformlinux—arm—g++一
shared—debug
—qconfiglocal—qvfb—depths4,8,16,32
#make
Qt/Embedded的安装选项有很多个,可以直接输入“”来运行配置。
Qt/Embedded的安装选项还允许自己定制一个配置文件,来有选择的编译Q忱,llbedded库,这个安装选项是“-qconfig—local”;当指定这个选顼时,Qr/Embedded库中安装过程会寻找qt一2.3.7/src/tools,qconfig—local.h这个文件来编译Qt/Embedded库。
在定制中添加了对触摸屏显示的支持。
3.linux下的Ied的设备驱动程序的实现在Linux下,设备驱动程序可以看成Linux核与外部设备之间的接口。
设备驱动程序向应用程序屏蔽了硬件实现得应用程序可以像操作普通文件一样来操作外部设备,可以使用和操作文件中一样的、标准的系统调用接口函数来完成对硬件设备的打开、关闭、读写和i/o控制操作,而驱动程序的主要任务也就是要实现这些系统调用函数。
本系统平台使用的嵌入式armLinux系统在核主要功能上与Linux操作系统没本质区别,所以驱动程序要实现的任务也一样,只要编译时使用的编译器、部分头文件和库文件等要涉与到具体处理器体系结构,这些都可以在Makefile文件中具体指定。
LED一0N.ALL=OxOf点亮所有的led数码生成窗体类的头文件和实现文件
界面文件使用uic工具产生出窗体类的头文件和实现文件,例如hell0.ui节目文件产生hello窗体类的头文件和实现文件,具体方法如下:
#cdqt一2.3.7/bin
#uic—ohello.hhello.ui
#uic—ohello.cpp—implhe1lo.hhelIo.ui
这样我们就得到hello窗体类的头文件hello.h和实现文件hello_cppo接下来根据我们要实现的具体功能,在hello.cpp文件里添加相应的代码。
3.1编写主函数main()
一个Qt/Embedded应用程序应该包含一个主函数,主函数所在的文件名是main.cpp。
主函数是应用程序执行的入口点。
3.2编辑工程文件
在工程文件中添加窗体类的头文件、实现文件和主函数交件。
QT/Embedded
QT/Embedded是著名的QT库开放商正在进行的面向
嵌入式系统的QT版本。
这个版本的主要特点是可移植性较
好,许多基于QT的XWindow程序可以非常方便地移植到嵌
入式版本。
QT/Embedded采用两种方式进行发布:
在GPL协
议下发布的free版与专门针对商业应用的commercial版本。
如果你要在商业中使用这个库,需要支付昂贵的授权费用。
Qt/Embedded是著名的Qt库开发商的Trolltech公司开
发地观向嵌入式系统的Qt版本。
因为Qt是KDE等项目使用
的GUl支持库,许多基于Qt的xwindow程序因此可以非常
方便地移植到Qt/Embedded上。
Qt/Embedded同样是Server/
client结构。
Qt/Embedded延续了Qt在X上的强大功能,在底层摒弃
了Xlib,仅采用framebuffer作为底层图形接口。
同时,将外部
输入设备抽象为keyboard和mouse输入事件,底层接口支持
键盘、GPM鼠标、触摸屏以与用户自定义的设备等。
Qt/Em—
bedded类库完全采用c++封装。
丰富的控件资源和较好的
可移植性是Qt/Embedded是为优秀的一方面。
它的类库接口
完全兼容于同版本的Qt—x11,使用X下的开发工具可以直
接开发基于Qt/Embedded的应用程序QUI界面。
与前两种GUI系统不同的是,Qt/Embedded的底层图形
引擎只能采用framebuffer。
这就注定了它是针对高端嵌入式
图形领域的应用面设计的。
但由于该库的代码追求面面俱到,
以增加它对多种硬件设备的支持,造成了其底层代码比较凌
乱、各种补丁较多的问题。
Qt/Embedded的结构也过于复杂臃肿,很难进行底层的
扩充、定制和移植。
嵌入式GuI的系统架构
1.1基于嵌入式Linux的GuI系统底层实现基础一个能够移植到多种硬件平台上的嵌入式GUI系统,应用至少抽象出两类设备:
基于图形显示设备(如VGA卡)的图
形抽象层GAL(GraphicAbstractLayer),基于输入设备(如键
盘,触摸层等)的输入抽象层IAL(InputAbstractLayer),如图1所示:
抽象层的概念类似Linux核虚拟文件系统的概念,定义了一组不依赖于任何特殊硬件的抽象接口,所有顶层的图形操作和输入处理都建立在抽象接口上。
GAL层完成系统对具体的显示硬件设备的操作,极大程度上陷蔽各种不同硬件的技术实现细节,为系统程序开发人员提供统一的图形编程
接口。
IAL层则需要实现对于各类不同输入设备的控制操作,提供统一的调用接口。
GAL层与IAL层的设计概念,可以极大程度地提高嵌入式GUI的可移植性。
而用于实现这一抽象接口的底层代码称为“图形引擎”或“输入引擎”,类似操作系统中的驱动程序。
这实际是一种面向对象的程序结构。
越)I编程接口
嵌入式GUIGAL层¨L层设备抽象层图形显示设备输入设备系统硬件
目前应用于嵌入式Linux系统中比较成熟,功能也比较强大的GUI系统底层支持库有SVGAlib、LibGGI、Xwindo、Framebuffer等。
1.2底层图形发生引擎的介绍
Linux图形领域中常见的基础设施,是因为这些系统(或者函数库)一般作为其他高级图形或者图形应用程序的基本函数库。
这些系统(或者函数库)主要包括:
sVGAlib、LibGGI、windo、Framebuffer等,详述如下:
1.2.1LibGGI
LibGGI试图建立一个一般性的图形接口,而这个抽象接口连同样关的输入(鼠标、键盘、游戏杆等)抽象接口一起,可以方便地运行在XWindows、SVGALib、FrameBuffer等等之上。
建立在“bGGI之上的应用程序,不经重新编译,就可以在上述这些底层图形接口上运行。
但是现在LibGGI的发展几乎停滞。
1.2.2SVGAlib
SVGAlibj是Linux系统中最早出现的非X图形支持库。
这个库从最初对标准VGA兼容芯片的支持开始,一直发展到对老式SVGA芯片的支持对与对现今流行的高级视频芯片支持。
它为用户提供了在控制台上进行图形编程的接口,使用户可以在PC兼容系统上方便地获得支持。
但该系统有如下不足:
1)接口杂乱。
SVGALib从初的Vgalib发展而来,保留下了老系统许多接口,而些接口却不能良好地迎合新显示芯片的图形能力。
2)未能较好地隐藏硬件细节。
许多操作不能自动使用显示芯片的加速能力支持。
3)可移植性差。
SVGALib目前只能运行在x86平台上,对其他平台的支持较差。
4)发展缓慢,sVGALib作为一个老的图形支持库,目前的应用围越来越尤其在Linux核增加了FrameBuffer驱动支持之后,有逐渐被其他图形库替代的迹象。
5)对应用的支持能力较差。
SVGALib作为一个图形库对高级图形功能的支持,比如直线和曲线等,不能令人满意。
1.2.3FrameBufferFrameBuffer是出现在
2.2xx核中的一种驱动程序接口,将显示设备抽象为帧缓冲区.可以将它看成显示存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写
操作,而写操作可以立即反应在屏幕上.FrameBuffer设备还提供了若干ioctl命令,通过这些命令,可以获得显示设备一些固定信息(如显示存大小)与显示模式相关的可变信息(如分辨率、象素结构、每扫描线的字节宽度)、当前核支持的加速显示卡的类型(通过固定信息得到,这种类型通常是和特
定显示芯片相关的),以与伪彩色模式下的调色信息等。
但FrameBuffer只是一个提供显示存和显示芯片寄存器从物理存映射到进程地址空间中的设备。
所以,对于应用程序而言,如果希望在FrameBuffer之上进行图形编程,还需
要完成其他许多工作。
2
现有嵌入式GUI的叙述
在Linux之上进行(实时)嵌入式系统开发的厂商,一般选择如下几种GUI系统:
紧缩的XWindow系统、MiniGUI、MicroWindows、QT/Embedded等。
2.1紧缩的xWindow系统
XWindow是Linux以与其他类UNIX系统的标准GUI.
xwindow系统采用标准的客户/服务器体系结构,具有可扩展性好、可移植性好等优点;但该系统的庞大、累赘和低效率。
为了获得应用程序的可移植性,许多厂家都试图通过对XWindow系统的紧缩开发,使之能够在嵌入式系统上运行。
国
外已经开发出了大小约为800K的X服务器。
这对西方国家来说基本能够满足嵌入式系统的需求了。
但该系统的源代码尚不开放,从而很难进行本地化开发。
2.2MicrOWindOws
MicroWindows是一个开放源码的项目,目前由美国一家公司在主持开发.该项目的开发非常活跃,国也有人参与了其中的开发,并编写了GB2312等字符集的支持.该项目的主要特色在于提供了比较完善的图形功能,包括一些高级的功
能,比如Alpha混合,三维支持,TrueType字体支持等.但作为一个窗口系统,该项目提供的窗口处理功能还需要进一步完善,比如控件或构件的实现还很不完备,键盘和鼠标等驱动还很不完善.
2.3QT/Embedded
QT/Embedded是著名的QT库开放商正在进行的面向嵌入式系统的QT版本。
这个版本的主要特点是可移植性较好,许多基于QT的XWindow程序可以非常方便地移植到嵌入式版本。
QT/Embedded采用两种方式进行发布:
在GPL协议下发布的free版与专门针对商业应用的commercial版本。
如果你要在商业中使用这个库,需要支付昂贵的授权费用。
2.4MiniGUI简介
MiniGUI是一种面向嵌入式系统或者实时系统的图形用户界面支持系统。
它主要运行于Linux控制台,实际也可以运行一种具有POSIX线程支持的POSIX兼容系统上。
MiniGUI同时也是国最早出现的几个自由软件项目之一。
MiniGUI为了得到最大的效率,采用基于线程的多窗口机制。
这种结构对数控系统这样任务单一、实时要求高的系统来讲,是最佳解决方案。
但如果系统中运行的任务并不是单一的,就有可能因为一个任务的失效而影响其他任务。
因此,提高GuI系统的健
壮性就成为另一个亟待解决的问题。
3每个系统设计优点与特色
3.1三种嵌入式GUI系统的分析与比较
3.1-1Microwindows
Wicrowindows是一个典型的基于Server/Client体系结构的GUI系统,基本分为
三层,如图2所示.最底去是面向图形显示和键盘、鼠标或触摸屏的驱动程序;
中间层提供底层硬件的抽象接口,并进行窗口管理}最高层分别提供兼容于x
Window和ECMAAPIW(Win32子集)的API。
Nallo—XAPIECMAAPIW
窗口管理
硬件设备层
显示硬件输入设备
其中使用Nano—x接口听API与X接口兼容,但是该接口没有提供窗口管理,如窗口移动和窗口剪切等高级功能,系统中需要首先启动nano—X的Server程序nanoxserver和窗口管理程序nanowm.用户程序连接nano—X的Server获得自
身的窗口绘制操作.使用ECMAAPIW编写的应用程序无需nanox—server和nanowm,可直接运行。
Microwindows提供了相对完善的图形功能和一些高级
的特性,如Alpha混合、三维支持和TrueType字体支持.该统为了提高运行速度,也改进了基于socket套接字的X实现模式,采用了基于消息机制的server/Client传输机制.Mi—crowindows也有一些通用的窗口控件,但其图形引擎存在许多问题,具体如下:
无任何硬件加速能力,
*图形引擎中存在许多低效算法,如在圆弧函数的逐点
判断剪切的问题。
2003年Microwindows推出版本O.90后,该项目的发展
开始陷于停滞状态。
三种嵌入式GUI的比较与分析
比较上述几个嵌入式GUI系统,可以知道目前比较成熟
同时得到最多开发人员认可的有QT/Embedded、MiniGUI、
MicroWimdows等。
MiniGUI和Microwimdows均为自由软
件,前者遵循LGPL条款,后者遵循MPL条款。
这两个系统的
技术路线也有所不同。
MiniGUI的策略是首先建立在比较成
熟的图形引擎之上,比如SVGALib和LibGGI,开发的重点在
于窗口系统、图形接口之上;MicroWimdows目前的开发重点
则在底层的图形引擎之上,窗口系统和图形接口方面的功能
比较欠缺。
例如MiniGUI有一套用来支持多字符集和多编码
的函数接口,可以支持各种常见的字符集,包括GB、BIG5、U—
NICODE等,而MicroWimdows在多字符的支持上尚没有统
一接口。
QT/Embedded系统则是针对高性能手持设备和移动
设备设计,对系统的各种要素要求很高,也是目前商业化应用
最多的一款商业收费嵌入式GUI系统。
1inux下的led的设备驱动程序的实现
在Linux下,设备驱动程序可以看成Linux核与外部设备之间的接口。
设备驱动程序向应用程序屏蔽了硬件实现了的细节,使得应用程序可以像操作普通文件一样来操作外部设备,可以使用和操作文件中一样的、标准的系统调用接口函数来完成对硬件设备的打开、关闭、读写和i/o控制操作,而驱动程序的主要任务也就是要实现这些系统调用函数。
本系统平台使用的嵌入式armLinux系统在核主要功能上与Linux操作系统没本质区别,所以驱动程序要实现的任务也一样,只要编译时使用的编译器、部分头文件和库文件等要涉与到具体处理器体系结构,这些都可以在Makefile文件中具体指定。
LED一0N.ALL=OxOf点亮所有的led数码灯
LED—OFF—ALL=Ox00熄灭所有的led数码灯,其中,LEDl、LED2、LED3、LED4分别接$3C2410的r/oC3GPF4、GPF5、GPF6、GPF7可以通过读写GPFI/O来控制L叻数码灯的状态。
外部硬件电路图如图3所示。
圈3LED幻硬件电路圈对于led数码灯,其驱动程序中需要提供基本的I/O
操作接口函数open、read、write、close的实现,本文中的led数码灯的亮灭是通过write函数来实现的。
3.2应用程序的实现
为了控制led数码灯需要在应用程序中加载一下的
头文件:
#include
#include
#include
本文中设计的qt[3J程序通过四个led数码灯来模拟开发板上的led数码灯的显示模式,非常赢观的实现了led数码灯的显示过程,可以以跑马灯的形式显示,还可以单个控制数码灯的显示控制led数码灯程序实现过程,打开led设备,led在
系统中对应的设备文件为/dev/led/O,采用系统调用函数led—fd=open(。
/dev/led/O。
,oRDwR),led—fd是设备打开后返回的文件描述符(打开错误
返回-I),以后的系统调用函数就可使用它来对设备文件进行操作了。
接着,利用write(1ed-fd,&val,1)函数向GPIO写控制字。
(3)uic(userinterfacecompiler)
uic是从xML文件生成代码的用户界面编译器,用来将file.ui文件生成file.h和6le.cpp文件(命令如:
uic—ofile.hnle.uiuic_0file.cppfile.ui),但生成的这两个文件不是标准的纯C++代码,通常称为Qt的c++扩展,因为Qt的对象间运用了信号和插槽的通信机制,在文件中用Q_oBjECT宏来标识。
(4)moc(元对象编译器)
moc用来解析一个c++文件中的类声明并且生成初始化对象的c++代码,moc在读取c++源文件,如果发现其中一个或多个类的声明中含有Q_0BJEcT宏,就给出这个使用Q—OBJECT宏的类生成另外一个包含元对象代码的c++元文件;元对象代码对信号插槽机制、运行时的类型信息和动态属性系统是需要的。
2.3Qt/Embedded支持触摸屏显示
Qr/Embedded2.x系列中,触摸屏设备和键盘设备需要根据具体的驱动程序接口中Qt/ErIlbedded中设备实现对应的设备操作类。
其中
对应于鼠标类设备的实现位于”以erne]/qwsnlouse-qws.cpp中。
在文件qwsmouse_qws.cpp中添加对触摸
屏的支持。
具体修改如下:
(
1)定义和Linux核文件driver/input,tsdev.c中数据结构t8一event相一致的TS_EvENT数据结构,定义如下:
#ifdefined(Q711_QwSjPAQ)
typedefstmct{
shortpressure;
shortx:
shorty;
shonmiHi8ec8:
JrI's—EVENT;
(2)修改校准文件的位置
在函数voidOCalibratedM0useHandleE:
wr