QTOPIA的移植报告 嵌入式课程设计报告 QTOPIA的移植实验报告

课 程 设 计 报 告

课程名称           嵌入式系统              

课题名称           QTOPIA移植             

专    业         计算机科学与技术         

班    级              0902                

学    号                      

姓    名                         

指导教师      郭鹏     刘铁武    李杰君    

    20##年9月3 日

湖南工程学院

课 程 设 计 任 务 书

课程名称      嵌入式系统        

课    题      QTOPIA移植        

专业班级         计算机科学与技术        

学生姓名                         

学    号                 

指导老师     郭鹏    刘铁武   李杰君     

任务书下达日期   20##年9 月 3 日

任务完成日期  20##年9 月8 日

嵌入式系统课程设计任务书

设计课题5:Qtopia移植实验

1、  问题描述:

良好的GUI界面是嵌入式产品设计中不可或缺的部分,Qt/Embedded是一个多平台的C++图形用户界面应用程序框架,其对象容易扩展,可移植性好,支持多个GUI平台的交互开发,而基于Qt/Embedded框架的Qtopia 是Trolltech 公司为采用嵌入式Linux 操作系统的消费电子设备而开发的综合应用平台。

2、  功能设计要求:

1)本系统针对xbase270实验箱,运用Redhat9搭建交叉开发环境,涉及Qt程序的设计,Qtopia平台的移植。

2)Tslib和Qt/E模块:

Ø  交叉编译环境搭建

Ø  编译Tslib源码:Tslib是一个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口。

Ø  编译带Tslib库的Qt/E源码:Qt/E库文件是Qtopia移植所必备的库文件。

3)Qtopia模块:

Ø  交叉编译环境搭建

Ø  Qtopia源码分析及交叉编译

Ø  运用串口或网络的程序下载。

4) Qt程序配置

Ø  用Qt的designer工具设计一个Qt界面程序

Ø  将此程序配置到Qtopia平台中

3、要求:

1)用VMware搭建Redhat9的交叉编译环境;

2)对Qtopia源码的核心部分加必要注释和说明;

3)运用正确的方法进行程序下载;

目录

一、系统介绍... 1

二、总体设计... 2

三.主要模块的实现... 3

四.程序调试... 6

五.总结与体会... 6

六.源程序清单... 6


一、系统介绍

目前嵌入式Linux的主流GUI系统主要有MiniGUI、Microwindows、OpenGUI、Qt/Embedded,这些GUI在接口定义、体系结构、功能特性存在很大差别,采取的技术路线也有所不同。MiniGUI是建立在比较成熟的图形引擎之上,开发的重点在于窗口系统,其小巧精致并且尽量与Win32兼容。MicroWindows目前开发的重点在底层的图形引擎,窗口系统和图形接口方面功能比较欠缺,与Win32和X Windows窗口系统保持兼容,提供了相对完善的图形功能。OpenGUI基于一个用汇编实现的x86图形内核,提供了一个高层的C/C++图形/窗口接口,它的资源消耗小,可移植性差,不支持多进程。

我们这次的实验用的就是基于Qt/Embedded,它具有良好的扩展性和众多优秀的配套工具。

实验过程中,一共用到4个源代码包,下面是它们的介绍说明:

·           Qt/Embedded:Qt/Embedded是一个多平台的C++图形用户界面应用程序框架,其对象容易扩展,可移植性好,支持多个GUI平台的交互开发。现在,Qt/Embedded被广泛地应用于各种嵌入式产品和设备中,从消费电器(如智能手机、机顶盒)到工业控制设备(如医学成像设备、移动信息系统等)。因此本实训项目选择Qt/Embedded为系统的GUI。

·           Qtopia :Qtopia 是Trolltech 公司为采用嵌入式Linux 操作系统的消费电子设备而开发的综合应用平台, 它基于Qt/Embedded框架,所以在编译Qtopia之前先要搭建好Qt/Embedded框架。另外Qtopia包含完整的应用层、灵活的用户界面、窗口操作系统、应用程序启动程序以及开发框架。

