基于S3C2440的QT移植与编程实现

更新时间:2023-03-11 21:30:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

学校代码: 11059 学 号:0705075032

Hefei University

毕业论文(设计)

BACHELOR DISSERTATION

论文题目: 基于S3C2440的QT移植与编程实现 学位类别: 工 学 学 士 学科专业: 自 动 化 作者姓名: 黄 静 导师姓名: 干 开 峰 完成时间: 2012年5月

基于S3C2440的QT移植与编程实现

中 文 摘 要

随着计算机技术和信息网络技术的飞速发展,嵌入式系统的应用越来越广泛,而嵌入式产品以其小巧、使用方便、实用等特点越来越受到人们的青睐。特别是近几年来,嵌入式产品越来越多的被应用于各个领域,如国防、工业控制、通信、办公自动化和消费电子领域等。图形用户界面是嵌入式系统软件开发的重要内容,基于Linux内核开发实用、高效、美观的GUI是目前研究的一个重要课题。

本课题研究了基于Linux的典型嵌入式图形界面支持系统Qt,基于嵌入式Linux操作系统和S3C2440硬件平台,完成Qt开发环境搭建和Qt相关平台移植,最后完成应用程序编程实例实现,并将应用程序成功移植到GT2440开发板上,测试结果证实该程序运行稳定,性能良好。

关键词:嵌入式系统;QT;嵌入式linux;S3C2440

1

Transplantation and programming of QT based on S3C2440

Abstract

This paper introduces the QT / Embedded linux embedded system development environment to establish and transplant. Through a lot of source code analysis, build Qt / development environment in the linux host and s3c2410 transplant, and then on the QT / E programs.

Qt / Embedded is Trolltech launched Linux-based embedded platform development tools, embedded version of Qt. It inherits the Qt's standard APIs, provide a more compact than Xlib and XWindows window generation system FrameBuffer direct operations (see Figure 1). The fully modular design and efficient build system to reduce memory consumption, these Qt / Embedded as the embedded environment, powerful and comprehensive GUI development tools. KDE and other projects using Qt as the support library, so many Qt-based X-Windows program can be easily ported to Qt / Embedded version. Qt / Embedded with the advantages of object-oriented, cross-platform and interface design, convenient and aesthetic, have been widely used.

KEY WORD: Embedded ;Transplant And Program; Qt/Embedded; linux;S3C2440

2

第一章 前言 ................................................... 4

1.1 嵌入式系统概述 ........................................ 4 1.2 图形开发 .............................. 错误!未定义书签。 1.3 本文章节安排 ........................................... 5 第二章 QT编程环境 .............................................. 7

2.1 Qt概述 ................................................ 7 2.2 Qt开发环境搭建 ........................................ 7

2.2.1 安装Qt对系统的要求 .............................. 8 2.2.2 Qt开发环境及工具 ................................ 8 2.2.3 Qt-Embedded-Linux安装 ........................... 8 2.2.4 嵌入式Linux中Qt环境变量 ........................ 9 2.2.5 Qt/X11安装 ..................................... 10 2.2.6 Qt/Embedded安装 ................................. 10 2.3 Qt在嵌入式Linux的应用 ................................ 11

2.3.1 在嵌入式Linux上运行Qt程序 ...................... 11 2.3.2 嵌入式Linux Qt显示管理 ........................ 12 2.3.3 输入设备键盘和鼠标的设置于管理 .................. 13 第三章 Qt应用程序开发实例 ................................ 15 3.1 软硬件平台 ............................................ 15

3.1.1 硬件平台......................................... 15 3.1.2 软件平台......................................... 16 3.2 Qt开发流程 .......................................... 17 3.3 应用程序实现 ......................................... 18 第四章 总结 ................................................... 23 参考文献 ...................................................... 24 致谢 .......................................................... 25

3

第一章 前言

1.1 嵌入式系统概述

嵌入式系统的出现最初是基于单片机的。70年代单片机的出现,使得汽车、家电、工业机器、通信装置以及成千上万种产品可以通过内嵌电子装置来获得更佳的使用性能:更容易使用、更快、更便宜。这些装置已经初步具备了嵌入式的应用特点,但是这时的应用只是使用8位的芯片,执行一些单线程的程序,还谈不上“系统”的概念。

从80年代早期开始,嵌入式系统的程序员开始用商业级的“操作系统”编写嵌入式应用软件,这使得可以获取更短的开发周期,更低的开发资金和更高的开发效率,“嵌入式系统”真正出现了。确切点说,这个时候的操作系统是一个实时核,这个实时核包含了许多传统操作系统的特征,包括任务管理、任务间通讯、同步与相互排斥、中断支持、内存管理等功能。

嵌入式系统的分类如下:

(1) 嵌入式系统的硬件

