《基于嵌入式linux计算器的实现(共26页).doc》由会员分享,可在线阅读,更多相关《基于嵌入式linux计算器的实现(共26页).doc(26页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上沈阳航空航天大学课 程 设 计 报 告课程设计名称:嵌入式系统综合课程设计课程设计题目:基于嵌入式linux计算器的实现院(系): 专 业: 班 级:学 号:姓 名: 指导教师: 完成日期: 专心-专注-专业目 录第1章 系统分析1.1 需求分析课程设计内容和要求: 设计一个简单的计算器,能够进行加、减、乘、除等数学操作。(1) 利用嵌入式linux和Qt,在ARM9上实现。(2) 界面尽可能友好、美观。这是一个简单的计算器软件,功能为加、减、乘、除等,在嵌入式设备上实现,使用方便,性能可靠,基于ARM内核的微处理器在市场上绝对处于领导地位,因此该类项目拥有庞大的市场
2、。1.2 硬件分析将编写好的程序Makefile后,通过Vivi烧入到博创UP-Star2410开发板上,开机运行即可。1.2.1 实验环境实验环境是:win7下安装虚拟机,在虚拟机上安装linux(ubuntu11.10)开发板是:博创UP-Star6410,开发板。软件资源:(1)内核版本linux 2.6.21(2)BootLoader:U-boot(3)文件系统:Cramfs+Yaffs2硬件资源:(1)基于ARM1176JZF-S内核的SAMSUNG S3C6410处理器(2)系统工作频率为533/667MHz(3)256MB Nand Flash、8MB NorFlash(4)25
3、6MB Mobile DDR RAM(5)可外接3.5寸液晶屏或7寸液晶屏、可外接触摸屏(6)1个主USB口、一个USB OTG口(7)100M以太网口、一个USB串口接口(8)JTAG接口(9)总线和可复用资源扩展接口、多媒体支持AUDIO CODEC(10)JOYSTICK按键,1个中断键,5个LED灯1.3 软件分析这次课设我们用的是Linux下的Ubuntu系统。Linux是一样自由和开放源代码的类Unix操作系统。该操作系统的内核由林纳斯托瓦兹在1991年1月5日首次发布。严格来说,术语Linux只表示操作系统内核本身,但通常采用Linux内核来表达该意思。Linux则常用来指基于L
4、inux内核的完整操作系统。包括GUI组件和许多其他的工具。Qt是一个跨平台的C+应用程序开发框架。广泛采用于开发GUI程序,这种情况下又称为部件工具箱。也可用于开发非GUI程序,比如控制台工具和服务器。1.3.1 操作系统简介Ubuntu是一个以桌面应用为主的GUN/Linux操作系统,其名来自非洲南部祖鲁语或科萨语,意思是人性。Ubuntu是基于Debian发布版和GNOME桌面环境,与Debian的不同在于它每6个月会发布一个新版本,每2年发布一个LTS长期支持版本。 普通的桌面版可以获得发布后18个月内的支持,标为LTS(长期支持)的桌面版可以获得更长时间的支持。Ubuntu的目标在于
5、为一般用户提供一个最新的同时又相当稳定的主要由自由软件构建而成的操作系统。1.3.2 开发技术简介Qt是一个1991年由科技开发的跨平台开发框架。它既可以开发程式,也可用于开发非GUI程式,比如控制台工具和服务器,具有下列一些优点:1) 优良的跨平台特性。2) 面向对象。3) 支持2D/3D图形渲染,支持OpenGL。4) 大量的开发文档。5) XML支持。Qt是的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,易于扩展,允许组件编程。2008年,奇趣科技被公司收购,QT也因此成为旗下的工具。2012年,Qt被Digia收购。基
6、本上Qt同X-Window上的Motif、Openwin、GTK等图形界面库和Windows平台上的MFC、OWL、VCL、ATL是同类型的。第2章 系统设计2.1 操作系统移植在电脑上安装Vmware Workstation虚拟机,下载Ubuntu11.04的安装镜像,通过镜像文件将Ubuntu11.04安装在Vmware Workstation工作平台下。进行安装就可以运行Ubuntu系统了。2.2 系统模块设计该软件主要分为四个大的功能模块:(1)图形整合模块:将写成的文本框、按键整齐排列。(2)数字输入模块:将输入的数字显示在文本框上。(3)功能按键模块:将文本框上已经输出的数字进行处
7、理,包括数字运算、 屏幕清零等操作。(4)临时存储模块:将文本框上的数字存入一个寄存器,可进行调用或者清 零。 2.3 函数设计该程序的设计主要函数有以下三个:1) 数字按键函数:构造按键类,对按键的点击可将数字传入文本框,供用户进行操作。2) 功能按键函数:构造按键类,可以使不同的按钮拥有不同的功能,通过信号槽对所有对象进行处理,包括数字存储和操作,给予点击信号量,使其调用该函数。3) 按键整合函数:将文本框、数字按键、功能按键整齐排列、分区。2.4 关键流程这个软件里有几个模块比较关键,分别是对文本框的写入和读出、调用数据完成操作,通过槽函数的连接将按钮和文本框连接,调用各模块的函数对文本
8、框内容进行操作,文本框可存储显示int型和double型的数据。2.4.1 系统主流程进入软件后,软件将显示经函数整理的计算器界面,点击数字按键,将会在文本框上显示相应数字,点击功能按键,会对数字进行运算或存储。系统主流程图如图2.1所示。图2.1 系统主流程图2.4.2 功能按键流程图单击任意功能按键均能对文本框内的数据进行操作,模式相同,但键位过多,所以以概括形式的流程图展示其工作过程。功能按键流程图如图2.2、图2.3所示。图2.2 功能按键流程图(一)图2.3 功能按键流程图(二)第3章 Qt程序移植3.1 建立交叉编译环境 在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运
9、行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码,而这种工具就是交叉编译器(cross compiler)。(1)实验环境交叉编译工具:arm-linux- 4.2.2编译平台:ubuntu10.10开发板类型:UP-Star6410(2)搭建步骤1)在/usr/local/下建立交叉编译器的安装目录arm: sudo mkdir /usr/local/arm2)将下载的交叉编译器包解压到/usr/local/arm目录下: sudo tar jxvf cross-4.2.2-eabi.tar.bz2 -C /usr/l
10、ocal/arm/ 3)解压成功后,修改PATH环境变量: sudo vim /etc/profile 在文件为加入交叉编译器arm-linux-所在的路径: export PATH=$PATH:/usr/local/arm/4.2.2-eabi/usr/bin 然后退出vim。4)更新一下配置文件/etc/profile:source /etc/profile5)检测是否安装成功 现在就可以使用交叉编译器了,写一个测试程序helloworld,交叉编译下,看是否能在开发板上运行。 i. 交叉编译测试程序 arm-linux-gcc helloworld.c -o helloworld ii.
11、把生成的可执行文件helloworld复制到NFS的挂载目录下: sudo cp ./helloworld /nfsboot 注意:本实验中开发板使用NFS挂载rootfs,nfsboot是NFS的挂载目录。 iii.在超级终端上运行:./helloworld,执行结果如图3.1。 图3.1 编译环境测试结果3.2 Qt源文件的编译进入源文件所在目录,输入qmake命令,再输入make调用已经生成的Makefile文件,即可生成可以在开发板上执行的可执行二进制文件。3.3 Qt应用的移植1) 安装UP-Star6410的USB驱动,将开发板的串口与电脑串口相连,打开超级终端,创建连接名称为UP
12、-Star6410,选择COM1,波特率设置为,数据控制流为无,点击确定。2) 将开发板调为Nor Flash,打开电源,打开DNW软件。3) 格式化Nand Flash,然后对开发板进行Uboot、内核、开机画面和文件系统的烧写。4) 进行Qt库的移植,用网络线将PC与开发板相连,在Ubuntu下搭建nfs服务,输入将Ubuntu的ip设置成与开发板一个网段,再将开发板挂载到Ubuntu上,把Qt文件下的lib下的所有文件拷贝到开发板上,并配置环境变量。5) 关闭电源,将开发板调为Nand Flash,打开电源后进入开发板的Linux系统,在命令行输入rz,右键点击超级终端,选择需要发送的Q
13、t应用程序,点击发送。6) 在命令行输入./程序名称,即可打开该Qt程序。第4章 系统调试及运行4.1 调试分析直接运行软件,显示计算器界面,如图4.1所示。 图4.1 计算器界面点击数字按键区会在文本框中显示数据,蓝色框图内为数字键区域,如图4.2所示。 图4.2 数字按键显示 点击功能按钮会对文本框中数据进行操作,以开方运算为例,红色框图内为功能按键区,如图4.3所示。 图4.3 功能按键显示4.2 结果分析1)打开软件后,能正确的对文本框中输入int型数据和double型数据。2)点击运算功能按键时,会对文本框中的数据进行正确运算,并在下一次点击运算按键时,将运算结果显示在文本框上。3)
14、点击存储功能按键时,会将当前文本框中的数据存入一个寄存器中,在点击其他存储按键时对该数据操作。4)总体来看,实现了功能需求中要求的功能,界面友好。参考文献1 刘峥嵘等. 嵌入式Linux应用开发详解M. 北京:机械工业出版社,20042 蔡志明等. 精通Qt4编程(第2版)M. 北京:电子工业出版社,20113 霍亚飞. Qt及Qt Quick开发实战精解 M. 北京:北京航空航天大学出版社,20124 霍亚飞. Qt Creater快速入门M. 北京:北京航空航天大学出版社,20125 陈祥琳. Linux从入门到精通M. 北京:人民邮电出版社,20126 博创公司. UP-Star6410
15、 实验指导v4.0M. 北京博创兴盛科技有限公司7 丁林松等. Qt4图形设计与嵌入式开发M. 北京:人民邮电出版社,2009附 录部分主要源程序代码#include #include #include button.h#include calculator.h/! 0Calculator:Calculator(QWidget *parent) : QDialog(parent) sumInMemory = 0.0; sumSoFar = 0.0; factorSoFar = 0.0; waitingForOperand = true;/! 0/! 1 display = new QLineE
16、dit(0);/! 1 /! 2 display-setReadOnly(true); display-setAlignment(Qt:AlignRight); display-setMaxLength(15); QFont font = display-font(); font.setPointSize(font.pointSize() + 8); display-setFont(font);/! 2/! 4 for (int i = 0; i setSizeConstraint(QLayout:SetFixedSize); mainLayout-addWidget(display, 0,
17、0, 1, 6); mainLayout-addWidget(backspaceButton, 1, 0, 1, 2); mainLayout-addWidget(clearButton, 1, 2, 1, 2); mainLayout-addWidget(clearAllButton, 1, 4, 1, 2); mainLayout-addWidget(clearMemoryButton, 2, 0); mainLayout-addWidget(readMemoryButton, 3, 0); mainLayout-addWidget(setMemoryButton, 4, 0); main
18、Layout-addWidget(addToMemoryButton, 5, 0); for (int i = 1; i addWidget(digitButtonsi, row, column); mainLayout-addWidget(digitButtons0, 5, 1); mainLayout-addWidget(pointButton, 5, 2); mainLayout-addWidget(changeSignButton, 5, 3); mainLayout-addWidget(divisionButton, 2, 4); mainLayout-addWidget(times
19、Button, 3, 4); mainLayout-addWidget(minusButton, 4, 4); mainLayout-addWidget(plusButton, 5, 4); mainLayout-addWidget(squareRootButton, 2, 5); mainLayout-addWidget(powerButton, 3, 5); mainLayout-addWidget(reciprocalButton, 4, 5); mainLayout-addWidget(equalButton, 5, 5); setLayout(mainLayout); setWind
20、owTitle(tr(Calculator);/! 6/! 7void Calculator:digitClicked() Button *clickedButton = qobject_cast(sender(); int digitValue = clickedButton-text().toInt(); if (display-text() = 0 & digitValue = 0.0) return; if (waitingForOperand) display-clear();waitingForOperand = false; display-setText(display-tex
21、t() + QString:number(digitValue);/! 7/! 8void Calculator:unaryOperatorClicked()/! 8 /! 9 Button *clickedButton = qobject_cast(sender(); QString clickedOperator = clickedButton-text(); double operand = display-text().toDouble(); double result = 0.0; if (clickedOperator = tr(Sqrt) if (operand setText(
22、QString:number(result); waitingForOperand = true;/! 9/! 10void Calculator:additiveOperatorClicked()/! 10 /! 11 Button *clickedButton = qobject_cast(sender(); QString clickedOperator = clickedButton-text(); double operand = display-text().toDouble();/! 11 /! 12 if (!pendingMultiplicativeOperator.isEm
23、pty() /! 12 /! 13 if (!calculate(operand, pendingMultiplicativeOperator) abortOperation(); return; display-setText(QString:number(factorSoFar); operand = factorSoFar; factorSoFar = 0.0; pendingMultiplicativeOperator.clear(); /! 13 /! 14 if (!pendingAdditiveOperator.isEmpty() /! 14 /! 15 if (!calcula
24、te(operand, pendingAdditiveOperator) abortOperation(); return; display-setText(QString:number(sumSoFar); else sumSoFar = operand; /! 15 /! 16 pendingAdditiveOperator = clickedOperator;/! 16 /! 17 waitingForOperand = true;/! 17/! 18void Calculator:multiplicativeOperatorClicked() Button *clickedButton
25、 = qobject_cast(sender(); QString clickedOperator = clickedButton-text(); double operand = display-text().toDouble(); if (!pendingMultiplicativeOperator.isEmpty() if (!calculate(operand, pendingMultiplicativeOperator) abortOperation(); return; display-setText(QString:number(factorSoFar); else factor
26、SoFar = operand; pendingMultiplicativeOperator = clickedOperator; waitingForOperand = true;/! 18/! 20void Calculator:equalClicked() double operand = display-text().toDouble(); if (!pendingMultiplicativeOperator.isEmpty() if (!calculate(operand, pendingMultiplicativeOperator) abortOperation(); return
27、; operand = factorSoFar; factorSoFar = 0.0; pendingMultiplicativeOperator.clear(); if (!pendingAdditiveOperator.isEmpty() if (!calculate(operand, pendingAdditiveOperator) abortOperation(); return; pendingAdditiveOperator.clear(); else sumSoFar = operand; display-setText(QString:number(sumSoFar); sum
28、SoFar = 0.0; waitingForOperand = true;/! 20/! 22void Calculator:pointClicked() if (waitingForOperand) display-setText(0); if (!display-text().contains(.) display-setText(display-text() + tr(.); waitingForOperand = false;/! 22/! 24void Calculator:changeSignClicked() QString text = display-text(); dou
29、ble value = text.toDouble(); if (value 0.0) text.prepend(tr(-); else if (value setText(text);/! 24/! 26void Calculator:backspaceClicked() if (waitingForOperand) return; QString text = display-text(); text.chop(1); if (text.isEmpty() text = 0; waitingForOperand = true; display-setText(text);/! 26/! 2
30、8void Calculator:clear() if (waitingForOperand) return; display-setText(0); waitingForOperand = true;/! 28/! 30void Calculator:clearAll() sumSoFar = 0.0; factorSoFar = 0.0; pendingAdditiveOperator.clear(); pendingMultiplicativeOperator.clear(); display-setText(0); waitingForOperand = true;/! 30/! 32
31、void Calculator:clearMemory() sumInMemory = 0.0;void Calculator:readMemory() display-setText(QString:number(sumInMemory); waitingForOperand = true;void Calculator:setMemory() equalClicked(); sumInMemory = display-text().toDouble();void Calculator:addToMemory() equalClicked(); sumInMemory += display-
32、text().toDouble();/! 32/! 34Button *Calculator:createButton(const QString &text, const char *member) Button *button = new Button(text); connect(button, SIGNAL(clicked(), this, member); return button;/! 34/! 36void Calculator:abortOperation() clearAll(); display-setText(tr(#);/! 36/! 38bool Calculato
33、r:calculate(double rightOperand, const QString &pendingOperator) if (pendingOperator = tr(+) sumSoFar += rightOperand; else if (pendingOperator = tr(-) sumSoFar -= rightOperand; else if (pendingOperator = tr(327) factorSoFar *= rightOperand; else if (pendingOperator = tr(367) if (rightOperand = 0.0)
34、 return false;factorSoFar /= rightOperand; return true;/! 38课程设计总结:本次的课程设计结束了,通过这次课程设计,我在Linux、Qt方面收获很多,之前我们曾做过linux以及linux下Qt编程的生产实习,本以为可以轻松完成,但是实际上手自己操作,却发现没那么简单,从开始的设计到后来的实现,每一步都必须十分认真、十分严谨。在设计编写过程中,遇到了很多困难,通过查资料、咨询老师、和同学商量等方式逐个解决,过程很辛苦,但是让我感觉很充实。每一门语言、一个平台的掌握都是一个循序渐进的过程,不是能够一蹴而就的,这也会让我以后扎扎实实地学习、工作,避免一些不必要的错误。这是我们大学的最后一个课程设计,我很珍惜这次机会,将自己学到的东西展示出来。它也会提醒我,面对困难,不要慌张,不要害怕,理性、逻辑地分析,一定可以解决。最后,再次感谢帮助过我的老师和同学。指导教师评语:指导教师(签字): 年 月 日课程设计成绩