·           Tslib:在采用触摸屏的移动终端中,触摸屏性能的调试是个重要问题之一,因为电磁噪声的缘故,触摸屏容易存在点击不准确、有抖动等问题。Tslib是一个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口。

·           Tmake:tmake是一个很好用的生成和管理makefile的工具,他是由Trolltech这家公司开发的,用perl写成。


二、总体设计

移植流程图

图1 流程示意图

1、QT/E的跨平台的移植方法与步骤:

1. 从光盘的QT目录下获得以下文件并解压到 /work目录,如下图:

2. 编译Qt/Embedded的环境参数的设置

在编译Qt/Embedded时,用户在PC机上应对编译时所需的环境变量进行设置(假设Qt解压后目录为/work/qt-2.3.7),主要参数包括:

(1)、QTDIRQt解压后的所在的目录

(2)、LD_LIBRARY_PATHQt共享库存放的目录。

(3)、QPEDIRqtopia解压后的所在的目录

(4)、TMAKEPATHtmake编译工具的路径(假设tmake-1.1所在的目录为/work)

(5)TMAKEDIRtmake编译工具的目录

(6)、PATH交叉编译工具arm-linux-gcc的路径

3. Qt/Embedded的编译配置

4. 针对ARM开发平台的Qt/Embedded的编译

三.主要模块的实现

1、tslib移植

第一步:解压tslib-1.4.tar.gz

        tar -zxvf tslib-1.4.tar.gz

第二步:进入解压过的目录

  

        cd tslib-1.4

第三步:执行tslib-1.4目录下的autogen.sh

         ./autogen.sh

              这一步需要安装一些工具:sudo apt-get install automake

第四步:执行autogen.sh脚本所生成的Makefile文件

        请打入以下命令:

      echo "ac_cv_func_malloc_0_nonnull=yes" >$ARCH-linux.cache

      ./configure --host=arm-softfloat-linux-gnu  --prefix=/home/linux/tslib --cache-file=$ARCH-linux.cache

 

      --host是指你的交叉编译器的前最;例如:你的交叉编译器是arm-linux-gcc,则--host=arm-linux.如果是arm-softfloat-linux-gnu-gcc

      则--host=arm-softfloat-linux-gnu

      --prefix 是你执行make install 的时候编译后生成的可执行文件和库文件以及配置文所安装的目录;

      configure文件下还有好多选项;你可以执行./configure --help 来进行选择其他项,不过在这里这些选项就够了。

第五步:执行make

第六步:执行make install

第七步:把指定安装目录下的tslib的文件都copy到你所挂载的根文件下

        sudo cp -rf /home/linux/tslib/*    /rootfs/tslib

第八步:修改/rootfs/tslib下的etc目录中ts.cong文件

        vi ts.conf  将第二行的#module_raw input修改成module_raw input 注意一定要顶格写否则程序执行时会发生读取ts.conf错误

交叉编译tslib.tar.bz2,其中截图如下:

2.ARM开发平台的Qt/Embedded的编译步骤:

(1)根据编译Qt/Embedded的环境变量的设置方法设置环境变量,实验截图如下:

(2)触摸屏共享库的编译和Qt/Embedded源代码的修改

Qt/Embedded只支持鼠标和键盘的操作,但在大部分嵌入式系统中利用触摸屏,所以用户必须对触摸屏的相关操作编译成共享库或静态库。编译触摸屏库, 将触摸屏相关的头文件复制到qt-2.3.7/include文件夹中;将编译好的触摸屏库文件复制qt-2.3.7/lib文件夹中;

(3)     将patch底下的文件覆盖当前文件。执行configure命令生成编译时所需的Makefile。

文本框: cd $QTDIR
	(copy the qt_patch files to overwrite current files.)
	cp /work/qtopia-1.7.0/src/qt/qconfig-qpe.h /work/qt-2.3.7/src/tools/
	./configure  -xplatform linux-arm-g++ -qconfig qpe
	(color depth: 16 ; Virtual Framebuffer: no)
	 make sub-src

(4)拷贝QT所需文件,并配置环境

文本框: cp /usr/local/arm-linux/qt_toolchain/qt-2.3.2/bin/uic  /work/qt-2.3.7/bin
export  LD_LIBRARY_PATH=/usr/local/arm-linux/qt_toolchain/qt-2.3.2/lib:$LD_LIBRARY_PATH
cd $QPEDIR/src
./configure -xplatform linux-arm-g++
make

(5)编译完成后, 在 $QTDIR/lib生成 ibqte.so*, 所有的应用程序在 $QPEDIR/bin

文本框:     arm-linux-strip -R .note -R .comment bin/*
    arm-linux-strip -R .note -R .comment $QTDIR/lib/libqte.so* $QTDIR/lib/libqpe.so*
    arm-linux-strip -R .note -R .comment plugins/*/*