从硬件方面来讲,嵌入式系统的核心部件是嵌入式处理器。据不完全统计,全世界嵌入式处理器的品种数量已经超过1000多种,流行体系结构有30多个,其中8051体系占大多数。生产8051单片机的半导体厂家有20多个,共350多种衍生产品,仅Philips就有近100种。目前嵌入式处理器的寻址空间可以从64KB到256MB,处理速度从0.1MIPS到2000MIPS。

近年来嵌入式微处理器的主要发展方向是小体积、高性能、低功耗。专业分工也越来越明显,出现了专业的IP(Intellectual Property Core,知识产权核)供应商,如ARM、MIPS等,他们通过提供优质、高性能的嵌入式微处理器内核,由各个半导体厂商生产面向各个应用领域的芯片。

一般可以将嵌入式处理器分成4类,即嵌入式微处理器(Micro Processor Unit,MPU)、嵌入式微控制器(Micro Controller Unit,MCU单片机)、嵌入式DSP处理器(Digital Signal Processor,DSP)和嵌入式片上系统(System On Chip,SOC)。 (2) 嵌入式系统的软件

嵌入式系统的软件一般由嵌入式操作系统和应用软件组成。操作系统是连接计算机硬件与应用程序的系统程序。

嵌入式系统的特点:

1) 系统内核小

由于嵌入式系统一般是应用于小型电子装置,系统资源相对有限,所以内核较之传统的操作系统要小得多。比如ENEA公司的OSE分布式系统,内核只有5KB而Windows的内核则要大得多。

4

2) 专用性强

嵌入式系统的个性化很强,其中的软件系统和硬件的结合非常紧密,一般要针对硬件进行系统的移植,即使在同一品牌、同一系列的产品中也需要根据系统硬件的变化和增减不断进行修改。同时,针对不同的任务,往往需要对系统进行较大更改;程序的编译下载要和系统相结合,这种修改和通用软件的“升级”是完全不同的概念。 3) 系统精简

嵌入式系统一般没有系统软件和应用软件的明显区分,不要求其功能的 设计及实现过于复杂,这样一方面利于控制系统成本,同时也利于实现系统安全。

4) 高实时性

高实时性的操作系统软件是嵌入式软件的基本要求。而且软件要求固化存储,以提高速度。软件代码要求高质量和高可靠性。 5)多任务的操作系统

嵌入式软件开发要想走向标准化,就必须使用多任务的操作系统。嵌入式系统的应用程序可以没有操作系统而直接在芯片上运行;但是为了合理地调度多任务,利用系统资源、系统函数以及专家库函数接口,用户必须自行选配RTOS(Real Time Operating System)开发平台,这样才能保证程序执行的实时性、可靠性,并减少开发时间,保障软件质量。 6)专门的开发工具和环境

嵌入式系统开发需要专门的开发工具和环境。由于嵌入式系统本身不具备自主开发能力,即使设计完成以后,用户通常也不能对其中的程序功能进行修改,因此必须有一套开发工具和环境才能进行开发,这些工具和环境一般是基于通用计算机上的软硬件设备以及各种逻辑分析仪、混合信号示波器等。开发时往往有主机和目标机的概念,主机用于程序的开发,目标机作为最后的执行机,开发时需要交替结合进行。

1.2 嵌入式系统图形用户界面现状

由于受到硬件条件等的限制,现在许多嵌入式设备的用户界面仍然非常简单。看习惯了PC机上华丽美观的用户界面,总希望在这些设备上也能得到同样美的享受。随着嵌入式设备的硬件条件提高,对于嵌入式系统中轻量级图形用户界面的需求也越来越迫切。这些系统一般不希望建立在庞大累赘的、非常消耗资源的操作系统和图形用户界面之上,比如Windows。同时,嵌入式系统对图形用户界面轻量型和可定制方面有较高的要求,它们希望图形用户界面占用资源少、性能高、可靠性高、易移植、可配置。

5

本论文的选题正是结合Linux操作系统和嵌入式系统研究这两个热点领域,选择适合于嵌入式特点的图形用户界面QT来进行应用程序开发。

1.3 本文章节安排

论文的结构安排如下:

第一章,前沿,分析并阐述了本课题研究背景及意义。

第二章,QT编程环境,首先介绍了QT的概述, QT环境的搭建以及要求。

第三,QT应用程序开发实例,介绍了QT应用程序开发所涉及的软、硬件平台,完成应用程序实例,并移植到GT2440开发板。

第四章,总结,对已完成的工作进行了简要总结,并指出了其中的不足,并对今后的做了展望。

6

第二章 QT编程环境

2.1 Qt概述

Qt是一个跨平台的 C++ 图形用户界面库,由挪威 TrollTech 公司于1995年底出品。Trolltech 公司在 1994 年成立,但是在 1992 年,成立 Trolltech 公司的那批程序员 就已经开始设计 Qt 了,Qt 的第一个商业版本于 1995 年推出。2008年1月31日,Nokia公司宣布通过公开竞购的方式收购TrollTech公司,旗下包括Qt在内的技术都归入Nokia旗下。并且Nokia针对自己的移动设备平台规划的需要,将Qt按不同的版本发行。

