嵌入式Linux下的图形化窗口QT的移植与研究.docx

上传人:h**** 文档编号:137679 上传时间:2018-07-10 格式:DOCX 页数:12 大小:43.22KB
下载 相关 举报
嵌入式Linux下的图形化窗口QT的移植与研究.docx_第1页
第1页 / 共12页
嵌入式Linux下的图形化窗口QT的移植与研究.docx_第2页
第2页 / 共12页
嵌入式Linux下的图形化窗口QT的移植与研究.docx_第3页
第3页 / 共12页
嵌入式Linux下的图形化窗口QT的移植与研究.docx_第4页
第4页 / 共12页
嵌入式Linux下的图形化窗口QT的移植与研究.docx_第5页
第5页 / 共12页
点击查看更多>>
资源描述

1、 嵌 入 式 Linux 课 程 设 计 课题: 嵌入式 Linux 下的图形化窗口 QT 的移植与研究 姓名: 专业班级:电子信息工程 2 班 学号: 指导老师: 一 前言 随着嵌入式的技术的飞速发展,嵌入式已经得到了越来越广泛的应用。应用领域涉及无线、网络、消费娱乐、影像、汽车电子、安全应用及存储装置。如今越来越多的嵌入式需要一个图形用户界面 (GUI),它是计算机与其使用者之间的对话接口,是嵌入式的重要组成部分。本文重要针对嵌入式开发平台中 Qt移植的过程进行详细的分析和研究,并且通过一个控制嵌入式开发平台的 led数 码灯的 Qt应用程序实例来说明移植和实现的过程。 1系统平台组成 根

2、据设计需要,本文目的是实现一个具有图形接口 界面的嵌入式显示终端,改系统使用嵌入式设计技术。 硬件上,采用基于 Samsung$3C24101CpU的目标板;在 软件上,选择嵌入式 Linux为操作系统。整个系统软件由 引导程序 (ViVi公司的 boot loader)、设备驱动 (包括帧缓 存 frame buffer)、嵌入式 Linux内核、文件系统 (cramfs)、 基 j: QT Embedded L21和 Qtopia的用户图形界面以及应用程 序组成 . 2 Qt的移植 2 1开发环境的建立 本文采用的开发环境是 Pc机 +CygWin+arm-Linux-Qt。 2 1 1

3、Cygwin的建立 从网站 http: 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 l inux gcc。 2

4、1 3 Lj nux的安装 从官方网站 fttp: www 1inux org-F载 linux安装包,本文采用的 inux-2 4 18版本。 2 2安装与建立 0t桌面运行环境 从官方网站 ftp: ftp trolltech com 下载以下文件: qt xl l一 2 3 2 tar gz qt embedded一 2 3 7 tar bz2 tmake 1 1 1 tar gz QTOPIA free一 1 7 0 tar gz 解压这三个文件到 usr local gui qt,设置环境变量: export TMAKEDIR= lusr local gui qt tmake lib

5、 qws cygwin amrg+ export QTDIR= usr local gui qt qt X1 I-2 3 2 export QTEDIR= usr local gui qt qt embedded一 2 3 7 export QPEDIR= usr local gui qt OTOPIA free一 1 7 0 分别编译上面的文件最后生成所需的编译器 moc ere(定义用户的信号和槽是所用 )、 uic exe(Qt中的用户界面编译器 )、 tmaRe exe(生成 makefile文件 )progen exe(生成工程管理文件 )和在开发平台上运行程序的所需的函数库。 2