(6)建立qpe文件夹,将QT所需文件拷贝到qpe文件夹底下。

文本框:        mkdir qpe
        cd qpe
        cp -aR ../qt-2.3.7/lib/ ./
        cp -aR ../qtopia-1.7.0/lib/* ./lib
        cp -aR ../qtopia-1.7.0/apps ./
        cp -aR ../qtopia-1.7.0/bin ./
        cp -aR ../qtopia-1.7.0/plugins ./
        cp -aR ../qtopia-1.7.0/i18n ./
        cp -aR ../qtopia-1.7.0/pics . /
        cp -aR ../qtopia-1.7.0/etc . /
		cp tslib/etc/ts.conf  /qpe/etc
		cp tslib/tests/.libs/ts.calibrate  /qpe/bin
		cp /work/qpe  /usr/qpe

(7). 覆盖脚本/qpe/qpe.sh(如用USB鼠标覆盖/qpe/qpe_moush.sh),覆盖脚本/etc/inittab。

(8)用修改好的qpe文件夹替换文件系统中的qpe文件夹,制作文件系统,烧写完成后重启。因为字体文件比较大,请删除/qpe/lib/fonts底下的没用的字体。注意保留*.qpf文件和fontdir文件。

文本框: [root@hostlocal /]#cp -rf /work/qpe /rootfs270/qpe
[root@hostlocal /]#./mkfs.jffs2 -o rootfs270.img-e0x40000 -r rootfs270 -p -l

3、启动Qtopia

(1)目标板开机

(2)运行脚本qtopia.sh

              ./qtopia.sh

(3)运行qpe

              /Qtopia/bin/qpe

四.程序调试

在程序过程中,Qt/Embedded只支持鼠标和键盘的操作,但在大部分嵌入式系统中利用触摸屏,所以用户必须对触摸屏的相关操作编译成共享库或静态库。个人感觉这个过程最有难度。

五.总结与体会

在课程设计过程中,我们了解到课程设计不光光是埋头做设计,也是同学之间互相学习和互相交流经验和知识的机会。也是我们大家向老师提出疑问和学以致用的机会,这让我们不会成为只知道理论而不会将理论化为实践中去的书呆子。我觉得课程设计就是一个复习课堂上学到知识的机会,也是一个加强学生动手能力设计的机会。更是一个让学习得到升华的过程。

这次课程设计不仅考察了我们对课堂上所学专业知识的理解程度,也锻炼了我们的动手能力。提高了我们独立思考文理,解决问题的能力。总体上看,我觉得这次课程设计是我自身的知识丰富了不少,但同时也发现了自己的不足之处。例如在动手方面,和知识融合方面,不能与实践相结合。软件操作不够熟练,不能灵活运用。是我了解要先学好理论知识才能很好地与实践相结合,才能熟练地运用到生活中。

六.源程序清单

 Qt界面程序:

//textfinder.h

#ifndef TEXTFINDER_H

#define TEXTFINDER_H

#include <QWidget>

namespace Ui {

    class TextFinder;

}             

class TextFinder : public QWidget

{

    Q_OBJECT

public:

    explicit TextFinder(QWidget *parent = 0);

    ~TextFinder();

private slots:

    void on_findButtom_clicked();

private:

    Ui::TextFinder *ui;

    void loadTextFile();

};

#endif // TEXTFINDER_H

//main.cpp

#include <QtGui/QApplication>

#include "textfinder.h"

int main(int argc, char *argv[])

{

    QApplication a(argc, argv);

    TextFinder w;

    w.show();

    return a.exec();

}

//textfinder.cpp

#include "textfinder.h"

#include "ui_textfinder.h"

#include <QtCore/QFile>

#include <QtCore/QTextStream>

TextFinder::TextFinder(QWidget *parent) :

    QWidget(parent),

    ui(new Ui::TextFinder)

{

    ui->setupUi(this);

    loadTextFile();

}

TextFinder::~TextFinder()

{

    delete ui;

}

void TextFinder::on_findButtom_clicked()

{

    QString searchString = ui->lineEdit->text();

    ui->textEdit->find(searchString, QTextDocument::FindWholeWords);

}

void TextFinder::loadTextFile()

{

    QFile inputFile(":/input.txt");

    inputFile.open(QIODevice::ReadOnly);

    QTextStream in(&inputFile);

    QString line = in.readAll();

    inputFile.close();

    ui->textEdit->setPlainText(line);

    QTextCursor cursor = ui->textEdit->textCursor();

    cursor.movePosition(QTextCursor::Start, QTextCursor::MoveAnchor, 1);

}

计算机与通信学院课程设计评分表

课程名称:  嵌入式系统课程设计            

 

                                                    教师签名:            

                                              日    期:                

(注:1.此页附在课程设计报告之后;2.综合成绩按优、良、中、及格和不及格五级评定。)

 

第二篇:嵌入式课程设计报告(交通灯控制、uC-OS-Ⅱ的移植)

任务一 十字路口交通灯控制

一、设计目的:

1.了解基于ARM7核的LPC2106的管脚功能和特点,掌握I/O控制寄存器的设置方法;

2.掌握ARM7应用系统编程开发方法,能用C语言编写应用程序;

3.熟练掌握ADS1.2软件的使用以及PROTEUS仿真调试的方法;

二、具体任务:

1.采用PROTEUS完成十字路口交通灯控制的硬件电路设计,要求单片机选型为飞利浦公司的LPC2106,东西南北方向分别设置红黄绿3个指示灯,东西方向和南北方向各用1个数码管显示通行时间;

2.用ADS1.2编写C语言应用程序,完成十字路口交通灯控制;

3.采用PROTEUS将应用程序装载在LPC2106中,进行仿真验证。要求东西方向和南北方向的数码管显示通行时间并倒计时,可以设置成一样,例如都是9秒倒计时;每当倒计时时间到,完成红黄绿指示灯的状态切换,模拟实现十字路口的交通灯管理控制。

三、硬件电路设计。(参考下图完成硬件电路设计,用屏幕抓图的方式将自己设计的PROTEUS电路图粘贴在下面,并用文字对所设计的电路功能、原理进一步说明)

附图:

硬件电路说明:

硬件说明: 飞利浦公司的LPC2106,双位共阴数码管,交通等模型。

管脚说明:P0.0~P0.6接数码管的段选a~g;P0.7、P0.8接数码管的位选1、2;P0.10~P0.12接交通灯,分别对应南北方向的红、黄、绿和东西方向的绿、黄、红

四、源程序。(只将C语言应用程序附在后面,其它项目文档不要提供,C语言应用程序要有一定的注释说明)

源程序:

#include"config.h"

#include"LPC2106.h"

int8 j=0;                              //定义全局变量j

uint8 led[]={0x3f,0x06,0x5b,0x4f,0x66,

                     0x6d,0x7d,0x07,0x7f,0x6f}; //数码管段选值

/********************************************************

延迟子函数

*******************************************************/