Qt 的良好封装机制使得 Qt 的模块化程度非常高,可重用性较好,对于用户开发来说是非常 方便的。 Qt 提供了一种称为 signals/slots 的安全类型来替代 callback,这使得各个元件之间的协同工作变得十分简单。

Qt包括多达250个以上的 C++ 类,还提供基于模板的 collections, serialization, file, I/O device, directory management, date/time 类。还包括下列功能:

(1)支持 2D/3D 图形渲染,支持 OpenGL 大量的开发文档; (2)XML 支持;

(3)Webkit 引擎的集成,可以实现本地界面与Web内容的无缝集成。

2.2 Qt开发环境搭建

Qt/Embedded是基于Qt的嵌入式GUI和应用程序开发的工具包,它可运行多种嵌入式设备上,主要运行在嵌入式Linux系统上,并且需要C++编译器的支持,并为嵌入式应用程序提供Qt的标准API。

Qt/Embedded 的API是基于面向对象技术的。在应用程序开发上使用与Qt相同的工具包,只需在目标嵌入式平台上重新编译即可。使用所熟悉的桌面开发工具,来编写和保存一个嵌入式应用程序的源代码树,在移植到多种嵌入式平台时,只需要重新编译代码。

Qt/Embedded提供自身的轻量级窗口系统,比使用Xlib和X Window更加紧凑; Qt/Embedded 的设计原则是不依赖于X server或者Xlib,而是直接访问帧缓存,同其他解决方案如Qt/X11相比这样做最显著的效果是减少了内存消耗。只需要一个Qt/Embedded动态链接库就足以替代X server、Xlib库和其他嵌入式解决方案的图形工具包

7

2.2.1 安装Qt对系统的要求

安装qt的过程在不同的平台上会有所不同,主要在嵌入式linux平台上安装。若需要提供对OpenSSL的支持,需要通过单独安装OpenSSL Toolkit,来获得Secure Sockets Layer (SSL)。对于不同的平台上,会有不同的要求。如果要在qt上对QtWebKit模块的支持,必须使用uClibc 0.9.29或者更高的版本,以对pthread的支持。

在内存方面的要求主要取决于体系架构以及在编译过程中使能的QT选项。

2.2.2 Qt开发环境及工具

Qt/Embedded的应用程序也可以使用标准工具在用户熟悉的环境下的工具开发,如Window平台下的Visual C++和Borland C++ Builder,Unix平台下的KDevelop等。在Unix平台下编译Qt/Embedded应用程序,可以在独立的控制台模式,也可以用X11应 用程序虚拟的帧缓存。通过指定目标设备的长、宽和色深,虚拟帧缓存可以点对点的模拟物理设备,免除了调试过程中反复擦写闪存,加快了编译、链接、运行的环节。Qt/Embedded提供许多支持嵌入式开发的工具,其中两个非常重要的Qt工具qmake和Qt Designer。Qmake可以为Qt/Embedded链接库和应用程序生成makefile文件。Qmake可以从项目文件(.pro)为多种平台 生成makefile文件,通过不同设置可以使应用程序方便的在多种平台间移植。Qt Designer可以使用可视化的方式设计对话框、窗口的,替代了设计代码手工编写。在Qt Designer中还可以使用布局管理器来平滑的设置窗口部件的布局,使用代码编写器编写代码,并且整合了qmake。 2.2.3 Qt-Embedded-Linux安装 (1)下载源码包,解压;

http://download.qtsoftware.com/qt/source/常用官网 qt news:http://www.qtsoftware.com/about/news qt downloads:http://www.qtsoftware.com/downloads qt Quarterly:http://doc.trolltech.com/qq/

qt bugs:http://www.qtsoftware.com/developer/task-tracker

qt Supported Platforms:http://doc.trolltech.com/supported-platforms.html qt Version Changes :http://www.qtsoftware.com/developer/changes qt books: http://www.qtsoftware.com/developer/books

8

(2)建立支持库

通过./configure来设置,主要配置可以通过--help来获得帮助;之后用make命令,然后用make install 命令。将库安装到指定的路径下面。其中的设置包括指定安装的路径;未配置的话,默认的路径是/usr/local/Trolltech/QtEmbedded-4.5.0; (3)设置环境变量

为了能够使用Qt for Embedded Linux, 必须导出的PATH变量有qmake, moc 以及其他Qt for Embedded Linux 的工具, 以及LD_LIBRARY_PAT。 执行:

PATH=/usr/local/Trolltech/QtEmbedded-4.5.0/bin:$PATH export PATH

(4)建立虚拟的frambuffer。

建立虚拟的frambuffer,需要安装X11 Platforms。 2.2.4 嵌入式Linux中Qt环境变量

QT环境变量如下:

POINTERCAL_FILE:指定文件包含的数据,用来校准触摸笔设备。同时可以参考QWSCalibratedMouseHandler and Qt for Embedded Linux Pointer Handling.