6、3制作带 0t的根文件系统 (Root F 1e System)根文件系统是 Linux系统的核心部分,包含系统使用的软件和库,以及所有用来为用户提供支持架构和用户使用的应用软件,并作为存储数据读写结果的区域。在 Linux系统启动时,首先完成内核安装及环境初始化,之后会寻找一个文件系统作为根文件系统,并 将其加载。嵌入式系统中通常可以选择的根文件系统有: ronfs、 cramfs、 ramfS、jffs2、 ext2等。 文件系统包括以下目录: bin(应用程序存放目录 ) sbin(存放系统管理员服务程序 ) 1ib(存放程序运行所需的动态库 ) proc(系统状态文件目录 ) dev(

7、驱动程序存放路径 ) etc(系统配置文件及用户数据存放目录 ) mnt(用于设备安装的目录 ) usr(用于存放用户程序和配置文件的目录 ) qt(存放 QTOPIA运行文件 )。使用烧写工具 mkcramfs将其专成一个映像文件。 2 4在 9TOPIA中增加应用程序 QTOPIA是为基于 Linux的 PDA、智能电话和其他移动设备设计的一个全面的,可以用户化的应用程序平台和用户界面。当编写好 QTOPIA应用程序源文件 (在本文中的源文件为 led cpp led h main cpp,存放路径 home led)安下面的命令就可以生成 arm板子上跑的程序: cd home l ed

8、 progen n led一 0 led pro tmake hello pro一 0 makefi le make cp led 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)解

9、压 0t, Embedded 在 Linux命令模式下运行如下命令: #tar xfz qt embedded-2 3 7 tar gz (2)配置 Qt/Embedded的安装 #cd qt一 2 3 7 #export QrfDIR=$PWD #exportQTEDIR=$QTDIR # cp, 配置 文件所在路径, /qconfig-local h /src/tools #make clean #/cofigure xplatform linux arm g+ 一 shared debug qconfig local qvfb depths 4, 8, 16, 32 #make Qt/E

10、mbedded的安装选项有很多个,可以直接输入“”来运行配置。 Qt Embedded的安装选项还允许自己定制一个配置文件,来有选择的编译 Q忱, llbedded库,这个安装选项是“ -qconfig local”;当指定这个选顼时, Qr/Embedded库中安装过程会寻找 qt一 2 3 7 src/tools, qconfig local h这个文件来编译链接 Qt/Embedded库。在定制中添加了对触摸屏显示的支持。 3 linux下的 I ed的设备驱动程序的实现在 Linux下,设备驱动程序可以看成Linux内核与外部设备之间的接口。设备驱动程序向应用程序屏蔽了硬件 实现 得应

11、用程序可以像操作普通文件一样来操作外部设备,可以使用和操作文件中相同的、标准的系统调用接口函数来完成对硬件设备的打开、关闭、读写和 i o控制操作,而驱动程序的主要任务也就是要实现这些系统调用函数。本系统平台使用的嵌入式 armLinux系统在内核主要功能上与 Linux操作系统没本质区别,所以驱动程序要实现的任务也一样,只要编译时使用的编译器、部分头文件和库文件等要涉及到具体处理器 体系结构,这些都可以在 Makefile文件中具体指定。 LED一 0N ALL=OxOf点亮所有的 led数码 生成窗体类的头文件和实现文件 界面文件使用 uic工具产生出窗体类的头文件和实现文件,例如 hel

12、l0 ui节目文件产生 hello窗体类的头文件和实现文件,具体方法如下: #cd qt一 2 3 7 bin #uic o hello h hello ui #uic o hello cpp impl he1lo h helIo ui 这样我们就得到 hello窗体类的头文件 hello h和实现文件 hello_cppo接下来根据我们要实现的具体功能,在 hello cpp文件里添加相应的代码。 3 1编写主函数 main() 一个 Qt Embedded应用程序应该包含一个主函数,主函数所在的文件名是main cpp。主函数是应用程序执行的入口点。 3 2编辑工程文件 在工程文件中添加窗