void delay(int t)                             

{

       int i;

       for(i=0;i<t;i++)

       {;}

}

/********************************************************

显示子函数

*******************************************************/

void display(int k)                                    

{

       int i,l,m;                                     //

       l=k/10;                                                     //把数码管十位的值求出并赋给l

       i=k%10;                                                   //把数码管个位的值求出并赋给i

       if(j==0) {m=10;}                               //判断数码管显示的时间所对应的是红灯、绿灯、还是黄灯

       else if(j==1|j==3) {m=11;}                 //

       else if(j==2) { m=12;}                        //

       IOCLR=0xffffffff;                             //io口清零

       IOSET=(1<<m|1<<8);                               //显示灯的颜色,并对数码管位选十位

       IOSET+=led[l];                                        //数码管段选

       delay(100);

       IOCLR=0xffffffff;                             //io清零

       IOSET=(1<<m|1<<7);                               //显示灯的颜色,并对数码管位选个位

       IOSET+=led[i];                                        //数码管段选

       delay(100);

}

/*******************************************************

主函数

*******************************************************/

int main(void)

{

       PINSEL0=0x00000000;                             //配置pinsel0寄存器,io低15位作普通输入输出口

       IODIR=0xffffffff;                              //配置io口为输出

       IOCLR=0xffffffff;                             //io口清零

       while(1)                                            //死循环

       {    

              if(j==0)                                      //南北方向红灯,东西方向绿灯

              {    

                     int i,l;

                     for(i=300000;i>0;i=i-2)        //持续时间设置

                     {

                            l=i/10000;

                            display(l);

                     }

                     j++;

              }

             

             

              if(j==1)                                      //东西南北都为黄灯

              {

                     int i,l;

                     for(i=60000;i>0;i=i-2)          //持续时间设置

                     {

                            l=i/10000;

                            display(l);

                     }

                     j++;

              }

             

             

              if(j==2)                                      //南北方向绿灯,东西方向红灯

              {

                     int i,l;

                     for(i=300000;i>0;i=i-2)        //持续时间设置

                     {

                            l=i/10000;

                            display(l);

                     }

                     j++;

             

              }

                    

              if(j==3)                                      //东西南北都为黄灯

              {

                     int i,l;

                     for(i=60000;i>0;i=i-2)          //持续时间设置

                     {

                            l=i/10000;

                            display(l);

                     }

                    

                     j=0;

              }

       }

}

