1、第1章 系统分析1.1 需求分析课程设计内容和要求: 设计一个简单的计算器,能够进行加、减、乘、除等数学操作。(1) 利用嵌入式linux和Qt,在ARM9上实现。(2) 界面尽可能友好、美观。这是一个简单的计算器软件,功能为加、减、乘、除等,在嵌入式设备上实现,使用方便,性能可靠,基于ARM内核的微处理器在市场上绝对处于领导地位,因此该类项目拥有庞大的市场。1.2 硬件分析将编写好的程序Makefile后,通过Vivi烧入到博创UP-Star2410开发板上,开机运行即可。1.2.1 实验环境实验环境是:win7下安装虚拟机,在虚拟机上安装linux(ubuntu11.10)开发板是:博创U
2、P-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)256MB Mobile DDR RAM(5)可外接3.5寸液晶屏或7寸液晶屏、可外接触摸屏(6)1个主USB口、一个USB OTG口(7)100M以太网口、一个USB串口接口(8)JTAG接口(9)总线和可复用资源扩展接口、多媒体支持AUDI
3、O CODEC(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 操作系统简介Ubunt
4、u是一个以桌面应用为主的GUN/Linux操作系统,其名来自非洲南部祖鲁语或科萨语,意思是人性。Ubuntu是基于Debian发布版和GNOME桌面环境,与Debian的不同在于它每6个月会发布一个新版本,每2年发布一个LTS长期支持版本。 普通的桌面版可以获得发布后18个月内的支持,标为LTS(长期支持)的桌面版可以获得更长时间的支持。Ubuntu的目标在于为一般用户提供一个最新的同时又相当稳定的主要由自由软件构建而成的操作系统。1.3.2 开发技术简介Qt是一个1991年由奇趣科技开发的跨平台C+图形用户界面应用程序开发框架。它既可以开发GUI程式,也可用于开发非GUI程式,比如控制台工具
5、和服务器,具有下列一些优点:1) 优良的跨平台特性。2) 面向对象。3) 支持2D/3D图形渲染,支持OpenGL。4) 大量的开发文档。5) XML支持。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc)以及一些宏,易于扩展,允许组件编程。2008年,奇趣科技被诺基亚公司收购,QT也因此成为诺基亚旗下的编程语言工具。2012年,Qt被Digia收购。基本上Qt同X-Window上的Motif、Openwin、GTK等图形界面库和Windows平台上的MFC、OWL、VCL、ATL是同类型的。第2章 系统设计2.1 操作系统移植
6、在电脑上安装Vmware Workstation虚拟机,下载Ubuntu11.04的安装镜像,通过镜像文件将Ubuntu11.04安装在Vmware Workstation工作平台下。进行安装就可以运行Ubuntu系统了。2.2 系统模块设计该软件主要分为四个大的功能模块:(1)图形整合模块:将写成的文本框、按键整齐排列。(2)数字输入模块:将输入的数字显示在文本框上。(3)功能按键模块:将文本框上已经输出的数字进行处理,包括数字运算、 屏幕清零等操作。(4)临时存储模块:将文本框上的数字存入一个寄存器,可进行调用或者清 零。2.3 函数设计该程序的设计主要函数有以下三个:1) 数字按键函数:
7、构造按键类,对按键的点击可将数字传入文本框,供用户进行操作。2) 功能按键函数:构造按键类,可以使不同的按钮拥有不同的功能,通过信号槽对所有对象进行处理,包括数字存储和操作,给予点击信号量,使其调用该函数。3) 按键整合函数:将文本框、数字按键、功能按键整齐排列、分区。2.4 关键流程这个软件里有几个模块比较关键,分别是对文本框的写入和读出、调用数据完成操作,通过槽函数的连接将按钮和文本框连接,调用各模块的函数对文本框内容进行操作,文本框可存储显示int型和double型的数据。2.4.1 系统主流程进入软件后,软件将显示经函数整理的计算器界面,点击数字按键,将会在文本框上显示相应数字,点击功
8、能按键,会对数字进行运算或存储。系统主流程图如图2.1所示。图2.1 系统主流程图2.4.2 功能按键流程图 单击任意功能按键均能对文本框内的数据进行操作,模式相同,但键位过多,所以以概括形式的流程图展示其工作过程。功能按键流程图如图2.2、图2.3所示。图2.2 功能按键流程图(一)图2.3 功能按键流程图(二)第3章 Qt程序移植3.1 建立交叉编译环境 在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码,而这种工具就是交叉编译器(cross compiler
9、)。(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/local/arm/ 3)解压成功后,修改PATH环境变量: sudo vim /etc/profile 在文件为加入交叉编译器arm-linux-所在的路径: export PA
10、TH=$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.把生成的可执行文件helloworld复制到NFS的挂载目录下: sudo cp ./helloworld /nfsboot 注意:本实验中开发板使用NFS挂载rootfs,nf
11、sboot是NFS的挂载目录。 iii.在超级终端上运行:./helloworld,执行结果如图3.1。图3.1 编译环境测试结果3.2 Qt源文件的编译进入源文件所在目录,输入qmake命令,再输入make调用已经生成的Makefile文件,即可生成可以在开发板上执行的可执行二进制文件。3.3 Qt应用的移植1) 安装UP-Star6410的USB驱动,将开发板的串口与电脑串口相连,打开超级终端,创建连接名称为UP-Star6410,选择COM1,波特率设置为115200,数据控制流为无,点击确定。2) 将开发板调为Nor Flash,打开电源,打开DNW软件。3) 格式化Nand Flas
12、h,然后对开发板进行Uboot、内核、开机画面和文件系统的烧写。4) 进行Qt库的移植,用网络线将PC与开发板相连,在Ubuntu下搭建nfs服务,输入将Ubuntu的ip设置成与开发板一个网段,再将开发板挂载到Ubuntu上,把Qt文件下的lib下的所有文件拷贝到开发板上,并配置环境变量。5) 关闭电源,将开发板调为Nand Flash,打开电源后进入开发板的Linux系统,在命令行输入rz,右键点击超级终端,选择需要发送的Qt应用程序,点击发送。6) 在命令行输入./程序名称,即可打开该Qt程序。第4章 系统调试及运行4.1 调试分析直接运行软件,显示计算器界面,如图4.1所示。 图4.1
13、 计算器界面点击数字按键区会在文本框中显示数据,蓝色框图内为数字键区域,如图4.2所示。 图4.2 数字按键显示 点击功能按钮会对文本框中数据进行操作,以开方运算为例,红色框图内为功能按键区,如图4.3所示。图4.3 功能按键显示4.2 结果分析1)打开软件后,能正确的对文本框中输入int型数据和double型数据。2)点击运算功能按键时,会对文本框中的数据进行正确运算,并在下一次点击运算按键时,将运算结果显示在文本框上。3)点击存储功能按键时,会将当前文本框中的数据存入一个寄存器中,在点击其他存储按键时对该数据操作。4)总体来看,实现了功能需求中要求的功能,界面友好。参考文献1 刘峥嵘等.
14、嵌入式Linux应用开发详解M. 北京:机械工业出版社,20042 蔡志明等. 精通Qt4编程(第2版)M. 北京:电子工业出版社,20113 霍亚飞. Qt及Qt Quick开发实战精解 M. 北京:北京航空航天大学出版社,20124 霍亚飞. Qt Creater快速入门M. 北京:5 陈祥琳. Linux从入门到精通M. 北京:人民邮电出版社,20126 博创公司. UP-Star6410 实验指导v4.0M. 北京博创兴盛科技有限公司7 丁林松等. Qt4图形设计与嵌入式开发M. 北京:人民邮电出版社,2009附 录部分主要源程序代码#include math.h#include bu
15、tton.hcalculator.h/! 0Calculator:Calculator(QWidget *parent) : QDialog(parent) sumInMemory = 0.0; sumSoFar = 0.0; factorSoFar = 0.0; waitingForOperand = true; 1 display = new QLineEdit(0); 1 /! 2 display-setReadOnly(true);setAlignment(Qt:AlignRight);setMaxLength(15); QFont font = display-font(); fon
16、t.setPointSize(font.pointSize() + 8);setFont(font); 4 for (int i = 0; i setSizeConstraint(QLayout:SetFixedSize);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(
17、readMemoryButton, 3, 0);addWidget(setMemoryButton, 4, 0);addWidget(addToMemoryButton, 5, 0); for (int i = 1; int row = (9 - i) / 3) + 2; int column = (i - 1) % 3) + 1;addWidget(digitButtonsi, row, column);addWidget(digitButtons0, 5, 1);addWidget(pointButton, 5, 2);addWidget(changeSignButton, 5, 3);a
18、ddWidget(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); 7v
19、oid Calculator:digitClicked() Button *clickedButton = qobject_cast(sender(); int digitValue = clickedButton-text().toInt(); if (display-text() = & digitValue = 0.0) return; if (waitingForOperand) clear(); waitingForOperand = false;setText(display-text() + QString:number(digitValue); 8unaryOperatorCl
20、icked() 8 /! 9 QString clickedOperator = clickedButton-text(); double operand = display-text().toDouble(); double result = 0.0; if (clickedOperator = tr() if (operand 0.0) abortOperation(); result = sqrt(operand); else if (clickedOperator = tr( result = pow(operand, 2.0); if (operand = 0.0) result =
21、 1.0 / operand;setText(QString:number(result); 10additiveOperatorClicked() 10 /! 11 11 /! 12 if (!pendingMultiplicativeOperator.isEmpty() 12 /! 13calculate(operand, pendingMultiplicativeOperator) number(factorSoFar); operand = factorSoFar; pendingMultiplicativeOperator.clear(); 13 /! 14pendingAdditiveOperator.isEmpty() 14 /! 15calculate(operand, pendingAdditiveOperator)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1