13、体类的头文件、实现文件和主函数交件。 QT Embedded QT Embedded是著名的 QT库开放商正在进行的面向 嵌入式系统的 QT版本。这个版本的主要特点是可移植性较 好,许多基于 QT的 X Window程序可以非常方便地移植到嵌 入式版本。 QT Embedded采用两种方式进行发布:在 GPL协 议下发布的 free版与专门针对商业应用的 commercial版本。 如果你要在商业中使用这个库,需要支付昂贵的授权费用。 Qt Embedded是著名的 Qt库开发商的 Trolltech公司开 发地观向嵌入式系统的 Qt版本。因为 Qt是 KDE等项目使用 的 GUl支持库,许多

14、基于 Qt的 x window程序因此可以非常 方便地移植到 Qt Embedded上。 Qt Embedded同样是 Server client结构。 Qt Embedded延续了 Qt在 X上的强大功能,在底层摒弃 了 X lib,仅采用 framebuffer作为底层图形接口。同时,将外部 输入设备抽象为 keyboard和 mouse输入事件,底层接口支持 键盘、 GPM鼠标、触摸屏以及用户自定义的设备等。 Qt Em bedded类库完全采用 c+封装。丰富的控件资源和较好的 可移植性是 Qt Embedded是为优秀的一方面。它的类库接口 完全兼容于同版本的 Qt x11,使用 X

15、下的开发工具可以直 接开发基于 Qt Embedded的应用程序 QUI界面。 与前两种 GUI系统不同的是, Qt Embedded的底层图形 引擎只能采用 framebuffer。这就注定了它是针对高端嵌入式 图形领域的应用面设计的。但由于该库的代码追求面面俱到, 以增加它对多种硬件设备的支持,造成了其底层代码比较凌 乱、各种补丁较多的问题。 Qt Embedded的结构也过于复杂臃肿,很难进行底层的 扩充、定制和移植。 嵌入式 GuI的系统架构 1 1基于嵌入式 Linux的 GuI系统底层实现基础一个能够移植到多种硬件平台上的嵌入式 GUI系统,应用至少抽象出两类设备:基于图形显示设备

16、 (如 VGA卡 )的图 形抽象层 GAL(Graphic Abstract Layer),基于输入设备 (如键 盘,触摸层等 )的输入抽象层 IAL(Input Abstract Layer),如图 1所示: 抽象层的概念类似 Linux内核虚拟文件系统的概念,定义了一组不依赖于任何特殊硬件的抽象接口,所有顶层的图形操作和输入处理都建立在抽象接口上。 GAL层完成系统对具体的显示硬件设备的操作,极大程度上陷蔽各种不同硬件的技术实现细节,为系统程序开发人员提供统一的图形编程 接口。 IAL层则需要实现对于各类不同输入设备的控制操作,提供统一的调用接口。 GAL层与 IAL层的设计概念,可以极大

17、程度地提高嵌入式 GUI的可移植性。而用于实现这一抽象接口的底层代码称为“图形引擎”或“输入引擎”,类似操作系统中的驱动程序。这实际是一种面向对象的程序结构。越 )I编程接口 嵌入式 GUIGAL层 L层设备抽象层图形显示设备输入设备系统硬件 目前应用于嵌入式 Linux系统中比较成熟,功能也比较强大的 GUI系统底层支持库有 SVGAlib、 LibGGI、 Xwindo、 Frame buffer等。 1 2底层图形发生引擎的介绍 Linux图形领域中常见的基础设施,是因为这些系统 (或者函数库 )一般作为其他高级图形或者图形应用程序的基本函数库。这些系统 (或者函数库 )主要包括:sVG

18、Alib、 LibGGI、 windo、 Frame buffer等,详述如下: 1 2 1 LibGGI LibGGI试图建立一个一般性的图形接口,而这个抽象接口连同样关的输入 (鼠标、键盘、游戏杆等 )抽象接口一起,可以方便地运行在 X Windows、 SVGALib、FrameBuffer等等之上。建立在“ bGGI之上的应用程序,不经重新 编译,就可以在上述这些底层图形接口上运行。但是现在 LibGGI的发展几乎停滞。 1 2 2 SVGAlib SVGAlibj是 Linux系统中最早出现的非 X图形支持库。这个库从最初对标准 VGA兼容芯片的支持开始,一直发展到对老式 SVGA芯