五、仿真效果。(用屏幕抓图的方式将PROTEUS运行仿真效果图粘贴在下面)

任务二 uC/OS-Ⅱ的移植与应用

一、设计目的:

1.了解嵌入式实时操作系统uC/OS-Ⅱ可移植、可裁剪等性能特点,正确理解实时操作系统中任务、信号、消息、中断等基本概念以及uC/OS-Ⅱ多任务管理的调度算法;

2.掌握uC/OS-Ⅱ在ARM7上移植的方法;

3.能将uC/OS-Ⅱ移植在LPC2106中,并根据具体要求创建用户任务,解决实际问题;

二、具体任务:

1.uC/OS-Ⅱ移植在LPC2106中。

2.编写用户任务程序,完成实时温度的采集控制。硬件电路见参考硬件电路图,图中用滑动变阻器代替温度传感器转换后的电压,用ADC0809完成A/D转换,并用数码管显示出来。

三、参考硬件电路。(用文字对所设计的电路功能、原理做详细说明)

附图:

硬件电路说明:

硬件电路: 飞利浦公司的LPC2106、ADC0808模数转换芯片、四位共阴数码管、按键、74LS04反向器、模拟温度传感器的滑动变阻器。

管脚说明:LPC2106低16位作输出端:P0.0~P0.6接数码管段选a~g;P0.8~P0.10接数码管位选2~4;P0.11接adc0808的转换启动端start,P0.12接adc0808的输出使能端oe;

LPC2106高16位作输入端:P0.16~P0.23接adc的输出端out8~out1:;P0.24接adc转换结束信号端eoc,P0.25接按键;

Adc管脚:in0接温度采集信号;adc a~adc c都接地选中in0;clock接20kHz的时钟信号;

四、源程序。(只将C语言应用程序附在后面,其它项目文档不要提供,C语言应用程序要有一定的注释说明)