QT_ONSCREEN_PAINT:如果定义了的话,可以用来将控件显示在屏幕上。如果没有其他控件在同一个区域的话,该设备响应的区域将不会随着屏幕设备驱动的改变而改变。设置这个环境变量相当于在控件中应用程序中设置Qt::WA_PaintOnScreen。

QWS_SW_CURSOR:如果定义了的话,软件鼠标的光标将一直是可用的。(即使使用硬件加速驱动器来支持硬件光标)

QWS_DISPLAY:指定显示形式和framebuffer.例如:export QWS_DISPLAY=[:]...[:]

QWS_SIZE:指定嵌入式linux qt窗口在屏幕上的大小。export QWS_SIZE=x

QWS_MOUSE_PROTO: xport QWS_MOUSE_PROTO=[:],参数可以是MouseMan, IntelliMouse, Microsoft, VR41xx, LinuxTP, Yopy. Tslib and keys。/dev/mouse 指的是鼠标设备, /dev/ts for touch panels。

QWS_KEYBOARD为输入设备指定输入设备和驱动。比如:export

9

QWS_KEYBOARD=[:]。参数可以是SL5000, Yopy, VR41xx, TTY, USB and keys,指定的是一个标准设备。 2.2.5 Qt/X11安装 QT/X11安装步骤如下: #cd /usr/local

#tar xvfz qt-x11-free-3.3.4.tar.gz #mv qt-x11-free-3.3.4 qtx #cd qtx

#export QTDIR=$PWD //设置环境变量,在编译的时候要用到 #export PATH=$QTDIR/bin:$PATH #export LD_LIBRARY_PATH =$QTDIR/lib

#./configure -depths 4,8,16 -no-ipv6 -no-cups -no-pch –qvfb -depths 4,8,16,32 //配置,可以通过./configure -help来获得帮助信息 #make //编译 #make install

2.2.6 Qt/Embedded安装

编译并安装Qt/Embedded主要是为了生成基于ARM内核的Qt/E库文件,将这些库文件移植到ARM平台中就可以运行通过QT开发出来的GUI程序了,下面列出其安装步骤: #cd /usr/local

#tar xvzf qt-embedded-free-3.3.5.tar.gz #mv qt-embedded-free-3.3.5 qte #cd qte

#export QTDIR=$PWD //设置环境变量 #export PATH=$QTDIR/bin:$PATH

#export LD_LIBRARY_PATH =$QTDIR/lib:$LD_LIBRARY_PATH 接着拷贝jpeg库头文件到Qt/E的include中,因为在编译的时候要用到。 #cp /usr/include/jpeglib.h $QTDIR/include/ #cp /usr/include/jconfig.h $QTDIR/include/ #cp /usr/include/jerror.h $QTDIR/include/ #cp /usr/include/jmorecfg.h $QTDIR/include/

10

#cp /usr/local/qtx/bin/uic $QTDIR/bin/

#./configure -shared -embedded arm -qt-gif -no-exceptions -thread -no-nis -no-cups -no-stl -qt-imgfmt-mng -qt-imgfmt-png -qt-imgfmt-jpeg -qt-sql-sqlite -qvfb -depths 4,8,16,32

#make //编译,最终生成基于ARM平台的Qt/E库文件:libqte-mt.so、libqte-mt.so.3、libqte-mt.so.3.3、libqte-mt.so.3.3.5 到此,整个Qt/Embedded的开发环境全部建立起来了

2.3 Qt在嵌入式Linux的应用

QT在嵌入式Linux中应用需要完成这几个方面:字体库移植,设置环境变量以及Framebuffer的支持。

字体库的支持:是在qt的/lib/fonts目录下。由于程序运行的时候是到这个文件夹下面来调用,因此需要将字体库复制到这个目录下。

环境变量的设置:通常情况下,与默认的环境变量不同,因此需要设置的有QWS_MOUSE_PROTO, QWS_KEYBOARD 以及 QWS_DISPLAY,用来指定鼠标、键盘以及显示设备管理。在./configure 的时候需要加入的选项是-qt-kbd- and -qt-mouse- ,这样才能使能这些设备驱动。但是还需要指定一个具体的设备,因此需要通过设置环境变量来完成。

framebuffer的支持:没有特殊需求的情况下,要求在目标设备上使能framebuffer。Linux framebuffer在标准设置情况下是使能的。 2.3.1 在嵌入式Linux上运行Qt程序

任何嵌入式linux应用程序可以通过构建QApplication 对象QApplication::GuiServer的格式,被构建为服务server application。或者通过-qws命令行选项的方式。本文当假设用The Virtual Framebuffer 或者嵌入式linux的VNC协议,或者正确配置的Linux framebuffer。而且没有服务进程在运行。可以使用的显示方式有:Using a Single Display

单显示,运行这种显示方式,改变Linux console,而且选择一个应用来运行。它要求在安装过程中,环境变量是可用的。它要求指定的硬件设备驱动必须工作正常。比如:

cd path/to/QtEmbedded/demos/textedit

11

