




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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
3、、8MB NorFlash (4)256MB 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只表示操作系统内
4、核本身,但通常采用Linux内核来表达该意思。Linux则常用来指基于Linux内核的完整操作系统。包括GUI组件和许多其他的工具。Qt是一个跨平台的C+应用程序开发框架。广泛采用于开发GUI程序,这种情况下又称为部件工具箱。也可用于开发非GUI程序,比如控制台工具和服务器。1.3.1 操作系统简介Ubuntu是一个以桌面应用为主的GUN/Linux操作系统,其名来自非洲南部祖鲁语或科萨语,意思是人性。Ubuntu是基于Debian发布版和GNOME桌面环境,与Debian的不同在于它每6个月会发布一个新版本,每2年发布一个LTS长期支持版本。 普通的桌面版可以获得发布后18个月内的支持,标为
5、LTS(长期支持)的桌面版可以获得更长时间的支持。Ubuntu的目标在于为一般用户提供一个最新的同时又相当稳定的主要由自由软件构建而成的操作系统。1.3.2 开发技术简介Qt是一个1991年由科技开发的跨平台开发框架。它既可以开发程式,也可用于开发非GUI程式,比如控制台工具和服务器,具有下列一些优点: 1) 优良的跨平台特性。 2) 面向对象。 3) 支持2D/3D图形渲染,支持OpenGL。 4) 大量的开发文档。 5) XML支持。Qt是的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc)
6、)以及一些宏,易于扩展,允许组件编程。2008年,奇趣科技被公司收购,QT也因此成为旗下的工具。2012年,Qt被Digia收购。基本上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
7、)图形整合模块:将写成的文本框、按键整齐排列。(2)数字输入模块:将输入的数字显示在文本框上。(3)功能按键模块:将文本框上已经输出的数字进行处理,包括数字运算、 屏幕清零等操作。(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 功能按键流程
9、图(一)图2.3 功能按键流程图(二)第3章 Qt程序移植3.1 建立交叉编译环境 在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码,而这种工具就是交叉编译器(cross compiler)。(1)实验环境交叉编译工具:arm-linux- 4.2.2编译平台:ubuntu10.10开发板类型:UP-Star6410(2)搭建步骤1)在/usr/local/下建立交叉编译器的安装目录arm: sudo mkdir /usr/local/arm2)将下载的交叉编译
10、器包解压到/usr/local/arm目录下: sudo tar jxvf cross-4.2.2-eabi.tar.bz2 -C /usr/local/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,交叉编
11、译下,看是否能在开发板上运行。 i. 交叉编译测试程序 arm-linux-gcc helloworld.c -o helloworld ii.把生成的可执行文件helloworld复制到NFS的挂载目录下: sudo cp ./helloworld /nfsboot 注意:本实验中开发板使用NFS挂载rootfs,nfsboot是NFS的挂载目录。 iii.在超级终端上运行:./helloworld,执行结果如图3.1。 图3.1 编译环境测试结果3.2 Qt源文件的编译进入源文件所在目录,输入qmake命令,再输入make调用已经生成的Makefile文件,即可生成可以在开发板上执行的可执
12、行二进制文件。3.3 Qt应用的移植1) 安装UP-Star6410的USB驱动,将开发板的串口与电脑串口相连,打开超级终端,创建连接名称为UP-Star6410,选择COM1,波特率设置为,数据控制流为无,点击确定。2) 将开发板调为Nor Flash,打开电源,打开DNW软件。3) 格式化Nand Flash,然后对开发板进行Uboot、内核、开机画面和文件系统的烧写。4) 进行Qt库的移植,用网络线将PC与开发板相连,在Ubuntu下搭建nfs服务,输入将Ubuntu的ip设置成与开发板一个网段,再将开发板挂载到Ubuntu上,把Qt文件下的lib下的所有文件拷贝到开发板上,并配置环境变
13、量。5) 关闭电源,将开发板调为Nand Flash,打开电源后进入开发板的Linux系统,在命令行输入rz,右键点击超级终端,选择需要发送的Qt应用程序,点击发送。6) 在命令行输入./程序名称,即可打开该Qt程序。第4章 系统调试及运行4.1 调试分析直接运行软件,显示计算器界面,如图4.1所示。 图4.1 计算器界面点击数字按键区会在文本框中显示数据,蓝色框图内为数字键区域,如图4.2所示。 图4.2 数字按键显示 点击功能按钮会对文本框中数据进行操作,以开方运算为例,红色框图内为功能按键区,如图4.3所示。 图4.3 功能按键显示4.2 结果分析1)打开软件后,能正确的对文本框中输入i
14、nt型数据和double型数据。2)点击运算功能按键时,会对文本框中的数据进行正确运算,并在下一次点击运算按键时,将运算结果显示在文本框上。3)点击存储功能按键时,会将当前文本框中的数据存入一个寄存器中,在点击其他存储按键时对该数据操作。4)总体来看,实现了功能需求中要求的功能,界面友好。参考文献1 刘峥嵘等. 嵌入式Linux应用开发详解M. 北京:机械工业出版社,20042 蔡志明等. 精通Qt4编程(第2版)M. 北京:电子工业出版社,20113 霍亚飞. Qt及Qt Quick开发实战精解 M. 北京:北京航空航天大学出版社,20124 霍亚飞. Qt Creater快速入门M. 北京
15、:北京航空航天大学出版社,20125 陈祥琳. Linux从入门到精通M. 北京:人民邮电出版社,20126 博创公司. UP-Star6410 实验指导v4.0M. 北京博创兴盛科技有限公司7 丁林松等. Qt4图形设计与嵌入式开发M. 北京:人民邮电出版社,2009附 录部分主要源程序代码#include <QtGui>#include <math.h>#include "button.h"#include "calculator.h"/! 0Calculator:Calculator(QWidget *parent) : Q
16、Dialog(parent) sumInMemory = 0.0; sumSoFar = 0.0; factorSoFar = 0.0; waitingForOperand = true;/! 0/! 1 display = new QLineEdit("0");/! 1 /! 2 display->setReadOnly(true); display->setAlignment(Qt:AlignRight); display->setMaxLength(15); QFont font = display->font(); font.setPoint
17、Size(font.pointSize() + 8); display->setFont(font);/! 2/! 4 for (int i = 0; i < NumDigitButtons; +i) digitButtonsi = createButton(QString:number(i), SLOT(digitClicked(); Button *pointButton = createButton(tr("."), SLOT(pointClicked(); Button *changeSignButton = createButton(tr("
18、261"), SLOT(changeSignClicked(); Button *backspaceButton = createButton(tr("Backspace"), SLOT(backspaceClicked(); Button *clearButton = createButton(tr("Clear"), SLOT(clear(); Button *clearAllButton = createButton(tr("Clear All"), SLOT(clearAll(); Button *clearMemo
19、ryButton = 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();
20、 Button *divisionButton = createButton(tr("367"), SLOT(multiplicativeOperatorClicked(); Button *timesButton = createButton(tr("327"), SLOT(multiplicativeOperatorClicked(); Button *minusButton = createButton(tr("-"), SLOT(additiveOperatorClicked(); Button *plusButton = c
21、reateButton(tr("+"), SLOT(additiveOperatorClicked(); Button *squareRootButton = createButton(tr("Sqrt"), SLOT(unaryOperatorClicked(); Button *powerButton = createButton(tr("x262"), SLOT(unaryOperatorClicked(); Button *reciprocalButton = createButton(tr("1/x"),
22、 SLOT(unaryOperatorClicked(); Button *equalButton = createButton(tr("="), SLOT(equalClicked();/! 4/! 5 QGridLayout *mainLayout = new QGridLayout;/! 5 /! 6 mainLayout->setSizeConstraint(QLayout:SetFixedSize); mainLayout->addWidget(display, 0, 0, 1, 6); mainLayout->addWidget(backspa
23、ceButton, 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); mainLayout->addWidg
24、et(addToMemoryButton, 5, 0); for (int i = 1; i < NumDigitButtons; +i) int row = (9 - i) / 3) + 2; int column = (i - 1) % 3) + 1; mainLayout->addWidget(digitButtonsi, row, column); mainLayout->addWidget(digitButtons0, 5, 1); mainLayout->addWidget(pointButton, 5, 2); mainLayout->addWidg
25、et(changeSignButton, 5, 3); mainLayout->addWidget(divisionButton, 2, 4); mainLayout->addWidget(timesButton, 3, 4); mainLayout->addWidget(minusButton, 4, 4); mainLayout->addWidget(plusButton, 5, 4); mainLayout->addWidget(squareRootButton, 2, 5); mainLayout->addWidget(powerButton, 3,
26、 5); mainLayout->addWidget(reciprocalButton, 4, 5); mainLayout->addWidget(equalButton, 5, 5); setLayout(mainLayout); setWindowTitle(tr("Calculator");/! 6/! 7void Calculator:digitClicked() Button *clickedButton = qobject_cast<Button *>(sender(); int digitValue = clickedButton-&g
27、t;text().toInt(); if (display->text() = "0" && digitValue = 0.0) return; if (waitingForOperand) display->clear();waitingForOperand = false; display->setText(display->text() + QString:number(digitValue);/! 7/! 8void Calculator:unaryOperatorClicked()/! 8 /! 9 Button *clic
28、kedButton = qobject_cast<Button *>(sender(); QString clickedOperator = clickedButton->text(); double operand = display->text().toDouble(); double result = 0.0; if (clickedOperator = tr("Sqrt") if (operand < 0.0) abortOperation(); return; result = sqrt(operand); else if (clic
29、kedOperator = tr("x262") result = pow(operand, 2.0); else if (clickedOperator = tr("1/x") if (operand = 0.0) abortOperation(); return; result = 1.0 / operand; display->setText(QString:number(result); waitingForOperand = true;/! 9/! 10void Calculator:additiveOperatorClicked()/!
30、 10 /! 11 Button *clickedButton = qobject_cast<Button *>(sender(); QString clickedOperator = clickedButton->text(); double operand = display->text().toDouble();/! 11 /! 12 if (!pendingMultiplicativeOperator.isEmpty() /! 12 /! 13 if (!calculate(operand, pendingMultiplicativeOperator) abor
31、tOperation(); return; display->setText(QString:number(factorSoFar); operand = factorSoFar; factorSoFar = 0.0; pendingMultiplicativeOperator.clear(); /! 13 /! 14 if (!pendingAdditiveOperator.isEmpty() /! 14 /! 15 if (!calculate(operand, pendingAdditiveOperator) abortOperation(); return; display-&g
32、t;setText(QString:number(sumSoFar); else sumSoFar = operand; /! 15 /! 16 pendingAdditiveOperator = clickedOperator;/! 16 /! 17 waitingForOperand = true;/! 17/! 18void Calculator:multiplicativeOperatorClicked() Button *clickedButton = qobject_cast<Button *>(sender(); QString clickedOperator = c
33、lickedButton->text(); double operand = display->text().toDouble(); if (!pendingMultiplicativeOperator.isEmpty() if (!calculate(operand, pendingMultiplicativeOperator) abortOperation(); return; display->setText(QString:number(factorSoFar); else factorSoFar = operand; pendingMultiplicativeOpe
34、rator = clickedOperator; waitingForOperand = true;/! 18/! 20void Calculator:equalClicked() double operand = display->text().toDouble(); if (!pendingMultiplicativeOperator.isEmpty() if (!calculate(operand, pendingMultiplicativeOperator) abortOperation(); return; operand = factorSoFar; factorSoFar
35、= 0.0; pendingMultiplicativeOperator.clear(); if (!pendingAdditiveOperator.isEmpty() if (!calculate(operand, pendingAdditiveOperator) abortOperation(); return; pendingAdditiveOperator.clear(); else sumSoFar = operand; display->setText(QString:number(sumSoFar); sumSoFar = 0.0; waitingForOperand =
36、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 =
37、display->text(); double value = text.toDouble(); if (value > 0.0) text.prepend(tr("-"); else if (value < 0.0) text.remove(0, 1); display->setText(text);/! 24/! 26void Calculator:backspaceClicked() if (waitingForOperand) return; QString text = display->text(); text.chop(1); i
38、f (text.isEmpty() text = "0" waitingForOperand = true; display->setText(text);/! 26/! 28void 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/! 32void Calculator:clearMemory() sumInMemory = 0.0;void Calculator:readMemory() display->setText(QString:number(sumInMemory);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智能睡眠呼吸训练口罩行业跨境出海战略研究报告
- 独立包装辣条企业制定与实施新质生产力战略研究报告
- 电力设备研发合同(2篇)
- 职场健康管理与锻炼计划
- 2025年人教版四年级英语听说训练计划
- 电商平台财务核算员工作总结与计划范文
- 一年级班级趣味游戏活动计划
- 2025届高三化学复习活动安排计划
- 旅游业农民工工资支付方案设计
- 冥王星干裂区的流体运动与热演化研究-洞察阐释
- 《行政法与行政诉讼法》课件各章节内容-第二十六章 行政赔偿及诉讼
- 2025年江苏省高邮市中考一模物理试题(原卷版+解析版)
- 【9物一模】2025年安徽省合肥市45中(橡树湾)中考一模物理试卷
- 2.1+新民主主义革命的胜利+课件高中政治统编版必修一中国特色社会主义
- 关务培训课件
- 北京市丰台区2025届高三下学期3月一模试题 地理 含答案
- 2025年上海虹口区高三二模英语卷试题及答案详解
- 员工涉黄赌毒协议书
- 招商引资工作课件
- 鄂州职业大学《土木工程数值计算方法》2023-2024学年第一学期期末试卷
- 2025年江苏省南通市海安市十三校中考一模数学试题(原卷版+解析版)
评论
0/150
提交评论