源程序:

#include"config.h"

#define    TASK_STK_SIZE  64

#define    KEY                     0x02000000           //定义key

#define START             0x00000800           //定义start

#define EOC                 0x01000000           //定义eoc

#define OE                   0x00001000           //定义oe

uint32   led[10]={0x3f,0x06,0x5b,0x4f,0x66,

                            0x6d,0x7d,0x07,0x7f,0x6f};               //共阴极数码管字形码

uint32     i;           //ADC转换值 

OS_STK        Main_Task_key_Stk[TASK_STK_SIZE];            //定义任务堆栈大小

OS_STK        Main_Task_adc_Stk[TASK_STK_SIZE];

OS_STK        Main_Task_display_Stk[TASK_STK_SIZE];

/******************************************************************************

延时子函数

******************************************************************************/

void delay(uint32 t)             

{

       while(t--);

}

/******************************************************************************

io端口初始化子函数

******************************************************************************/

void IO_init(void)               

{

       PINSEL0=0x00000000;        //32个IO口全初始化为通用IO口

       PINSEL1=0x00000000;       

       IODIR=0x0000ffff;              //低16位为输出口,高16位为输入口

      

}

/******************************************************************************

key任务子函数

******************************************************************************/

void Task_key(void *p_arg)

{

       p_arg=p_arg;                                     //避免编译警告

       TargetInit();                                       //目标初始化

       IO_init();

       while(TRUE)

       {

              while((IOPIN&KEY)!=0);                  //判断按键按下

              delay(2000);

              while((IOPIN&KEY)==0);                 //判断按键松开

              IOCLR=0x0000ffff;

             

              OSTaskSuspend(OS_PRIO_SELF);      //挂起任务

       }

}

/******************************************************************************

adc转换任务子函数

******************************************************************************/

void Task_adc(void*p_arg)

{

       p_arg=p_arg;                                     //避免编译警告

       TargetInit();                                       //目标初始化

       IO_init();

       while(TRUE)

       {

              IOCLR=START;                                 //产生一个正脉冲,启动adc转换

              delay(20);

              IOSET=START;

              delay(50);

              IOCLR=START;

             

              while((IOPIN&EOC)==0);                 //判断ad转换结束

              IOSET=OE;                                      //输出使能

              i=IOPIN&0x00ff0000;                       //数据处理

              i=i>>16;

             

              OSTaskSuspend(OS_PRIO_SELF);      //挂起任务

             

       }

}

/******************************************************************************

display任务子函数

******************************************************************************/

void Task_display(void *p_arg)

{

       int32 g,s,b;                                 //定义个、十、百

       p_arg=p_arg;                              //避免编译警告

       IO_init();                                   //io端口初始化

       while(TRUE)

       {

              b=i/100;                              //百位

              s=(i%100)/10;                      //十位

              g=i%10;                                     //个位

             

              IOSET=(1<<8)|led[b];          //显示百位

              delay(2000);

              IOCLR=0x0000ffff;

             

              IOSET=(1<<9)|led[s];          //显示十位

              delay(2000);

              IOCLR=0x0000ffff;

             

              IOSET=(1<<10)|led[g];        //显示个位

              delay(2000);

              IOCLR=0x0000ffff;

             

              OSTaskResume(1);               //恢复adc任务

             

       }

}

/******************************************************************************

主函数

******************************************************************************/

int main(void)

{

       OSInit();                                    //操作系统初始化

      

       OSTaskCreate(Task_key,(void*)0,&Main_Task_key_Stk[TASK_STK_SIZE-1],0);

       OSTaskCreate(Task_adc,(void*)0,&Main_Task_adc_Stk[TASK_STK_SIZE-1],1);

       OSTaskCreate(Task_display,(void*)0,&Main_Task_display_Stk[TASK_STK_SIZE-1],2);

      

       OSStart();                                         //启动操作系统

       return 0;

      

}

五、仿真效果。(用屏幕抓图的方式将PROTEUS运行仿真效果图粘贴在下面)

相关推荐