19、片的支持对及对现今流行的高级视频芯片支持。它为用户提供了在控制台上进行图形编程的接口,使用户可以在 PC兼容系统上方便地获得支持。但该系统有如下不足: 1)接口杂乱。 SVGALib从初的 Vgalib发展而来,保留下了老系统许多接口,而些接口却不能良好地迎合新显示芯片的图形能力。 2)未能较好地隐藏硬件细节。许多操作不能自动使用显示芯片的加速能力支持。 3)可移植性差。 SVGALib目前只能运行在 x86平台上,对其他平台的支持较差。 4)发展缓慢, sVGALib作为一个老的图形支持库,目前的应用范围越来越尤其在Linux内核增加了 Frame Buffer驱动支持之后,有逐渐被其他图形

20、库替代的迹象。 5)对应用的支持能力较差。 SVGALib作为一个图形库对高级图形功能的支持,比如直线和曲线等,不能令人满意 。 1 2 3 Frame BufferFrame Buffer是出现在 2 2xx内核中的一种驱动程序接口,将显示设备抽象为帧缓冲区可以将它看成显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写 操作,而写操作可以立即反应在屏幕上 Frame Buffer设备还提供了若干 ioctl命令,通过这些命令,可以获得显示设备一些固定信息 (如显示内存大小 )与显示模式相关的可变信息 (如分辨率、象素结构、每扫描线的字节宽度 )、当前内核 支持的加速显示卡的类

21、型 (通过固定信息得到,这种类型通常是和特 定显示 芯片相关的 ),以及伪彩色模式下的调色信息等。但 Frame Buffer只是一个提供显示内存和显示芯片寄存器从物理内存映射到进程地址空间中的设备。所以,对于应用程序而言,如果希望在 Frame Buffer之上进行图形编程,还需 要完成其他许多工作。 2 现有嵌入式 GUI的叙述 在 Linux之上进行 (实时 )嵌入式系统开发的厂商,一般选择如下几种 GUI系统:紧缩的 X Window系统、 MiniGUI、 MicroWindows、 QT Embedded等。 2 1紧缩的 x Window系统 X Window是 Linux以及其

22、他类 UNIX系统的标准 GUI x window系统采用标准的客户服务器体系结构,具有可扩展性好、可移植性好等优点;但该系统的庞大、累赘和低效率。为了获得应用程序的可移植性,许多厂家都试图通过对 XWindow系统的紧缩开发,使之能够在嵌入式系统上运行。国 外已经开发出了大小约为 800K的 X服务器。这对西方国家来说基本能够满足嵌入式系统的需求了。但该系统的源代码尚不开放,从而很难进行本地化开发。 2 2 MicrOWindOws MicroWindows是一个开放源码的项目,目前由美国一家公 司在主持开发该项目的开发非常活跃,国内也有人参与了其中的开发,并编写了 GB2312等字符集的支

23、持该项目的主要特色在于提供了比较完善的图形功能,包括一些高级的功 能,比如 Alpha混合,三维支持, TrueType字体支持等但作为一个窗口系统,该项目提供的窗口处理功能还需要进一步完善,比如控件或构件的实现还很不完备,键盘和鼠标等驱动还很不完善 2 3 QT Embedded QT Embedded是著名的 QT库开放商正在进行的面向嵌入式系统的 QT版本。这个版本的主要特点是可移植性较好,许多基于 QT的 X Window程序可以非常方便地移植到嵌 入 式版本。 QT Embedded采用两种方式进行发布:在 GPL协议下发布的 free版与专门针对商业应用的 commercial版本