./textedit -qws

* Using Multiple Displays

linux同时也是支持多设备显示。有两种方式可以完成。当在运行多服务程序的时候,显示屏的驱动(以及数量)必须为每一个程序进行指定。用-display命令行或者QWS_DISPLAY 来指定。比如: ./myfirstserverapplication -qws -display \ ./mysecondserverapplication -qws -display \

需要注意的是,必须指定一个显示设备,在开始客户端程序的时候。比如:./myclientapplication -display \。在程序运行的时候,没有办法将一个客户端程序从一个显示移动到另一个显示。用多显示屏驱动,另一方面,应用程序可以方便的在两个不同类型的显示屏之间切换。多屏幕显示可以用-display命令行参数来指定或者通过设置QWS_DISPLAY环境变量比如: ./myserverapplication -qws -display \QVFb:0 QVFb:1:offset=0,0 VNC:offset=640,0 :2\ * Command Line Options 命令行选项

2.3.2 嵌入式Linux Qt显示管理

当需要显示的时候,默认的动作是每一个嵌入式linux的客户端将需要的显示的色调存放在内存中,然后服务端将相关的数据从内存在中送到显示屏上。服务端用显示屏驱动copy内存中的内容到显示屏上显示。显示屏的驱动是在服务端应用加载的时候运行的,用的是qt的插件系统。常用的方式有:可用的驱动;指定一个驱动;子驱动和多驱动。 Available Drivers可用的驱动

嵌入式linux的qt提供的驱动有Linux framebuffer, the virtual framebuffer, transformed screens, VNC servers and multi screens.通过运行./configure 选项来列出可用的驱动。默认的配置是不加速的Linux framebuffer driver (/dev/fb0) 被打开。其他的设备驱动也可以使能或者禁止,通过以下命令行。例如:./configure -qt-gfx-transformed Specifying a Driver指定一个驱动

通过设置环境变量QWS_DISPLAY来指定一个设备。比如:格式如下的: export QWS_DISPLAY=\specific options>]... [:]\可以用的参数有:LinuxFb, QVFb, VNC, Transformed, Multi and keys identifying custom drivers。参数的被用来分辨用相同

12

驱动的屏幕,而且使能多显示。如下的表格用来指定驱动。环境变量的QWS_DISPLAY也可以通过-display来设置。比如: myApplication -display \ Subdrivers and Multiple Drivers子驱动和多驱动

VNC, Transformed 和Multi screen drivers取决于子驱动。通用的语法是: export

QWS_DISPLAY=\

options>]...[ :]\至于子驱动,在每个子驱动之间加上空间是很重要的,在显示设备前加上用来分开各个驱动和显示设备。注意的是多屏幕驱动可以拥有多个子设备驱动,比如: export QWS_DISPLAY=\QVFb:offset=640,0:1 :2\注意的是:VNC screen driver在没有指定屏幕驱动的情况下,默认的是虚拟屏幕驱动。在这种情况下,VNC driver有一些额外的参数来指定大小的位宽,参数有: * size= * depth= * mmHeight=

* mmWidth= 。例如:export QWS_DISPLAY=\。例如运行VNC屏幕驱动在Linux framebuffer driver的情况下,则 export QWS_DISPLAY=\2.3.3 输入设备键盘和鼠标的设置于管理

当运行一个Qt for Embedded Linux应用程序的时候,不管是作为一个服务还是连接到另一个服务,当它开始运行的时候,鼠标驱动被服务的应用加载,用qt的plugin system。 在配置qt的时候通过选项来选择支持的鼠标以及键盘设备,同时测试可用的设备。通过 ./configure -help 查看可用的设备,配置时候默认的是PC的鼠标驱动。如果是自己添加一个设备,比如触摸屏,则需要创建一个QWSCalibratedMouseHandler subclass来完成校验功能。若提供的pc的鼠标被使能,Qt for Embedded Linux将会自动探测所支持的一种鼠标设备,这个设备是在/dev/psaux 或者 /dev/ttyS的一种。如果多种类型的都检测到的话,则多种同时支持。需要注意的是,Qt for Embedded Linux 不支持自动检测触摸屏设备,因此需要指定使用的是哪一种。要设置环境变量QWS_MOUSE_PROTOexport

QWS_MOUSE_PROTO=[:

specific options>],其中的参数可以是MouseMan, IntelliMouse, Microsoft, VR41xx, LinuxTP, Yopy, Tslib and keys,driver specific options是一个标准设备,比如:dev/mouse,触摸屏的是/dev/ts。多鼠标可以用下列方式来指定。

export QWS_MOUSE_PROTO=\

13

[:] [:]\

需要注意的是:Vr41xx 驱动有两个可选的参数:press=来定义单击的时间(默认值是750);filter= 指定的是滤波长度。用于虑掉噪声。比如:

export QWS_MOUSE_PROTO=\对于The Tslib Mouse Driver是一个继承QWSCalibratedMouseHandler的类,在产生鼠标事件的时候,提供校验和滤波的功能,用于使用同一的触摸屏的库。为了使用鼠标,必须编译的选项是-qt-mouse-tslib。此外,tslib的头文件和库也要在build的环境变量中指出来。tslib 的源码可以在http://tslib.berlios.de. 下载。通过-L 和-I 来指定库和头文件的位置。比如: ./configure -L -I 。 为了保证能够使用鼠标,tslib必须正确的安装在目标机上。包括提供一个ts.conf 配置文件和设置必要的环境变量。ts.conf包括两行:内容是: module_raw input

module linear在make Qt for Embedded Linux 时候特别指定tslib 鼠句柄,设置环境变量QWS_MOUSE_PROTO 。可能出现问题的地方是设备文件和文件权限两个方面。为了保证能够正确的使用设备文件,第一步,先测试一下设备文件是否有输出。比如:如果指定的鼠标设备驱动是:QWS_MOUSE_PROTO=IntelliMouse:/dev/input/mouse0,然后检查设备的输出,通过在控制台上敲: cat /dev/input/mouse0 | hexdump,移动鼠标后,如果可以在控制台上看见输出,表示能够正确的使用设备,否则要重新连接设备。对于设备的读写权限,一般要求对设备至少有读权限。比如:QWS_MOUSE_PROTO=IntelliMouse:/dev/input/mouse0,那么应该将该设备的权限设置为chmod a+rw /dev/input/mouse0。如果设备文件符号连接到另一个文件的话,必须改变相关文件的属性。

14

第三章 Qt应用程序开发实例

3.1 软硬件平台 3.1.1 硬件平台

三星公司推出的16、32为RISC微处理器S3C2440A,为手持设备和一般类型应用提供了低价格、低功耗、高性能小型微控制器的解决方案。

S3C2440A采用了ARM920t的内核,0.13um的CMOS标准宏单元和存储器单元。其低功耗,简单,优雅,且全静态设计特别适合于成本和功率敏感型的应用。它采用了新的总线架构Advanced Micro controller Bus .

·1.2V内核供电,1.8V/2.5V/3.3V存储器供电,具备16KB的I-Cache和16KB DCache/MMU微处理器

·外部存储控制器(SDRAM)控制和片选逻辑 ·LCD控制器提供1通道LCD专用DMA ·4通道DMA并有外部请求引脚 ·3通道UART ·2通道SPI

·1通道IIS-BUS接口

·1通道IIS-BUS音频编解码器接口 ·AC’97解码器接口

·兼容SD主接口协议1.0版和MMC卡协议2.11兼容版 ·2端口USB主机、1端口USB设备

·4通道PWM定时器和1通道内部定时器/看门狗定时器 ·8通道10比特ADC和触摸屏接门 ·具有日历功能的RTC ·相机接口

·130个通用I/O口和24通道外部中断源 ·具有普通,慢速,空闲和掉电模式 ·具有PLL片上时钟发生器

15

3.1.2 软件平台

嵌入式软件开发不同于一般的软件开发,绝大多数的Linux软件开发都是以本机方式进行的,即本机开发、调试,本机运行的方式。这种方式通常不适合嵌入式系统的软件开发,因为对于嵌入式系统的开发,没有足够的资源在本机中运行开发工具盒调试工具。

通常的嵌入式系统的软件开发采用一种交叉编译调试的方式。交叉编译的开发和调试环境建立在宿主机上,对应的开发板叫做目标板。

开发时使用宿主机上的交叉编译、汇编及链接工具形成可执行的二进制代码,然后把可执行文件下载到目标板上运行。 1.Bootloader引导程序移植

Bootloader引导程序是嵌入式开发很重要的组成部分,它是嵌入式系统上电后执行的第一个程序,并由它最终将操作系统启动起来并将控制权交给操作系统。Bootloader引导程序最基本的功能有对硬件系统的初始化、内核启动参数设置和启动内核。

Bootloader的主要功能有: (1)初始化CPU运行的时钟频率。

(2)初始化Flash和内存的数据宽度、读/写访问周期和刷新周期。 (3)初始化中断系统。

(4)初始化系统中各种运行模式下的寄存器和堆栈。 (5)初始化系统各种内片外设备和I/O端口。 (6)加载和引导操作系统,为用户提供一个命令接。 2.根文件系统

根文件系统是Linux系统引导启动时默认使用的文件系统。

文件系统是Linux操作系统的核心组成部分之一,用于文件盒目录的组织,其中包括了Linux程序、函数库、用户文件盒设备文件等,同时作为存储数据读写结果的区域。在嵌入式系统中,硬件初始化和内核启动完成之后将执行挂载文件系统的操作。

16

3.2 Qt开发流程

嵌入式硬件平台的确定 PC上搭建Qt/Embedded开发环境 交叉编译Qt/Embedded库并进行目标版的移植 PC上进行QTE应用程序的开发 交叉编译应用程序 在目标平台上进行调试 程序运行是否正常 发布应用程序

