课 程 设 计 报 告
课程名称 嵌入式系统
课题名称 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)、QTDIR-Qt解压后的所在的目录
(2)、LD_LIBRARY_PATH-Qt共享库存放的目录。
(3)、QPEDIR-qtopia解压后的所在的目录
(4)、TMAKEPATH-tmake编译工具的路径(假设tmake-1.1所在的目录为/work)
(5)TMAKEDIR-tmake编译工具的目录
(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。
(4)拷贝QT所需文件,并配置环境
(5)编译完成后, 在 $QTDIR/lib生成 ibqte.so*, 所有的应用程序在 $QPEDIR/bin
(6)建立qpe文件夹,将QT所需文件拷贝到qpe文件夹底下。
(7). 覆盖脚本/qpe/qpe.sh(如用USB鼠标覆盖/qpe/qpe_moush.sh),覆盖脚本/etc/inittab。
(8)用修改好的qpe文件夹替换文件系统中的qpe文件夹,制作文件系统,烧写完成后重启。因为字体文件比较大,请删除/qpe/lib/fonts底下的没用的字体。注意保留*.qpf文件和fontdir文件。
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.综合成绩按优、良、中、及格和不及格五级评定。)
任务一 十字路口交通灯控制
一、设计目的:
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运行仿真效果图粘贴在下面)
7嵌入式系统课程设计必做部分学院电控学院专业通信工程设计名称IIC同步串行通讯1设计的目的1掌握S3C44B0IIC控制器的编程方…
嵌入式系统应用课程设计报告专业班级11电气1班学生姓名朱帅指导教师设计时间20xx20xx第1学期工程技术学院1直流电机控制程序设…
河海大学计算机及信息工程学院常州课程设计报告题目专业学号授课班号学生姓名指导教师完成时间河海大学本科课程设计报告课程设计报告任务书…
中南大学嵌入式系统实验设计报告指导老师吴志虎李志民设计者连金涛专业班级测控0801班学号0909081012时间20xx年6月1实…
嵌入式课程设计实验报告学院专业班级电信1203班姓名学号一实验课题LED每秒一次闪烁二基础知识1定时器分类基本定时器TIM6TIM…
本学期为期一周的嵌入式课程设计在不知不觉中结束了,虽说这次课程设计时间不是很长,但是感觉自己收获颇丰,不仅学习到了一些新知识,回顾…
福建工程学院嵌入式系统课程设计报告书题目基于S3C2440设备驱动及其界面设计班级姓名学号指导老师陈靖张平均李光炀2目录一设计课题…
嵌入式系统课程设计报告基于ARM的楼宇对讲系统设计摘要采用模块化设计方法设计出一款基于ARM微控制芯片和Linux操作系统的楼宇对…
嵌入式系统开发课程设计专周报告题目:具有日历功能的电子时钟系别及专业:计算机工程系计算机应用技术班级:10511学生姓名:XXX指…
河海大学计算机及信息工程学院常州课程设计报告题目专业学号通信工程0862310315授课班号学生姓名指导教师完成时间目录摘要2第一…