linux大作业.docx
《linux大作业.docx》由会员分享,可在线阅读,更多相关《linux大作业.docx(12页珍藏版)》请在冰豆网上搜索。
linux大作业
《嵌入式LINUX应用程序开发
期末大作业》
课程名称:
嵌入式Linux应用程序开发
题目:
基于UP-CUP2440平台的驱动程序开发和QT程序开发
专业:
计算机软件
班级:
111
学号&姓名:
8000611036黄江伟
8000610009符涌
8000611111郭杰
8000611027周治安
完成人数:
4人
起讫日期:
2014-05-20
任课教师:
李岚职称:
副教授
摘要
随着嵌入式技术的不断发展,近年来嵌入式技术在国内得到了广泛应用,在消费电子中得到了普及性的应用,而学习嵌入式系统首先要掌握常用嵌入式处理器、嵌入式操作系统、嵌入式编程语言,即ARM处理器、嵌入式Linux系统、嵌入式C语言,有了这些基础就可以进行前入式Linux应用开发、系统开发、驱动开发等的学习。
本次作业是基于UP-CUP2440平台的驱动程序开发和QT程序开发两个部分,前者是对在所给出的硬件平台上,开发驱动程序,实现跑马灯的基本效果;后者是开发一个QT应用程序,这里我们是在QT上实现计算器。
我们在完成的过程中按照老师的要求,计算器实现了在开发板上和虚拟机上双重的演示效果,实现了知识的迁移,也是大学所学内容理论到实践为数不多的应用。
关键词:
linux,QT,跑马灯,计算器。
目录
一、
团队成员
组长:
黄江伟
组员:
符涌、郭杰、周治安。
二、基于UP-CUP2440平台的驱动程序开发
1、实验内容
学习在linux写针对S3C2440的LED驱动程序,实现跑马灯的效果,按下中断按钮后,开发板上的LED灯将会从左到右依次闪亮,然后从右向左依次闪亮,此为一个周期。
LED灯将会周期闪烁。
2、实验原理
UP-CUP2440开发平台设置了 3 个 GPIO控制的 LED,和 1 个可直接产生外部硬件中断的按键。
LED分别使用 S3C2410/S3C2440的 GPC5,GPC6,GPC7(PXA270 的 GPIO0,GPIO1,GPIO52)三个 GPIO,按键接到 INT5 中断(PXA270的 GPIO97)
3、实现过程
在实验八的基础上对代码进行适当的改进,具体实现源代码部分如下所示:
intflag=0;
irqreturn_ts3c2440_IRQ3_fun(intirq,void*dev_id,structpt_regs*reg)
{
flag++;
if(flag==1){
led01_enable();
mdelay(200);
led01_disable();
mdelay(200);
led02_enable();
mdelay(200);
led02_disable();
mdelay(200);
led03_enable();
mdelay(200);
led03_disable();
}
if(flag==3){
led01_enable();
mdelay(200);
led01_disable();
mdelay(200);
led03_enable();
mdelay(200);
led03_disable();
mdelay(200);
led02_enable();
mdelay(200);
led02_disable();
mdelay(200);
}
if(flag==5){
led01_enable();
led03_enable();
led02_enable();
mdelay(600);
}
if(flag==7){
led01_disable();
led03_disable();
led02_disable();
mdelay(600);
flag=0;
}
}
1)在Fedora中进入目录执行make之后生成驱动测试程序,挂载NFS共享目录:
up-tech:
~ # mount -t nfs 192.168.0.6:
/UP-CUP2440 /mnt/nfs/ -o nolock,rsize=4096,wsize=4096
2)进入串口终端的NFS共享试验目录
3)执行编译成功的程序up-tech:
/mnt/nfs/SRC/exp/basic/09_int # insmod s3c2440-int.ko
三、Linux下的QT应用程序科学计算器的实现
1、实验内容
♦在本机宿主机Linux下编译X11环境的QT库
♦在本机宿主机环境下编译和运行一个程序并显示运行结果
♦在Linux下使用QtDesigner设计QT程序界面
♦在QtDesigner下编写程序,在本机上编译并运行
♦搭建Qt/E环境,移植QT/E到UP-CUP2440型设备上
♦在Qt/E中添加触摸屏鼠标等设备支持
♦利用QtDesigner下编写程序,在ARM设备上运行
2、实验原理
QT的事件机制
3、实现过程
♦使用designer
设计界面,添加窗口组件
信号槽连接
编写事件处理函数
保存工程为.ui文件,得到一个主窗口类
♦编写main.cpp文件进行主窗口类的实例化及显示
♦使用qmake生成.pro工程文件qmake-project
♦通过qmake自动生成Makefile文件qmake
♦ake生成可执行文件
♦运行
代码部分实现如下:
voidcalculator:
:
calculateClick(){
//取出计算式
label->clear();
QStringformula=res->text();
if(check(formula)){
formula=count(formula);
if(!
b){
b=true;
res->setText("");
label->setText("Error:
dividedbyzero");
}
else
res->setText(formula);
}
return;
}
QStringcalculator:
:
count(QStringformula){
//先计算括号中的
if(formula.contains(')')){
intlB=0,rB=0,start=0,end=0;
for(inti=0;iif(formula.at(i)=='('){
lB++;//左括号数
if(lB==1)
start=i;
}
if(formula.at(i)==')')
rB++;//右括号数
if(lB==rB&&lB!
=0){
end=i;
QStringtemp=formula.mid(start+1,end-start-1);
formula.remove(start,end-start+1);
QStringstr=count(temp);
if(start>=1){
if(str.at(0)=='-'&&formula.at(start-1)=='+'){
formula.remove(start-1,1);
formula.insert(start-1,str);
}
elseif(str.at(0)=='-'&&formula.at(start-1)=='-'){
formula.remove(start-1,1);
str="+"+str.mid
(1);
formula.insert(start-1,str);
}
else
formula.insert(start,str);
}
else
formula.insert(start,str);
returncount(formula);
}
}
}
//然后计算乘除
elseif(formula.contains('*')||formula.contains('/')){
intstart=0,end=0,op=0;//运算式开始位,结束位,操作符位
formula="#"+formula+"#";
for(inti=0;iif(op!
=0){
if(formula.at(i)=='*'||formula.at(i)=='/'
||formula.at(i)=='+'||formula.at(i)=='-'
||formula.at(i)=='#'){
if(i!
=op+1){
end=i;
QStringtemp0,temp1,temp2;
temp2=formula.mid(op+1,end-op-1);
temp1=formula.mid(op,1);
temp0=formula.mid(start+1,op-start-1);
formula.remove(start+1,end-start-1);
QStringstr=count(temp0,temp1,temp2);
if(str.at(0)=='-'&&(formula.at(start)=='+'||formula.at(start)=='-')){
str=str.mid
(1);
formula.insert(start+1,str);
if(formula.at(start)=='-'){
formula.remove(start,1);
if(start!
=1)
formula.insert(start,'+');
}
}
else
formula.insert(start+1,str);
formula.remove('#');
returncount(formula);
}
}
}
if(formula.at(i)=='*'||formula.at(i)=='/')
op=i;
if(op==0)
if(formula.at(i)=='+'||formula.at(i)=='-'||formula.at(i)=='#')
start=i;
}
}
//再计算加减
elseif(formula.contains('+')||formula.mid
(1).contains('-')){
intop=0,start=0,end=0;//操作符的位置,以及算术式的结束位
formula=formula+"#";
//第一个字符可能是负号,从第二个字符开始看
for(inti=1;iif(formula.at(i)=='+'||formula.at(i)=='-'||formula.at(i)=='#'){
op++;
if(op==1)start=i;
if(op==2){
end=i;
QStringtemp0,temp1,temp2;
temp2=formula.mid(start+1,end-start-1);
temp1=formula.mid(start,1);
temp0=formula.mid(0,start);
formula.remove(0,end);
formula.remove('#');
formula.insert(0,count(temp0,temp1,temp2));
returncount(formula);
}
}
}
}
//单个操作数直接返回
returnformula;
}
4、演示效果:
科学计算器在Fedora上的演示
科学计算器在开发板上的演示
四、心得体会
经过两个多周的不懈努力,在全组人员的不断争论和探究中,我们基本上不打折扣的完成了老师布置的任务,实现了基于UP-CUP2440平台的驱动程序开发,实现了跑马灯的驱动开发,改进,移植以及演示;Linux下的QT应用程序—科学计算器的开发移植以及演示。
在开发的过程中我们也遇到了各种的问题,以至于交作业的时间远远晚于预期的时间,导致最后才交上作业。
在科学计算器移植到开发板上的过程中,遇见了触摸板不能使用的错误,需要反复的加载程序,加载触摸板功能驱动,花费了我们大量的时间和精力,几乎耗尽了我们的全部耐心,我们不得不在自己的笔记本电脑上安装Fedora和QT,安装的过程费时太久,整整耗费了四个多小时,然后中间还崩溃了两次,万幸,我们顺利的完成了作业,而且还能对操作过程倒背如流了,这不得不说也是一种收获。