过程中我们采取了宿主机和目标板的开发模式。宿主机是一台运行Linux 的PC 机,目标板即hybus开发板。先在宿主机上调试通过后,再移植到目标板上。

Qt/Embedded直接写入帧缓冲,在宿主机上则是通过qvfb(vitural

17

framebuffer)来模拟帧缓冲。qvfb是X窗口用来运行和测试Qtopia应用程序的系统程序,允许我们在桌面及其上开发Qt嵌入式程序,而不需要在命令台和X11之间来回切换。qvfb使用了共享存储区域(虚拟的帧缓冲)来模拟帧缓冲并且在一个窗口中(qvfb)模拟一个应用来显示帧缓冲,显示的区域被周期性的改变和更新。通过指定显示设备的宽度和颜色深度,虚拟出来的缓冲帧和物理的显示设备在每个像素上保持一致。这样我们在每次调试应用时不需要总是刷新嵌入式设备的FLASH存储空间,从而加速了应用的编译、连接和运行周期。 应用程序的移植

将编译好的可执行文件下载到目标板上,目前有四种方式: (1) 通过网络传送文件到开发板 (2) 复制到介质(如U盘) (3) 通过串口传送文件到开发板 (4) 通过NFS(网络文件系统)直接运行

3.3 应用程序实现

针对目标板编译应用程序与编译可在宿主机上执行的应用程序类似,只需将编译参数作一定的修改,就可让程序在开发板上运行。安装Qt/Embedded时,配置参数-xplatform linux-arm-g++表示在ARM平台上进行交叉编译。 (1) 设置环境变量

在根文件系统中已经加入了Qt的安装包和Qt程序需要链接的库文件,环境变量的设置命令如下: Export QTDIR=/opt/qt/ (2) 使鼠标、键盘工作

鼠标设备接口这一基类QWSMouseHandler 的实现位于/src/kernel/qmouse文件中;键盘的驱动程序位于/src/kernel/qkeyboard-qws.cpp中,键盘类设备接口的基类为QWSMouseHandler.为了鼠标、键盘正常工作,使用如下的命令配置:

Export QWS-KEYBOARD=USB:/dev/input/event1 Export QWS-MOUSE-PORT =USB:/dev/input/mouse0 (3) 程序执行结果分析

分别右击三个按钮,点击 go to slot,在 mainwindow 中产生三个槽函数: void MainWindow::on_start_clicked()

18

void MainWindow::on_stop_clicked() void MainWindow::on_clear_clicked()

根据设计任务,每秒在 Text Edit 中显示自己设置的一组数,所以需要用到定时器。

在 mainwindow.h 中添加:

在 private:中加入成员 QTimer m_timer; 定义一个定时器。 根据要求,当点击启动按钮时,开始计数并显示在 void MainWindow::on_start_clicked() 中添加

void MainWindow::on_start_clicked() {

on_Start_b_clicked(); }

进入 on_Start_b_clicked()中, 继续添加代码:

void MainWindow::on_Start_b_clicked()

//这是我定义的一个按钮当按下这个按钮时执行下面的操作 {

//如果定时器没启动 if (!m_timer.isActive()) {

m_timer.start(1000); //开启定时器 1s

this->connect(&m_timer,SIGNAL(timeout()),this,SLOT(timeOut())); //计时到达,进入 timeOut(), } }

timeOut()内容:

