您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 基于Qt的嵌入式LinuxGUI研究与实现
Qt/E的嵌入式LinuxGUI研究与实现摘要:嵌入式GUI(GraphicalUserInterface)为嵌入式系统提供了一种应用于特殊场合的人机交互接口(Man-MachineInterface)。由于嵌入式系统本身的硬件资源有限,要求嵌入式GUI具有高度可移植性和可裁剪性,以适应不同的硬件条件和使用需求。本文首先介绍了嵌入式LinuxGUI目前的发展状况及各自的特点,然后针对目前主流的嵌入式GUI系统---Qt/Embedded,阐述其图形引擎的实现。最后,结合三星公司S3C2410的开发板,介绍了嵌入式GUI系统在具体平台上的实现和应用。关键字:ARM9Linux交叉编译嵌入式GUIQtQt/EmbeddedQtopiaFrameBufferSignals/SlotsResearchandRealizationofEmbeddedLinuxGUIbasedonQt/EmbeddedTangWei,LiQiang(CollegeofComputerScience,HangZhouDianZiUniversity,HangZhou,310018,China)Abstract:TheEmbeddedGUI(GraphicalUserInterface)providesaMan-MachineInterfaceusedinspecialoccasionsforEmbeddedSystems.Sincetheembeddedsystemitselflimitedhardwareresources,whoserequirementsofembeddedGUIishighlyportableandcanbecutof,soastoadapttotheconditionsandusedifferenthardwarerequirements.ThisarticlefirstlyintroducesthecurrentdevelopmentofembeddedLinuxGUIandtheirowncharacteristics,andthenforthecurrentmainstreamembeddedGUIsystem--Qt/Embedded,describedtherealizationofitsgraphicsengine.What’smore,itCombinedwithSamsungS3C2410developmentboard,introducedtheachievingandapplicationonaspecificplatformforembeddedGUIsystem.Keywords:ARM9LinuxCross-CompilingEmbeddedGUIQtQt/EmbeddedQtopiaFrameBufferSignal/Slots1引言由于嵌入式系统的特殊性,它一般不会建立在庞大的操作系统以及GUI之上,如Windows或XWindows,它对实时性的要求非常高,对GUI的要求更高。本文首先介绍了目前嵌入式GUI的发展状况,接着简要说明嵌入式LinuxGUI的硬件和软件环境,通过Qt/Embedded和Qtopia的移植,实现嵌入式环境下的GUI。2嵌入式LinuxGUI概述目前,以Linux为操作系统的嵌入式系统中,常用的GUI有Qt/Embedded、MicroWindows、MiniGUI及OpenGUI等。2.1Qt/EmbeddedQt/Embedded是挪威的奇趣科技(TrollTech)公司(注:该公司已于2008年2月被诺基亚公司以1.53亿美元收购)推出的一个跨平台出的C++图形用户开发界面库。它的主要特点是界面美观、色彩配比好,使用与Qt/Windows和Qt/X11完全一样的API接口,许多基于Qt的程序可以非常方便的移植到嵌入式系统中;同时,它具有丰富的模块,用户可以根据需要选择它的特性集合。2.2MicroWindowsMicroWindows是由美国CenturySoftware公司开发的开放源码的嵌入式GUI项目。它不需要其他图形系统的支持,可以充分利用Linux提供的FrameBuffer机制来进行图形显示。同时在底层提供了对多种芯片的支持,基本上用C语言实现,因此移植性较好。2.3MiniGUI当然,我们国家的MiniGUI也是一个比较成熟的图形用户界面系统,面向基于Linux的实时嵌入式系统,使用现有成熟的图形引擎(SV2GALib/LibGGI),采用类似Win32的线程机制,集成了多字体和多字符集,支持硬件加速能力,充分利用显示内存。2.4OpenGUIOpenGUI在Linux上存在很长时间了。这个库是用C++编写,提供C++接口。OpenGUI支持鼠标和键盘事件,在Linux上与Qt/Embedded一样,都是基于FrameBuffer实现绘图。但OpenGUI基于汇编实现内核并利用MMX指令进行了优化,因此运行速度快,从而影响了它的可移植性。3嵌入式LinuxGUI软硬件环境3.1硬件环境本文的嵌入式系统是针对三星公司的S3C2410,它集成ARM920T内核,采用0.18微米CMOS工艺,并在ARM核基础上集成了丰富的外围接口,如图1(来自S3C2410数据手册)。图1S3C2410BlockDiagram主要功能:1个MMU(实现Linux内核的虚拟内存管理)、4个DMA通道、1个LCD控制器(结合DMA实现Linux内核的mmap()系统调用)、3个UART、2个SPI、2个USB主设备端口、1个看门狗、4个PWM定时器、117个I/O端口、24个外部中断源、8路10位ADC以及触摸屏接口、外部扩展存储器控制器(达1G,足够Linux内核与上层软件使用)等[1]。外围器件的扩展和电路板的设计主要由硬件工程师完成,不是本文的主要讨论范围,在此只是阐述嵌入式LinuxGUI的硬件环境。3.2软件环境在完成开发板的设计制作之后,在其上运行GUI程序之前,必须要有一定的底层软件环境。如下:1)采用宿主机/目标机的开发模式,在宿主机上搭建交叉编译环境[2]2)ViVi(Linux的引导程序)的移植ViVi是三星公司专门为s3c2410加载Linux内核。3)Linux内核移植和文件系统的制作内核的移植比较复杂,这也是采用Linux的繁琐之处。移植采用2.4.x的内核源码,针对相应的硬件平台(S3C2410),修改部分体系结构相关的源码,主要是汇编语言部分,添加相应的驱动(FB“帧缓冲”驱动程序、鼠标、键盘类设备驱动程序等),再裁剪内核,去掉无关选项,将配置好的内核交叉编译后,生成映像文件,烧写到开发板的flash中。文件系统采用jffs2,通过busybox制作Linux需要的命令,建立基本目录和设备文件等,最后通过mkfs.jffs2工具生成映像文件,烧写到flash中[3]。4Qt/Embedded图形引擎的实现Qt/Embedded图形引擎基于FrameBuffer,FrameBuffer是在Linux2.2版本以后推出的标准显示设备驱动接口,采用mmap()系统调用,可将它的显示缓存映射为可连续访问的一段内存指针[4]。FrameBuffer的驱动包括两个方面:一是LCD的初始化(ARM9中集成了LCD控制模块)。二是对画面缓冲区的读写,如read、write和lseek的系统调用。而将画面缓冲区的内容输出到LCD上,则由硬件自动完成。DMA通道和画面缓冲区设置完成后,DMA开始正常工作,并将缓冲区的内容不断发送到LCD上。这个过程是基于DMA对LCD的不断刷性。基于该特性,FrameBuffer驱动程序必须将画面缓冲区的存储空间重新映射到一个不加高缓存和写缓存的虚拟地址空间中,这样才能保证应用程序通过mmap()系统调用将该缓存映射到用户空间后,该画面缓存的写操作能够实时地体现到LCD上。Qt/Embedded中,Qscreen类为抽象出的底层显示设备基类,其中声明了对于显示设备的基本描述和操作方式。另一个重要的基类是QGfx类,它抽象出对于显示设备的具体操作接口,如选择画线、画矩形和alpha操作等。这两个基类是Qt/Embedded图形引擎的底层抽象。其中具体函数基本都是虚函数,Qt/Embedded对具体的显示设备,如LinuxFrameBuffer、QtVirtualFrameBuffer做的抽象接口类全都由此继承并重载基类中的虚函数来实现。图2给出了Qt/Embedded中图形引擎实现的结构框图。Qt/Embedded图2Qt/Embedded图形引擎的结构框图用QLinuxFbScreen来处理FB设备,针对具体显示硬件(如Mach卡和Voodoo卡)的加速特性,Qt/Embedded从QLinuxFbScreen和图形设备环境模板类QGfxRaster类继承出子类,并针对相应硬件重载相关虚函数。5Qt/Embedded和Qtopia的移植5.1在宿主机上搭建Qt/Embedded环境本过程需要qt-x11.2.3.2.tar.gz、e2fsprogs-1.37.tar.gz、qt-embedded-2.3.7.tar.gz、tmake-1.13.tar.gz、qtopia-free-1.7.0.tar.gz等软件包。qt-x11.2.3.2.tar.gz提供uic、qvfb、designer等开发工具;e2fsprogs-1.37.tar.gz提供uuid头文件和libuuid.a;qt-Embedded-2.3.7.tar.gz主要提供libqte.so;tmake-1.13.tar.gz生成和管理Makefile;qtopia-free-1.7.0.tar.gz实现应用程序的桌面。由于Qt/Embedded和Qt/X11有一样的API,所以我们在开发嵌入式环境的应用程序时,可以先在宿主机上开发,利用强大的qvfb工具模拟嵌入式的GUI运行环境,通过调试后,再经过重新编译,移植到开发板上,这样就不用每次都刷性开发板上的内容,大大提高了开发GUI的速度。进入宿主机kde的图形化界面,打开终端,进入root用户模式。将上述软件包拷贝到自己的目录下的qte目录,用vi编辑器建立build安装脚本(设置QTDIR、QPEDIR、TMAKEDIR、TMAKEPATH、PATH等环境变量,通过./configure–help命令分别配置各个软件包的Makefile文件)。有几步需要注意,cp-r../e2fsprogs-1.37/lib/uuid./qtopia/include和cp../e2fsprogs-1.37/lib/libuuid.a./qtopia/lib帮助Qtopia建立时所需要的头文件库文件,如果不加,在编译qtopia时会找不到libuuid.a,编译出错;在编译qt-embedded时,根据./configure–help配置qt/embedded库,比如加入对jpeg、gif的选项,当然,如果选择它们,将增强应用程序的功能,但也增加了qt/embedded库的大小。运行build脚本./build,根据宿主机的处理速度不同,该安装脚本运行时间会有长短,本人用1G内存的宿主机,大概四十几分钟即可完成。安装完成之后,就可以开发嵌入式GUI程序了,先来测试一下,在终端下输入qvfb[5]&,让它在后台运行,然后执行qpe–qws,即可看到qtopia的运行界面,如图3所示。图3qtopia的运行界面5.2Qt/Embedded编程核心在宿主机上建立好开发环境后,就可以在上面开发应用程序了,开发后的程序先在qvfb上运行调试,通过之后,再移植到开发板上,方便快捷。Qt/Embedded软件体系结构如图4所示。该图比较了Qt/Embedded和X11的体系结构。Qt/Embedded摒弃了Xlib库,采用帧缓冲(FrameBuffer)作为底层图形接口。同时将外部输入设备抽象为键盘和鼠标事件。Qt/Embedded底层
本文标题:基于Qt的嵌入式LinuxGUI研究与实现
链接地址:https://www.777doc.com/doc-2571854 .html