24、。如果你要在商业中使用这个库,需要支付昂贵的授权费用。 2 4 MiniGUI简介 MiniGUI是一种面向嵌入式系统或者实时系统的图形用户界面支持系统。它主要运行于 Linux控制台,实际也可以运行一种具有 POSIX线程支持的 POSIX兼容系统上。 MiniGUI同时也是国内最早出现的几个自由软件项目之一。 MiniGUI为了得到最大的效率,采 用基于线程的多窗口机制。这种结构对数控系统这样任务单一、实时要求高的系统来讲,是最佳解决方案。但如果系统中运行的任务并不是单一的,就有可能因为一个任务的失效而影响其他任务。因此,提高 GuI系统的健 壮性就成为另一个亟待解决的问题。 3每个系统设

25、计优点及特色 3 1 三种嵌入式 GUI系统的分析与比较 3 1-1 Microwindows Wicrowindows是一个典型的基于 Server Client体系结构的 GUI系统,基本分为 三层,如图 2所示最底去是面向图形显示和键盘、鼠标或触摸屏的驱动程序; 中间层提供底层硬件的抽象接口,并进行窗口管理 最高层分别提供兼容于 x Window和 ECMA APIW(Win32子集 )的 API。 Nallo X API ECMA APIW 窗口管理 硬件设备层 显示硬件输入设备 其中使用 Nano x接口听 API与 X接口兼容,但是该接口没有提供窗口管理,如窗口移动和窗口剪切等高级

26、功能,系统中需要首先启动 nano X的 Server程序nanoxserver和窗口管理程序 nanowm用户程序连接 nano X的 Server获得自 身的窗口绘制操作使用 ECMAAPIW编写的应用程序无需 nanox server和 nanowm,可直接运行。 Microwindows提供了相对完善的图形功能和一些高级 的特性,如 Alpha混合、三维支持和 TrueType字体支持该统为了提高运行速度,也改进了基于 socket套接字的 X实现模式,采用了基于消息机制的 serverClient传输机制 Mi crowindows也有一些通用的窗口控件,但其图形引擎存在许多问题,具

27、体如下: 无任何硬件加速能力, *图形引擎中存在许多低效算法,如在圆弧函数的逐点 判断剪切的问题。 2003年 Microwindows推出版本 O 90后,该项目的发展 开始陷于停滞状态。 三种嵌入式 GUI的比较与分析 比较上述几个嵌入式 GUI系统,可以知道目前比较成熟 同时得到最多开发人员认可的有 QT Embedded、 MiniGUI、 MicroWimdows等。 MiniGUI和 Microwimdows均为自由软 件,前者遵循 LGPL条款,后者遵循 MPL条款。这两个系统的 技术路线也有所不同。 MiniGUI的策略是首先建立在比较成 熟的图形引擎之上,比如 SVGALib

28、和 LibGGI,开发的重点在 于窗口系统、图形接口之上; MicroWimdows目前的开发重点 则在底层的图形引擎之上,窗口系统和图形接口方面的功能 比较欠缺。例如 MiniGUI有一套用来支持多字符集和多编码 的函数接口,可以支持各种常见的字符集,包括 GB、 BIG5、 U NICODE等,而 MicroWimdows在多字符的支持上尚没有统 一接口。 QT Embedded系统则是针对高性能手持设备和移动 设备设计,对系统的各种要素要求很高,也是目前商业化应用 最多的一款商业收费嵌入式 GUI系统。 1inux下的 led的设备驱动程序的实现 在 Linux下,设备驱动程序可以看成

29、Linux内核与外部设备之间的接口。设备驱动程序向应用程序屏蔽了硬件实现了的细节,使得应用程序可以像操作普通文件一样来操作外部设备,可以使用和操作文件中相同的、标准的系统调用接口函数来完成对硬件设备的打开、关闭、读写和 i o控制操作,而驱动程序的主要任务也就是要实现这些系统调用函数。本系统平台使用的嵌入式 armLinux系统在内核主要功能上与 Linux操作系统没本质区别,所以驱动程序要实现的任务也一样,只要编译时使用的编译器、部分头文件和库文件等要涉及到具体处理器体系结构,这些都可以在 Makefile文件中具体指定。 LED一 0N ALL=OxOf点亮所有的 led数码灯 LED O