void MainWindow::timeOut() {

ui->view->setText(tr(\

19

}

retArry()内容:

int MainWindow::retArry() {

int a[70]={ 0,1,2,3,4,5,6,7,8,9,

%1 \在 view 中显示 retArry()值

10,11,12,13,14,15,16,17,18,19, 20,21,22,23,24,25,26,27,28,29, 30,31,32,33,34,35,36,37,38,39, 40,41,42,43,44,45,46,47,48,49, 50,51,52,53,54,55,56,57,58,59, 60,61,62,63,64,65,66,67,67,69, }; i++; if(i==70) { i=0; }

return a[i];

} //定义 70 个数,每次返回一个值 其中,i 在最上面定义:int i;

由于使用到上面的一些函数,需要先声明。 在 mainwindow.h 中添加: protected:

void on_Start_b_clicked(); int retArry(); private slots: void timeOut();

到这里可以完成点击启动:在 view 中显示不同的数,下面添加停止和清除功能。

20

void MainWindow::on_stop_clicked() {

if (m_timer.isActive())

{

m_timer.stop(); } }

void MainWindow::on_pushButton_clicked() {

ui->view->clear(); }

注意此时的程序只能在 X-11 平台下运行,要想移植到 ARM 平台,将上述 选择分别改成 qt4.3.6-embedded-arm, qt4.3.6-embedded-arm Release 删除以前编译好的.o, Makefile 和可执行文件,重新编译。生成的可执行文件程 序即可在 ARM 平台上运行。

但 qt4.3.6-embedded-arm 的字体库不带中文显示,需要下一个 wenquanyi 的字 体,将它解压后,放入根文件系统的 fonts 目录(根据自己根文件系统的情况)中, 修改运行代码: #!bin/sh

export QTLIB=/usr/lib

export TSLIB_ROOT=/usr/local/tslib export TSLIB_TSDEVICE=/dev/event0

21

export TSLIB_CALIBFILE=/etc/pointercal

export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts export TSLIB_CONSOLEDEVICE=none export TSLIB_FBDEVICE=/dev/fb0 export

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib:$QTLIB export QWS_SIZE=320x240

export QWS_MOUSE_PROTO=Tslib:/dev/event0

export QWS_DISPLAY=\ if [ -f \ CarText -qws -font wenquanyi& else ts_calibrate

CarText -qws -font wenquanyi& fi

目标板上的移植与宿主机类似,只需将编译参数做一定的修改即可。列出了qtopia移植中qtembedded共享库的支持,环境变量声明和关键的编译配置命令,以及最后目标板上qpe的架构。

22

第四章 总结

经过了一段时间的不懈努力,经历了困难的一段日子,从对一些关键性问题的不知所措到找到较好的解决方案。最终有了一定的回报,实现了基本要求的功能。其中对毕业设计过程中涉及的一些软件有了更深一个层次的了解,也加强了C++编程能力。对QT的移植与编程有了进一步的了解。

同时要感谢母校对我们毕业设计的重视,指导老师的细心指导以及同学的帮助。毕业设计完成了,但又面临着工作。我相信我会把自己的热情和所学奉献到自己的工作中,不断努力,不断进取!

23

参考文献

[1] 梅宽勤.基于Qt/Embedded 的图像用户界面移植[D].复旦大学,2007. [2] 赵拯宇,张雪英,金刚. Qt/Embedded和Qtopia在OMAP5912 平台上的移植及应用[J].仪器仪表用户,2009,16,2:108-110.

[3] 孙琼.嵌入式Linux应用程序开发详解[M].北京:人民邮电出版社,2006.

[4] 成洁,卢紫.Linux 窗口程序设计[M].北京:清华大学出版社,2008. [5] 王自强,刘海燕,李媛洲.Linux下图形用户界面程序的开发与实现[J]. 计算机应用与软件,2005,22(6):81-83.

[6] 刘波, 周克贵. 基于Qt/Embedded和Linux的嵌入式 GUI的研究与实现[J].仪器仪表用户, 2007,14(6):19-20.

[7] 丁丁,习勇,魏急波. 三种主流嵌入式图形用户界面的移植及性能比较 [J]. 电子产品世界,2004.5。

[8] 倪继利. Qt及Linux操作系统窗口设计[M]. 北京:电子工业出版社,2006-04。

[9] Xteam(中国)软件技术有限公司. Qt程序设计,清华大学出版社。 [10] Arthur Griffth著,高寿福等译. KDE2/Qt编程宝典[M].北京:电子工业出版社,2001-01。

[11] Qt参考文档 http://www.qiliang.net/qt/index.html

[12] 郭磊,何波,于青,王乾. 基于QTE的嵌入式Linux下可视化打印设计[M]. 微计算机信息 2007 3-2: 15-16。

24

致谢

历时将近两个月的时间终于将这篇论文写完,在论文的写作过程中遇到了无数的困难和障碍,都在同学和老师的帮助下度过了。尤其要强烈感谢我的论文指导老师干老师,他对我进行了无私的指导和帮助,不厌其烦的帮助进行论文的修改和改进。在此向帮助和指导过我的各位老师表示最中心的感谢!

感谢这篇论文所涉及到的各位学者。本文引用了数位学者的研究文献,如果没有各位学者的研究成果的帮助和启发,我将很难完成本篇论文的写作。

感谢我的同学和朋友,在我写论文的过程中给予我了很多你问素材,还在论文的撰写和排版灯过程中提供热情的帮助。

由于我的学术水平有限,所写论文难免有不足之处,恳请各位老师和学友批评和指正!

最后,再次对关心、帮助我的老师和同学表示衷心地感谢!

25

致谢

历时将近两个月的时间终于将这篇论文写完,在论文的写作过程中遇到了无数的困难和障碍,都在同学和老师的帮助下度过了。尤其要强烈感谢我的论文指导老师干老师,他对我进行了无私的指导和帮助,不厌其烦的帮助进行论文的修改和改进。在此向帮助和指导过我的各位老师表示最中心的感谢!

感谢这篇论文所涉及到的各位学者。本文引用了数位学者的研究文献,如果没有各位学者的研究成果的帮助和启发,我将很难完成本篇论文的写作。

感谢我的同学和朋友,在我写论文的过程中给予我了很多你问素材,还在论文的撰写和排版灯过程中提供热情的帮助。

由于我的学术水平有限,所写论文难免有不足之处,恳请各位老师和学友批评和指正!

最后,再次对关心、帮助我的老师和同学表示衷心地感谢!

25

本文来源:https://www.bwwdw.com/article/ddbw.html

Top