基于嵌入式linux计算器的实现技术方案Word文档下载推荐.docx
《基于嵌入式linux计算器的实现技术方案Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于嵌入式linux计算器的实现技术方案Word文档下载推荐.docx(26页珍藏版)》请在冰点文库上搜索。
1.1需求分析
课程设计内容和要求:
设计一个简单的计算器,能够进行加、减、乘、除等数学操作。
(1)利用嵌入式linux和Qt,在ARM9上实现。
(2)界面尽可能友好、美观。
这是一个简单的计算器软件,功能为加、减、乘、除等,在嵌入式设备上实现,使用方便,性能可靠,基于ARM内核的微处理器在市场上绝对处于领导地位,因此该类项目拥有庞大的市场。
1.2硬件分析
将编写好的程序Makefile后,通过Vivi烧入到博创UP-Star2410开发板上,开机运行即可。
1.2.1实验环境
实验环境是:
win7下安装虚拟机,在虚拟机上安装linux(ubuntu11.10)开发板是:
博创UP-Star6410,开发板。
软件资源:
(1)内核版本linux2.6.21
(2)BootLoader:
U-boot
(3)文件系统:
Cramfs+Yaffs2硬件资源:
(1)基于ARM1176JZF-S内核的SAMSUNGS3C6410处理器
(2)系统工作频率为533/667MHz
(3)256MBNandFlash、8MBNorFlash
(4)256MBMobileDDRRAM
-24-
(5)可外接3.5寸液晶屏或7寸液晶屏、可外接触摸屏
(6)1个主USB口、一个USBOTG口
(7)100M以太网口、一个USB串口接口
(8)JTAG接口
(9)总线和可复用资源扩展接口、多媒体支持AUDIOCODEC
(10)JOYSTICK按键,1个中断键,5个LED灯
1.3软件分析
这次课设我们用的是Linux下的Ubuntu系统。
Linux是一样自由和开放源代码的类Unix操作系统。
该操作系统的内核由林纳斯·
托瓦兹在1991年
1月5日首次发布。
严格来说,术语Linux只表示操作系统内核本身,但通常采用Linux内核来表达该意思。
Linux则常用来指基于Linux内核的完整操作系统。
包括GUI组件和许多其他的工具。
Qt是一个跨平台的C++应用程序开发框架。
广泛采用于开发GUI程序,这种情况下又称为部件工具箱。
也可用于开发非GUI程序,比如控制台工具和服务器。
1.3.1操作系统简介
Ubuntu是一个以桌面应用为主的GUN/Linux操作系统,其名来自非洲南部祖鲁语或科萨语,意思是人性。
Ubuntu是基于Debian发布版和GNOME桌面环境,与Debian的不同在于它每6个月会发布一个新版本,每2年发布一个LTS长期支持版本。
普通的桌面版可以获得发布后18个月内的支持,标为LTS(长期支持)的桌面版可以获得更长时间的支持。
Ubuntu的目标在于为一般用户提供一个最新的同时又相当稳定的主要由自由软件构建而成的操作系统。
1.3.2开发技术简介
Qt是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序
开发框架。
它既可以开发GUI程式,也可用于开发非GUI程式,比如控制台工具和服务器,具有下列一些优点:
1)优良的跨平台特性。
2)面向对象。
3)支持2D/3D图形渲染,支持OpenGL。
4)大量的开发文档。
5)XML支持。
Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(MetaObjectCompiler,moc))以及一些宏,易于扩展,允许组件编程。
2008年,奇趣科技被诺基亚公司收购,QT也因此成为诺基亚旗下的编程语言工具。
2012年,
Qt被Digia收购。
基本上Qt同X-Window上的Motif、Openwin、GTK等图形界面库和
Windows平台上的MFC、OWL、VCL、ATL是同类型的。
第2章 系统设计
2.1操作系统移植
在电脑上安装VmwareWorkstation虚拟机,下载Ubuntu11.04的安装镜像,通过镜像文件将Ubuntu11.04安装在VmwareWorkstation工作平台下。
进行安装就可以运行Ubuntu系统了。
2.2系统模块设计
该软件主要分为四个大的功能模块:
(1)图形整合模块:
将写成的文本框、按键整齐排列。
(2)数字输入模块:
将输入的数字显示在文本框上。
(3)功能按键模块:
将文本框上已经输出的数字进行处理,包括数字运算、屏幕清零等操作。
(4)临时存储模块:
将文本框上的数字存入一个寄存器,可进行调用或者清 零。
2.3函数设计
该程序的设计主要函数有以下三个:
1)数字按键函数:
构造按键类,对按键的点击可将数字传入文本框,供用户进行操作。
2)功能按键函数:
构造按键类,可以使不同的按钮拥有不同的功能,通过信号槽对所有对象进行处理,包括数字存储和操作,给予点击信号量,使其调用该函数。
3)按键整合函数:
将文本框、数字按键、功能按键整齐排列、分区。
2.4关键流程
这个软件里有几个模块比较关键,分别是对文本框的写入和读出、调用数据完成操作,通过槽函数的连接将按钮和文本框连接,调用各模块的函数对文本框内容进行操作,文本框可存储显示int型和double型的数据。
2.4.1系统主流程
开始
输入数据
显示在文本框
否
输入完成
是
操作数据
将数据显示在
文本框上
结束
进入软件后,软件将显示经函数整理的计算器界面,点击数字按键,将会在文本框上显示相应数字,点击功能按键,会对数字进行运算或存储。
系统主流程图如图2.1所示。
图2.1 系统主流程图
2.4.2功能按键流程图
单击任意功能按键均能对文本框内的数据进行操作,模式相同,但键位过多,所以以概括形式的流程图展示其工作过程。
功能按键流程图如图2.2、图2.3所示。
从文本框中
读取数据
对数据进行操作
将操作结果显
示在文本框中
图2.2功能按键流程图
(一)
从文本框中读
取第一段数据
清零文本框
在文本框中输
入第二段内容并读取
对两段数据进
行操作
图2.3功能按键流程图
(二)
第3章Qt程序移植
第3章 Qt程序移植
3.1建立交叉编译环境
在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代
码,我们就称这种编译器支持交叉编译。
这个编译过程就叫交叉编译。
简单地说,就是在一个平台上生成另一个平台上的可执行代码,而这种工具就是交叉编译器(crosscompiler)。
(1)实验环境
交叉编译工具:
arm-linux-4.2.2
编译平台:
ubuntu10.10开发板类型:
UP-Star6410
(2)搭建步骤
1)在/usr/local/下建立交叉编译器的安装目录arm:
sudo mkdir/usr/local/arm
2)将下载的交叉编译器包解压到/usr/local/arm目录下:
sudotarjxvfcross-4.2.2-eabi.tar.bz2-C/usr/local/arm/
3)解压成功后,修改PATH环境变量:
sudovim /etc/profile
在文件为加入交叉编译器arm-linux-所在的路径:
exportPATH=$PATH:
/usr/local/arm/4.2.2-eabi/usr/bin
然后退出vim。
4)更新一下配置文件/etc/profile:
source/etc/profile
5)检测是否安装成功
现在就可以使用交叉编译器了,写一个测试程序helloworld,交叉编译下,看是否能在开发板上运行。
i.交叉编译测试程序
arm-linux-gcchelloworld.c-ohelloworld
ii.把生成的可执行文件helloworld复制到NFS的挂载目录下:
sudo cp./helloworld /nfsboot
注意:
本实验中开发板使用NFS挂载rootfs,nfsboot是NFS的挂载目录。
iii.在超级终端上运行:
./helloworld,执行结果如图3.1。
图3.1编译环境测试结果
3.2Qt源文件的编译
进入源文件所在目录,输入qmake命令,再输入make调用已经生成的
Makefile文件,即可生成可以在开发板上执行的可执行二进制文件。
3.3Qt应用的移植
1)安装UP-Star6410的USB驱动,将开发板的串口与电脑串口相连,打开超级终端,创建连接名称为UP-Star6410,选择COM1,波特率设置为115200,数据控制流为无,点击确定。
2)将开发板调为NorFlash,打开电源,打开DNW软件。
3)格式化NandFlash,然后对开发板进行Uboot、内核、开机画面和文件系统的烧写。
4)进行Qt库的移植,用网络线将PC与开发板相连,在Ubuntu下搭建nfs
服务,输入将Ubuntu的ip设置成与开发板一个网段,再将开发板挂载到
Ubuntu上,把Qt文件下的lib下的所有文件拷贝到开发板上,并配置环境变量。
5)关闭电源,将开发板调为NandFlash,打开电源后进入开发板的Linux系统,在命令行输入rz,右键点击超级终端,选择需要发送的Qt应用程序,点击发送。
6)在命令行输入./程序名称,即可打开该Qt程序。
第4章系统调试及运行
第4章 系统调试及运行
4.1调试分析
直接运行软件,显示计算器界面,如图4.1所示。
图4.1计算器界面
点击数字按键区会在文本框中显示数据,蓝色框图内为数字键区域,如图4.2所示。
图4.2数字按键显示
点击功能按钮会对文本框中数据进行操作,以开方运算为例,红色框图内为功能按键区,如图4.3所示。
4.2结果分析
图4.3功能按键显示
1)打开软件后,能正确的对文本框中输入int型数据和double型数据。
2)点击运算功能按键时,会对文本框中的数据进行正确运算,并在下一次点击运算按键时,将运算结果显示在文本框上。
3)点击存储功能按键时,会将当前文本框中的数据存入一个寄存器中,在点击其他存储按键时对该数据操作。
4)总体来看,实现了功能需求中要求的功能,界面友好。
参考文献
[1]刘峥嵘等.嵌入式Linux应用开发详解[M].北京:
机械工业出版社,2004
[2]蔡志明等.精通Qt4编程(第2版)[M].北京:
电子工业出版社,2011
[3]霍亚飞.Qt及QtQuick开发实战精解[M].北京:
北京航空航天大学出版社,
2012
[4]霍亚飞.QtCreater快速入门[M].北京:
北京航空航天大学出版社,2012
[5]陈祥琳.Linux从入门到精通[M].北京:
人民邮电出版社,2012
[6]博创公司.UP-Star6410实验指导v4.0[M].北京博创兴盛科技有限公司
[7]丁林松等.Qt4图形设计与嵌入式开发[M].北京:
人民邮电出版社,2009
附 录
部分主要源程序代码#include<
QtGui>
#include<
math.h>
#include"
button.h"
calculator.h"
//!
[0]
Calculator:
:
Calculator(QWidget*parent)
QDialog(parent)
{
sumInMemory=0.0;
sumSoFar=0.0;
factorSoFar=0.0;
waitingForOperand=true;
[1]
display=newQLineEdit("
0"
);
[1]//!
[2]
display->
setReadOnly(true);
setAlignment(Qt:
AlignRight);
display->
setMaxLength(15);
QFontfont=display->
font();
font.setPointSize(font.pointSize()+8);
setFont(font);
[4]
for(inti=0;
i<
NumDigitButtons;
++i){
digitButtons[i]=createButton(QString:
number(i),SLOT(digitClicked()));
}
Button*pointButton=createButton(tr("
."
),SLOT(pointClicked()));
Button *changeSignButton = createButton(tr("
\261"
),SLOT(changeSignClicked()));
Button *backspaceButton = createButton(tr("
Backspace"
),SLOT(backspaceClicked()));
Button*clearButton=createButton(tr("
Clear"
),SLOT(clear()));
Button*clearAllButton=createButton(tr("
ClearAll"
),SLOT(clearAll()));
Button*clearMemoryButton=createButton(tr("
MC"
),SLOT(clearMemory()));
Button*readMemoryButton=createButton(tr("
MR"
),SLOT(readMemory()));
Button*setMemoryButton=createButton(tr("
MS"
),SLOT(setMemory()));
Button*addToMemoryButton=createButton(tr("
M+"
),SLOT(addToMemory()));
Button *divisionButton = createButton(tr("
\367"
),
SLOT(multiplicativeOperatorClicked()));
Button *timesButton = createButton(tr("
\327"
),SLOT(multiplicativeOperatorClicked()));
Button*minusButton=createButton(tr("
-"
),SLOT(additiveOperatorClicked()));
Button*plusButton=createButton(tr("
+"
Button *squareRootButton = createButton(tr("
Sqrt"
SLOT(unaryOperatorClicked()));
Button*powerButton=createButton(tr("
x\262"
),SLOT(unaryOperatorClicked()));
Button *reciprocalButton = createButton(tr("
1/x"
Button*equalButton=createButton(tr("
="
),SLOT(equalClicked()));
[5]
QGridLayout*mainLayout=newQGridLayout;
[5]//!
[6]
mainLayout->
setSizeConstraint(QLayout:
SetFixedSize);
mainLayout->
addWidget(display,0,0,1,6);
addWidget(backspaceButton,1,0,1,2);
addWidget(clearButton,1,2,1,2);
addWidget(clearAllButton,1,4,1,2);
addWidget(clearMemoryButton,2,0);
addWidget(readMemoryButton,3,0);
addWidget(setMemoryButton,4,0);
addWidget(addToMemoryButton,5,0);
for(inti=1;
introw=((9-i)/3)+2;
intcolumn=((i-1)%3)+1;
addWidget(digitButtons[i],row,column);
addWidget(digitButtons[0],5,1);
addWidget(pointButton,5,2);
addWidget(changeSignButton,5,3);
addWidget(divisionButton,2,4);
addWidget(timesButton,3,4);
addWidget(minusButton,4,4);
addWidget(plusButton,5,4);
addWidget(squareRootButton,2,5);
addWidget(powerButton,3,5);
addWidget(reciprocalButton,4,5);
addWidget(equalButton,5,5);
setLayout(mainLayout);
setWindowTitle(tr("
Calculator"
));
[7]
voidCalculator:
digitClicked()
Button*clickedButton=qobject_cast<
Button*>
(sender());
intdigitValue=clickedButton->
text().toInt();
if(display->
text()=="
&
&
digitValue==0.0)return;
if(waitingForOperand){display->
clear();
waitingForOperand=false;
setText(display->
text()+QString:
number(digitValue));
[8]
unaryOperatorClicked()
[8]//!
[9]
QStringclickedOperator=clickedButton->
text();
doubleoperand=display->
text().toDouble();
doubleresult=0.0;
if(clickedOperator==tr("
)){if(operand<
0.0){
abortOperation();
return;
result=sqrt(operand);
}elseif(clickedOperator==tr("
)){result=pow(operand,2.0);
)){if(operand==0.0){abortOperation();
return;
result=1.0/operand;
setText(QString:
number(result));
waitingFor