30、FF ALL=Ox00熄灭所有的 led数码灯,其中, LEDl、 LED2、 LED3、 LED4分别接 $3C2410的 r oC3GPF4、 GPF5、 GPF6、 GPF7可以通过读写 GPF I O来控制 L叻数码灯的状态。外部硬件电路图如图 3所示。 圈 3 LED幻硬件电路圈对于 led数码灯, 其驱动程序中需要提供基本的 I O 操作接口函数 open、 read、 write、 close的实现,本文中的 led数码灯的亮灭是通过 write函数来实现的。 3 2应用程序的实现 为了控制 led数码灯需要在应用程序中加载一下的 头文件: #include #include #

31、include 本文中设计的 qt3J程序通过四个 led数码灯来模拟开发板上的 led数码灯的显示模式,非常赢观的实现了 led数码灯的显示过程,可以以跑马灯的形式显示,还可以单个控制数码灯的显示控制 led数码灯程序实现过程,打开 led设备, led在 系统中对应的设备文件为 dev led O,采用系统调用函数 led fd=open(。dev led O。, o RDwR), led fd是设备打开后返回的文件描述符 (打开错误 返回 -I),以后的系统调用函数就可使用它来对设备文件进行操作了。接着,利用 write(1ed-fd, &val, 1)函数向 GPIO写控制字。 (3)

32、uic(user interface compiler) uic是从 xML文件生成代码的用户界面编译器,用来将 file ui文件生成 file h和 6le cpp文件 (命令如: uic o file h nle ui uic_0 file cppfile ui),但生成的这两个文件不是标准的纯 C+代码,通常称为 Qt的 c+扩展,因为 Qt的对象间运用了信号和插槽的通信机制,在文件中用 Q_oBjECT宏来标识。 (4)moc(元对象编译器 ) moc用来解析一个 c+文件中的类声明并且生成初始化对象的 c+代码, moc在读取c+源文件,如果发现其中一个或多个类的声明中 含有 Q_

33、0BJEcT宏,就给出这个使用 Q OBJECT宏的类生成另外一个包含元对象代码的 c+元文件;元对象代码对信号插槽机制、运行时的类型信息和动态属性系统是需要的。 2 3 Qt Embedded支持触摸屏显示 Qr Embedded 2 x系列中,触摸屏设备和键盘设备需要根据具体的驱动程序接口中 Qt/ErIlbedded中设备实现对应的设备操作类。其中 对应于鼠标类设备的实现位于”以 erne】 qwsnlouse-qws cpp中。 在文件 qwsmouse_qws cpp中添加对触摸 屏的支持。具体修改如下: ( 1)定义和 Linux内核文件 driver input, tsdev c

34、中数据结构 t8一 event相一致的 TS_EvENT数据结构,定义如下: #if defined(Q711_QwSjPAQ) typedef stmct short pressure; short x: short y; shon miHi8ec8: J rIs EVENT; (2)修改校准文件的位置 在函数 void OCalibratedM0useHandleE: writeCalibration()和 void QC础 bratedMouseHandleE: readcalibration()中修改如下: Qstring calFik=“ Am pointercal”; (3)对打开

35、的设备文件进行修改 在函数 QTPanelHandlerPrivate: Q即 anelHandlerPrivate中,修改如下: mouseFD =open (“阳 e以 npu伉 sO”, O RDONLY O NDELAY); (4)由于内核 Ts_EVENT结构中,当触摸屏 按下时对 pressure的设置为 l,因此在 void OTPanelHandlerPrivate: readMouseData()函数中 把 if (data 一 pressure 2 QT_QWS-TP PRESSUREJHRESHOLD) 修改为: i“ data一 pressure) 2 4移植 Qt Enlbedded库 在 ARM板的根文件系统的 tmp目录下创

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文资料库 > 毕业论文

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。