基于嵌入式linux计算器的实现

合集下载

嵌入式Linux驱动开发教程PDF

嵌入式Linux驱动开发教程PDF

嵌入式Linux驱动开发教程PDF嵌入式Linux驱动开发教程是一本非常重要和实用的教材,它主要介绍了如何在Linux操作系统上开发嵌入式硬件设备的驱动程序。

嵌入式系统是指将计算机系统集成到其他设备或系统中的特定应用领域中。

嵌入式设备的驱动程序是连接操作系统和硬件设备的关键接口,所以对于嵌入式Linux驱动开发的学习和理解非常重要。

嵌入式Linux驱动开发教程通常包括以下几个主要的内容:1. Linux驱动程序的基础知识:介绍了Linux设备模型、Linux内核模块、字符设备驱动、块设备驱动等基本概念和原理。

2. Linux驱动编程的基本步骤:讲解了如何编译和加载Linux内核模块,以及编写和注册设备驱动程序所需的基本代码。

3. 设备驱动的数据传输和操作:阐述了如何通过驱动程序与硬件设备进行数据的传输和操作,包括读写寄存器、中断处理以及与其他设备的通信等。

4. 设备驱动的调试和测试:介绍了常用的驱动调试和测试技术,包括使用调试器进行驱动程序的调试、使用模拟器进行驱动程序的测试、使用硬件调试工具进行硬件和驱动的联合调试等。

通常,嵌入式Linux驱动开发教程的PDF版本会提供示例代码、实验步骤和详细的说明,以帮助读者更好地理解和掌握嵌入式Linux驱动开发的核心技术和要点。

读者可以通过跟随教程中的示例代码进行实际操作和实验,深入了解和体验嵌入式Linux驱动开发的过程和方法。

总之,嵌入式Linux驱动开发教程是一本非常重要和实用的教材,对于想要在嵌入式领域从事驱动开发工作的人员来说,具有非常重要的指导作用。

通过学习嵌入式Linux驱动开发教程,读者可以系统地了解和学习嵌入式Linux驱动开发的基本原理和技术,提高自己在嵌入式Linux驱动开发方面的能力和水平。

嵌入式linux开发课程设计

嵌入式linux开发课程设计

嵌入式linux开发课程设计一、课程目标知识目标:1. 理解嵌入式Linux系统的基本概念、原理和架构。

2. 掌握嵌入式Linux开发环境的搭建与使用。

3. 学习嵌入式Linux内核配置、编译与移植方法。

4. 掌握常见的嵌入式Linux设备驱动编程技术。

技能目标:1. 能够独立搭建嵌入式Linux开发环境。

2. 熟练运用Makefile、交叉编译工具链进行代码编译。

3. 能够编写简单的嵌入式Linux设备驱动程序。

4. 学会分析并解决嵌入式Linux开发过程中的常见问题。

情感态度价值观目标:1. 培养学生对嵌入式系统开发的兴趣,提高学习积极性。

2. 培养学生的团队协作意识,增强沟通与表达能力。

3. 培养学生勇于克服困难,面对挑战的精神。

分析课程性质、学生特点和教学要求:本课程为高年级专业课程,要求学生具备一定的C语言基础和计算机硬件知识。

课程性质为理论与实践相结合,注重培养学生的实际动手能力。

针对学生特点,课程目标设定了明确的知识点和技能要求,旨在使学生能够掌握嵌入式Linux开发的基本方法,为后续项目实践和职业发展奠定基础。

课程目标分解为具体学习成果:1. 学生能够阐述嵌入式Linux系统的基本概念、原理和架构。

2. 学生能够自主搭建嵌入式Linux开发环境,并进行简单的程序编译与运行。

3. 学生能够编写简单的嵌入式Linux设备驱动程序,并实现相应的功能。

4. 学生能够针对嵌入式Linux开发过程中遇到的问题,提出合理的解决方案,并进行实际操作。

二、教学内容1. 嵌入式Linux系统概述- 嵌入式系统基本概念- 嵌入式Linux的发展历程- 嵌入式Linux系统的特点与优势2. 嵌入式Linux开发环境搭建- 交叉编译工具链的安装与配置- 嵌入式Linux文件系统制作- 常用开发工具的使用(如Makefile、GDB)3. 嵌入式Linux内核与驱动- 内核配置与编译- 内核移植方法- 常见设备驱动编程(如字符设备、块设备、网络设备)4. 实践项目与案例分析- 简单嵌入式Linux程序编写与运行- 设备驱动程序编写与调试- 分析并解决实际问题(如系统性能优化、故障排查)教学内容安排与进度:1. 嵌入式Linux系统概述(2课时)2. 嵌入式Linux开发环境搭建(4课时)3. 嵌入式Linux内核与驱动(6课时)4. 实践项目与案例分析(8课时)本教学内容基于课程目标,结合教材章节内容,注重理论与实践相结合,旨在培养学生的实际动手能力和解决问题的能力。

嵌入式实验一(嵌入式 Linux 开发环境的搭建及 Makefile 应用)

嵌入式实验一(嵌入式 Linux 开发环境的搭建及 Makefile 应用)

实验一嵌入式 Linux 开发环境的搭建及 Makefile 应用一、实验目的:1.熟悉嵌入式 Linux 开发基本过程及基本命令。

2.了解嵌入式 Linux 开发中各种工具的基本用途。

3.搭建好嵌入式 Linux 的开发环境。

4.通过对包含多文件的 Makefile 的编写,熟悉各种形式的Makefile 编写,加深对 Makefile 中用户自定义变量、自动变量及预定义变量的理解。

二、实验内容:1.安装 Vmware 及 Ubuntu;2.熟悉 Linux 下相关命令:属性查询、修改,路径、目录的查询、修改、删除,压缩、解压等;3.熟悉编辑工具;4.熟悉 makefile 文件的基本作用(编写一个包含多文件的Makefile)。

三、Make 工程管理器:Makefile如今能得以广泛应用,这还得归功于它被包含在Unix系统中。

在make诞生之前,Unix系统的编译系统主要由“make”、“install”shell脚本程序和程序的源代码组成。

它可以把不同目标的命令组成一个文件,而且可以抽象化依赖关系的检查和存档。

这是向现代编译环境发展的重要一步。

1977年,斯图亚特·费尔德曼在1贝尔实验室里制作了这个软件。

2003年,斯图亚特·费尔德曼因发明了这样一个重要的工具而接受了美国计算机协会(ACM)颁发的软件系统奖。

Makefile文件是可以实现自动化编译,只需要一个“make”命令,整个工程就能完全自动编译,极大的提高了软件开发的效率。

目前虽有众多依赖关系检查工具,但是make是应用最广泛的一个。

一个程序员会不会写makefile,从一个侧面说明了这个程序员是否具备完成大型工程的能力。

1.Makefile 基本规则一个简单的 Makefile 语句由目标、依赖条件、指令组成。

smdk6400_config :unconfig@mkdir -p $(obj)include $(obj)board/samsung/smdk6400其中:smdk6400_config:目标;unconfig:先决条件;@mkdir -p $(obj)include $(obj)board/samsung/smdk6400:指令。

嵌入式系统之基于QT的简单计算器

嵌入式系统之基于QT的简单计算器

嵌入式系统课程设计报告题目:基于QT的简单计算器专业:计算机科学与技术班级:姓名:学号:指导老师:日期:2012-12-26第一章前言1.1设计背景计算器(calculator;counter)一般是指“电子计算器”,计算器是能进行数学运算的手持机器,拥有集成电路芯片,其结构简单,比现代电脑结构简单得多,可以说是第一代的电子计算机(电脑)。

计算器这一小小的程序机器实际上是从计算机中割裂出来的衍生品,虽然功能较单一,但因其操作模式的方便快捷和价格的低廉,携带方便等特点,已经被广泛应用于工程、学习、商业贸易等日常生活中,极大的方便了人们对于数字的整合运算,成为人们生活和办公中的必备品之一,深得使用者的青睐。

1.2设计目的本程序是基于linux下的嵌入式开发,所用软件为QT Creator,程序虽然简单,但是通过本程序的设计,可以进一步了解嵌入式系统开发工具以及熟悉linux 环境下的常用命令,为以后进入嵌入式领域打下一定的基础。

通过该计算器程序软件的设计,培养独立思考、综合运用所学有关相应知识的能力,更好地巩固《C++程序语言设计》和《高级程序设计》课程学习的内容,掌握工程软件设计的基本方法,强化上机动手编程能力,体验理论与实践相结合的过程。

第二章功能需求分析2.1功能描述本次设计的计算器在功能上大致与Windows系统自带的计算器程序相似,对于所设计的科学计算器,其功能大致为可以进行加(+)、减(-)、乘(*)、除(/)、简单算术计算。

由于接触QT时间还不太久,所以目前只能简单地实现这些功能,相信随着以后逐步的了解,本程序将实现更多的功能。

第三章开发工具简介3.1 QT简介由于本次设计的小程序是用QT Creator所设计的,所以我觉得有必要先介绍下QT开发工具的背景。

Qt是一个1991年由奇趣科技开发的跨平台C++图形界面应用程序开发框架。

它既可以开发GUI程式,也可用于开发非GUI程式,比如控制台工具和服务器。

嵌入式系统之基于QT的简单计算器

嵌入式系统之基于QT的简单计算器

嵌入式系统之基于QT的简单计算器QT是一种跨平台的应用程序开发框架,它提供了一种编写图形用户界面(GUI)程序的简便方法。

在嵌入式系统中,使用QT可以快速开发出各种功能强大、界面友好的应用程序。

对于一个简单计算器来说,主要包括用户界面设计和计算逻辑两部分。

首先,我们需要设计一个界面来展示计算器的按钮和显示结果的区域。

在QT中,可以使用QGridLayout布局管理器来创建按钮布局,同时将其连接到对应的信号槽函数上,以实现按钮的点击响应。

```cpp//main.qmlimport QtQuick 2.12import QtQuick.Window 2.12import QtQuick.Controls 2.12Windowvisible: truewidth: 400height: 600title: "Simple Calculator"RowLayoutspacing: 10GridLayoutid: buttonGridrows: 4columns: 4anchors.horizontalCenter: parent.horizontalCenter anchors.verticalCenter: parent.verticalCenter Buttontext: "7"onClicked: calculator.append("7")}Buttontext: "8"onClicked: calculator.append("8")}// ... more buttons ...Buttontext: "="onClicked: calculator.calculate}// ... more buttons ...}TextFieldid: resultFieldwidth: 200height: 50placeholderText: "0"readOnly: true}}```在这个示例中,我们使用了QT的QML语言来创建用户界面。

《嵌入式Linux开发》课件

《嵌入式Linux开发》课件

交叉编译工具链的安装
指导如何安装适用于目标板的交叉编译工具 链。
测试交叉编译环境
提供一种简单的方法来测试交叉编译环境是 否设置成功。
目标板与宿主机的连接方式
串口通信
介绍如何通过串口连接目标板和宿主机 ,以及串口通信的配置和常用命令。
USB连接
介绍如何通过USB连接目标板和宿主 机,以及USB通信的配置和常用命令
02
03
嵌入式系统
是一种专用的计算机系统 ,主要用于控制、监视或 帮助操作机器与设备。
特点
具有实时性、硬件可裁剪 、软件可定制、低功耗、 高可靠性等特点。
应用
汽车电子、智能家居、医 疗设备、工业自动化等领 域。
Linux作为嵌入式操作系统的优势
开源
Linux是开源的,可以免费使用和定制,降 低了开发成本。
路由与交换
介绍路由器和交换机的原理及在网 络中的作用。
03
02
IP地址
解释IP地址的分类、寻址方式以及子 网掩码的作用。
网络安全
简述常见的网络安全威胁和防范措 施。
04
TCP/IP协议栈简介
TCP/IP协议栈结构
详细描述TCP/IP协议栈的层次结构,包括应 用层、传输层、网络层和链路层。
IP协议
解释IP协议的核心功能,如地址解析、路由 选择等。
调试工具
介绍常用的调试工具,如gdbserver和gdb等,并说明如何使用这些 工具进行远程调试。
调试过程
详细描述调试过程,包括启动调试会话、设置断点、单步执行代码等 操作。
调试技巧与注意事项
提供调试过程中的一些技巧和注意事项,以提高调试效率和准确性。
03
嵌入式Linux系统开发基础

嵌入式linux系统开发标准教程

嵌入式linux系统开发标准教程

嵌入式linux系统开发标准教程嵌入式Linux系统开发是一门非常重要的技术,它在嵌入式设备、物联网和智能家居等领域中得到广泛应用。

本文将介绍嵌入式Linux系统开发的标准教程,帮助读者了解该技术的基本原理和常用的开发工具。

一、嵌入式Linux系统开发的基本原理嵌入式Linux系统开发是指将Linux操作系统移植到嵌入式设备中,并针对特定的应用领域进行定制开发。

它与传统的桌面Linux系统有很大的区别,主要体现在以下几个方面:1. 硬件平台的选择:嵌入式设备通常采用ARM架构或者其他低功耗的处理器架构,而不是传统的x86架构。

因此,在进行嵌入式Linux系统开发时,需要根据具体的处理器架构进行相应的移植和优化。

2. 精简的内核:由于嵌入式设备的资源有限,为了提高系统性能和节省资源,嵌入式Linux系统通常会精简内核。

这需要对Linux内核的源代码进行裁剪和优化,以去除不必要的模块和功能,并保留对应用需求的必要功能。

3. 定制化的驱动程序和应用程序:嵌入式设备通常需要与各种外设进行交互,因此需要编写相应的驱动程序。

此外,根据具体的应用需求,还需要定制相关的应用程序和用户界面。

二、嵌入式Linux系统开发的工具嵌入式Linux系统开发需要使用一些常用的工具,下面是一些常用的工具和其功能的介绍:1. 交叉编译工具链:由于嵌入式设备和开发主机的处理器架构不同,无法直接在开发主机上编译和运行目标代码。

因此,需要使用交叉编译工具链,在开发主机上生成适用于目标设备的可执行文件。

2. 调试工具:在嵌入式Linux系统开发过程中,调试是非常重要的一环。

常用的调试工具包括GDB(GNU调试器)和strace(系统调用跟踪工具),它们可以帮助开发人员追踪程序的执行过程和定位错误。

3. 文件系统工具:嵌入式设备的存储资源有限,需要使用文件系统来组织和管理存储的数据。

常用的文件系统工具包括mkfs(创建文件系统)、mount(挂载文件系统)以及文件传输工具(如scp和rsync)等。

嵌入式Linux系统开发教程实验报告

嵌入式Linux系统开发教程实验报告

嵌入式实验报告:学号:学院:日期:实验一熟悉嵌入式系统开发环境一、实验目的熟悉Linux 开发环境,学会基于S3C2410 的Linux 开发环境的配置和使用。

使用Linux的armv4l-unknown-linux-gcc 编译,使用基于NFS 方式的下载调试,了解嵌入式开发的基本过程。

二、实验容本次实验使用Redhat Linux 9.0 操作系统环境,安装ARM-Linux 的开发库及编译器。

创建一个新目录,并在其中编写hello.c 和Makefile 文件。

学习在Linux 下的编程和编译过程,以及ARM 开发板的使用和开发环境的设置。

下载已经编译好的文件到目标开发板上运行。

三、实验设备及工具硬件::UP-TECH S2410/P270 DVP 嵌入式实验平台、PC 机Pentium 500 以上, 硬盘10G 以上。

软件:PC 机操作系统REDHAT LINUX 9.0+超级终端(或X-shell)+AMR-LINUX 开发环境。

四、实验步骤1、建立工作目录[rootlocalhost root]# mkdir hello[rootlocalhost root]# cd hello2、编写程序源代码我们可以是用下面的命令来编写hello.c的源代码,进入hello目录使用vi命令来编辑代码:[rootlocalhost hello]# vi hello.c按“i”或者“a”进入编辑模式,将上面的代码录入进去,完成后按Esc 键进入命令状态,再用命令“:wq!”保存并退出。

这样我们便在当前目录下建立了一个名为hello.c的文件。

hello.c源程序:#include <stdio.h>int main() {char name[20];scanf(“%s”,name);printf(“hello %s”,name);return 0;}3、编写Makefile要使上面的hello.c程序能够运行,我们必须要编写一个Makefile文件,Makefile文件定义了一系列的规则,它指明了哪些文件需要编译,哪些文件需要先编译,哪些文件需要重新编译等等更为复杂的命令。

嵌入式--计算器--实验报告

嵌入式--计算器--实验报告

嵌入式--计算器--实验报告本页仅作为文档页封面,使用时可以删除This document is for reference only-rar21year.March计算器设计实验报告一、实验设计主要分工04009320 文斌:算法设计,LCD显示。

04** 张希:界面(按钮控件)设计,文件内容读取。

共同调试、完善设计。

二、程序设计实现功能效果(1)支持整数、小数基本加减乘除运算;(2)有优先级的判别计算。

优先级由高到低一次为括号运算、乘除运算、加减运算。

(3)支持键盘输入和触摸屏输入;(4)能读取指定目录下文本内容(内容为计算表达式)并计算得出结果,将内容和结果显示在LCD上。

程序任务开始后,等待键盘或触摸屏的输入。

输入键有0~9数字键、+-*/()运算符、del退格键、clear清屏键、read读指定目录文本内容并计算键、enter'='键、‘.’小数点键。

每当有字符输入时,触摸屏相应键显示“AAA”,100ms后恢复原相应按键符号,同时LCD屏幕上显示相应字符。

当输入'del'键时,屏幕显示去掉最后一位字符。

当输入'='号后,得出计算结果,结果显示于表达式的下一行。

若是除零错误,则结果显示为“/0ERROR!”。

若有非法字符(触摸点不能识别为设计按键符则视为非法字符),则结果输出为“Syntax Error!!”。

若表达式有运算符连续输入,则忽略前面的运算符,只取最后一位运算符计算,正常显示数字结果。

当输入'clear'键时,情况显示区域。

当输入'read'键时,从指定目录文本文件中读取表达式并计算。

将表达式内容和计算结果显示在LCD上。

LCD显示界面如下:三、程序算法实现1、计算算法首先将输入的0~9数字、+-*/()运算符的内容存储于一个全局变量cal[number]中,表达为中缀表达式。

用void str2repol()函数,将输入字符串cal[number]转换成逆波兰表达式并存于全局数组char repol[maxs]中。

嵌入式linux实验报告

嵌入式linux实验报告

嵌入式linux实验报告嵌入式Linux实验报告一、引言嵌入式系统是指嵌入在各种设备中的计算机系统,它通常包括硬件和软件两部分。

而Linux作为一种开源的操作系统,被广泛应用于嵌入式系统中。

本实验报告将介绍嵌入式Linux的相关实验内容和实验结果,以及对实验过程中遇到的问题的解决方法。

二、实验目的本次实验旨在通过搭建嵌入式Linux系统,了解Linux在嵌入式领域的应用,并掌握相关的配置和调试技巧。

具体目标如下:1. 理解嵌入式系统的基本概念和原理;2. 掌握Linux内核的编译和配置方法;3. 熟悉交叉编译环境的搭建和使用;4. 实现简单的应用程序开发和调试。

三、实验环境1. 硬件环境:嵌入式开发板、计算机;2. 软件环境:Ubuntu操作系统、交叉编译工具链、嵌入式Linux内核源码。

四、实验步骤与结果1. 内核编译与配置通过下载嵌入式Linux内核源码,使用交叉编译工具链进行编译和配置。

在编译过程中,需要根据实际需求选择合适的内核配置选项。

编译完成后,生成内核镜像文件。

2. 系统烧录与启动将生成的内核镜像文件烧录到嵌入式开发板中,并通过串口连接进行启动。

在启动过程中,可以观察到Linux内核的启动信息,并通过串口终端进行交互。

3. 应用程序开发与调试在嵌入式Linux系统中,可以通过交叉编译工具链进行应用程序的开发。

开发过程中,需要注意与目标平台的兼容性和调试方法。

通过调试工具,可以实时监测应用程序的运行状态和调试信息。

五、实验结果与分析在本次实验中,我们成功搭建了嵌入式Linux系统,并实现了简单的应用程序开发和调试。

通过观察实验结果,我们可以得出以下结论:1. 嵌入式Linux系统的搭建需要一定的配置和编译知识,但通过合理的配置选项和编译参数,可以实现系统的定制化;2. 应用程序的开发过程中,需要注意与目标平台的兼容性和调试方法,以确保程序的正确运行和调试的有效性;3. 嵌入式Linux系统的稳定性和性能受到硬件和软件的综合影响,需要进行系统级的优化和调试。

毕业设计论文:基于嵌入式Linux远程监控系统的设计与实现

毕业设计论文:基于嵌入式Linux远程监控系统的设计与实现

毕业设计论文:基于嵌入式Linux远程监控系统的设计与实现摘要可编程逻辑控制器(PLC)不仅在工业控制中应用越来越广泛,而且在其他领域的应用也逐渐扩大,例如:电力、化工、能源、水利等。

由于它的功能比较强大、使用安全可靠、维护简单方便的优点,在很多地方已经取代了继电器电路的逻辑控制。

在对水中泥沙搅拌的处理过程中,需要速度控制比较稳定,而且能够进行不同速度的操作;在拖动的处理过程中更加要求精确性。

因此,PLC控制电机逐渐被人们运用到搅拌和拖动控制系统中。

本文讲述了基于PLC的电动机控制系统设计和实现过程。

本系统将PLC、变频器、编码器、电动机、搅拌器、传感器有机地结合起来,组成一个简单完整的自动控制系统。

通过台达WPLSoft软件平台编写程序并写入PLC后,控制电动机实现多段速的运行。

在本文中还有一个值得介绍的就是高速计数的实现。

通过高速计数器可以对拖动系统进行精确的控制,并且把计数值存放于固定的寄存器,以方便其他设备完成对系统的操作和监控。

关键词:PLC 电动机高速计数器ABSTRACTProgrammable Logic Controller (PLC), not only in the application of industrial control more and more widely, but in the application of other fields have also gradually expanded, such as: electric power, chemical, energy, water and so on.。

Because of its powerful features, the safety and reliability of use, easy to maintain , it has replaced the circuits logic control in many places. In the sediment of water mixing process,speed controling is more stable, and it can be operated at different speeds; in the processing of dragging,it needs more reliability . Thus, PLC controlling motor is applied to mixing and dragging control system gradully.This article describes design and implementation process of the PLC-based motor controlling system . PLC,Inverter, encoders, motors, mixers and sensors are combined to form a simple, complete automatic control system.Programs are designed and wrote into PLC through the software platform of Delta WPLSoft, then control multi-speed motor operation.In this paper the realization of high-speed counting is described valuablely. High-speed counter can control the dragging systems precisely, and keep the data in the fixed register in order to make other equipments operate and monitor the system convientely.Key words: PLC motor high-speed counter目录第一章绪论 (1)1.1 题目来源及课题意义 (1)1.2 文章概述 (1)1.3 设计思路 (2)第二章电动机篇 (3)2.1 电动机概述及分类 (3)2.2 交流异步电动机 (4)2.3 电动机变频调速 (5)2.4 变频调速的控制原理 (7)第三章编码器篇 (9)3.1 编码器杂谈 (9)3.1.1 编码器的发展史 (9)3.1.2 编码器的分类 (9)3.2 旋转编码器 (10)3.2.1 旋转编码器的工作原理 (10)3.2.2 旋转编码器的分辨率和精度 (11)3.3 台达编码器ES3-02CN6941 (12)第四章PLC篇 (14)4.1 PLC的定义及其功能 (14)4.2 PLC的优缺点 (14)4.3 PLC工作方式 (15)4.4 PLC的工作过程 (15)4.5 台达PLC:DVP32ES00R2 (16)4.5.1 DVP ES 常用指令介绍 (16)4.5.2各种装置的功能 (18)4.6 高速计数的方法 (20)4.6.1 概述 (20)4.6.2 计数模式:递增模式、递减模式 (22)4.6.3 高速计数器指令 (22)第五章综合篇 (25)5.1 总体程序设想 (25)5.1.1 流程图 (25)5.1.2 各个开关设置 (25)5.1.3 系统分析 (25)5.2 梯形图详解 (26)总结 (30)致谢 (31)参考文献 (32)附录 (33)1 系统流程图 (33)2 程序 (34)3 English information (36)第一章绪论1.1 题目来源及课题意义黄河泥沙含量的测试,顾名思意,是专为测试黄河泥沙含量的而设计的。

基于嵌入式系统的触摸式计算器的设计

基于嵌入式系统的触摸式计算器的设计
12 设 计思 路 .
术的代名 词 .到 目前 为止 , 入 式 微 处理 器及 其 技 嵌 术 已经 深入到 各 个 领域 , : 业控 制 领 域 、 如 工 无线 通
信领 域 、 网络 应用 领 域 、 费 类 电子 产 品领 域 、 像 消 成
和安 全 领 域 等 等 , 且 将 来 还 会 取 得 更 广 泛 的 应 而
维普资讯
5 6
北京工商大学学报( 自然 科学 版 )
20 0 7年 1月
包括 风格 、 展风格 、 小 、 扩 大 显示 位 置 、 册 I 号 等 注 D 等进 行 定义 .定 义好之后 通过 显 示 模块 就 可 以显 示 出计算: 的 界 面, 时, 统 就 进 入 了 等 待 消息 时 器 此 系 间 .当有 按钮被 按 下时, 进 入 了处理 消息模 块 , 就 当 按 下不 同的按 钮 时, 系统 通 过 处 理 消 息模 块 进 行 相 应 的处理 , 图 2 如 .可 以看 出, 箅 器功 能 的 实 现 分 计 成 了定义模 块 、 面建 立 模块 和 处理 系统 消 息模 块 界
实验 平 台对于 嵌入 式 I NUX的 良好 支持 及 北京 飞 I 漫软 件有 限公 司开 发 的 MI G 软件 优 良的 图形 NI U!
收 稿 日期 :20 —0 0 0 6 7— 5
作者 简介 :陈裕 涛 (9 3 ) 男, 南 永 州 人 , 士 研 究生 ,从 事 电 子产 品 开 发 18 一 , 湖 硕
VO . I25 No. 1
J n.2 0 a 0 7
5 5
文章 编号 :6 11 1 (0 7【 一0 50 17 —5 3 2 0 ) l 5 —4 J0
基 于 嵌 人 式 系 统 的触 摸式 计算 器 的设 计

实验九 嵌入式Linux QT程序设计

实验九 嵌入式Linux QT程序设计
设计界面,添加窗口组件 建立信号槽连接 编写事件处理函数 保存工程为.ui 文件,得到一个主窗口类 ♦ 编写 main.cpp 文件进行主窗口类的实例化及显示 ♦ 使用 qmake 生成.pro 工程文件 qmake -project ♦ 通过 qmake 自动生成 Makefile 文件 qmake ♦ make 生成可执行文件 ♦ 运行
2、编写 Hello 程序
1) 在/opt/uptech 目录下,建立一个名为 hello 的目录,在目录下建立一个名为 hello.cpp 的 c++源文件。编写 hello.cpp 文件,文件内容如下:
[root@PCForARM hello]# cat hello.cpp #include <QApplication> #include <QLabel>
进行修改。 y 可以随意设置程序界面的外观。 y 可以方便地为程序连接数据库。 y 可以使程序本地化。 y 可以将程序与 Java 集成。 y 嵌入式系统地要求是小而快速,而 QtE 就能帮助开发者为满足这些要求开发强壮地应
用程序。 y QtE 是模块化和可裁剪地。开发者可以选取他所需要的一些特性,而裁剪掉所不需要的。
这样,通过选择所需要的特性,QtE 的映像变得很小,最小只有 600K 左右。 y 同 Qt 一样,QtE 也是用 C++写的,虽然这样会增加系统资源消耗,但是却为开发者提
供了清洗的程序框架,使开发者能够迅速上手,并且能够方便地编写自定义的用户界面 程序。
图 9-3 QT/Embedded 通过 Qt API 与 Linux I/O 设施直接交互,成为嵌入式 linux 端口。同 Qt/X11 相比,QT/Embedded 很节省内存,其不需要一个 X 服务器或是 Xlib 库,它在底层摈弃了 Xlib,采用 framebuffer(帧缓存)作为底层图形接口。同时,将外部输入设备抽象为 keyboard 和 mouse 输入事件。QT/Embedded 的应用程序可以直接写内核缓冲帧,这可避免开发者使 用繁琐的 Xlib/Server 系统。

嵌入式linux实验报告

嵌入式linux实验报告

嵌入式操作系统Linux实验报告专业:计算机科学与技术班级:13419011学号:1341901124姓名:武易组员:朱清宇实验一Linux下进程的创建一实验目的1.掌握Linux下进程的创建及退出操作2.了解fork、execl、wait、waitpid及之间的关系二实验内容创建进程,利用fork函数创建子进程,使其调用execl函数,退出进程后调用wait或waitpid清理进程。

三实验过程1.进程的创建许多进程可以并发的运行同一程序,这些进程共享内存中程序正文的单一副本,但每个进程有自己的单独的数据和堆栈区。

一个进程可以在任何时刻可以执行新的程序,并且在它的生命周期中可以运行几个程序;又如,只要用户输入一条命令,shell进程就创建一个新进程。

fork函数用于在进程中创建一个新进程,新进程是子进程。

原型如下:#include<sys/types.h> /* 提供类型pid_t的定义 */#include<unistd.h> /* 提供函数的定义 */pid_t fork(void);使用fork函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间fork系统调用为父子进程返回不同的值,fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:在父进程中,fork返回新创建子进程的进程ID;✓在子进程中,fork返回0;✓如果出现错误,fork返回一个负值;用fork创建子进程后执行的是和父进程相同的程序,子进程可以通过调用exec函数以执行另一个程序。

当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程(例如其m a i n函数)开始执行。

调用e x e c并不创建新进程,进程I D并未改变,只是用另一个新程序替换了当前进程的正文、数据、堆和栈段。

e x e c函数原型execl,execlp,execle,execv,execve和execvp2.进程的退出一个进程正常终止有三种方式:由main()函数返回;调用exit()函数;调用_exit()或_Exit()函数。

嵌入式实验-简易计算器

嵌入式实验-简易计算器
temp = *(keyboard_base+0xfb);
return value;
}
return -1;
}
void Lcd_Init(void)
{
rDITHMODE=0x1223a;
rDP1_2 =0x5a5a;
rDP4_7 =0x366cd9b;
rDP3_5 =0xda5a7;
rDP2_3 =0xad7;
{
if( (temp&0x1) == 0 )
value = '=';
else if( (temp&0x2) == 0 )
value = 6;
else if( (temp&0x4) == 0 )
value = 5;
else if( (temp&0x8) == 0 )
value = 4;
while(( temp & KEY_VALUE_MASK) != KEY_VALUE_MASK) // release
Lcd_Draw_VLine(usTop, usBottom, usRight, ucColor, 1);
}
void Lcd_DspAscII8x16(INT16U x0, INT16U y0, INT8U ForeColor, INT8U * s)
{
INT16 i,j,k,x,y,xx;
INT8U qm;
case '-' : z = x-y; break;
case '*' : z = x*y; break;
case '÷' : z = x÷y; break;
}
}
P = str;

嵌入式实验报告-简易计算器

嵌入式实验报告-简易计算器

一目的及要求1实验目的根据计算器的原理设计一个具有加减乘除功能的简易计算器。

2实验要求(1)数字和结果用数码管显示。

(2)数字、+-*/、=、C用4X4键盘实现。

(3)计算结果正确,有出错提示。

二实验原理框图基本工作原理:本设计利用数码管和4*4矩阵式键盘实现了简易计算器的功能。

接通电源,数码管显示全0。

计算时,通过键盘输入需要计算的数字,该数字显示在数码管上,当键入等号时,计算结果显示在数码管上。

进行第二次运算时,按C键清除键盘结果。

当计算出现错误时,LED灯亮报警。

当计算结果超出数码管显示出现溢出时,报警电路也会报警。

报警输出为--。

四系统软件设计1.数据输入模块原理:通过4*4矩阵模块输入数字,在数码管上显示出来。

2.运算模块原理:四种运算同步运行,通过按键加、减、乘、除选择输出对应的计算结果,当按键等号时,将所得结果反馈给运算模块输入端。

3.输出模块原理:通过按键等号来控制显示运算对象还是运算结果,当等号按下时,输出计算结果,否则显示当前输入的数据。

当输出结果溢出是LED亮四次,同时数码管显示都为--。

五实验调试首先按清零键清零。

然后进行调试。

输入数据2,再按乘法键,输入第二个数字6,按等号键,数码管显示12;再按除法键,输入第二个数据3,按等号键,数码管显示4;再按加法键,输入第三个数据7,依次按等号键,数码管显示11;按减法键,输入第四个数据99,依次按等号键,数码管显示-88。

若输入超出显示管的最大值或者超出数码管的位数,结果溢出,LED亮报警,同时数码管显示都为--。

如输入999999加上2 ,结果就溢出,LED灯亮四次报警。

六程序#include "LPC2468.h" /* LPC24xx definitions */ #include "type.h"#include "irq.h"#include "target.h"#include "timer.h"#include "fio.h"#include "keyboard.h"#include "SPI.h"extern BYTE seg_buf[50]; // LPC2468开发板使用此数组的0~5显示六个数码管;LPC2478板使用1~6BYTE seg_copy1[7];BYTE seg_copy2[7];unsigned long Num1 =0;/*第一个输入的数字*/unsigned long Num2 =0;/*第二个输入的数字*/unsigned long Num3 =0;/*第二个输入的数字*/extern BYTE KEY; // LPC2468开发板使用此数组的0~5显示六个数码管;LPC2478板使用1~6enum {Add =1,Dec,Mut,Div,nofuntion}funtion;/******************************************************************** *********** Main Function main()********************************************************************* *********/int main (void){unsigned char counter = 0; /*计算输入的数字的个数,超过6个则报警,运算结果超过6位数也报警*/unsigned char cal_allow = 1; /*允许输入数字标志*/unsigned char input_allow = 1;/*允许输入数字标志*/unsigned char funtion_type = 0;/*运算功能*/unsigned char Ne_num = 0;/*负数标志*/DWORD value=0,i=0;TargetResetInit();enable_timer(1);SPI_Init(8); // SPI总线速率为28.8/8 = 3.6 MHz Seg_Init(); // 数码管初始化LedsInit();for(i=0;i<7;i++){seg_copy1[i]=0;seg_copy2[i]=0;seg_buf[i]=0;}counter = 0;cal_allow = 1;input_allow = 1;funtion_type = nofuntion;while ( 1 ){value = KEY;/*输入数字*/if(value>0 && value<11){if(counter < 6&&input_allow==1){if(counter == 0) seg_buf[1] = value-1;else{for(i=0;i<counter;i++){seg_buf[counter+1-i] = seg_buf[counter-i]; }seg_buf[1] = value-1;}counter++;}if(counter == 6){input_allow = 0;LedOn(1);LedOn(2);LedOn(3);LedOn(4);}}/*如果是“C”键,则清除显示,清除计算标志*/if(value == 11){for(i=0;i<7;i++){seg_copy1[i]=0;seg_copy2[i]=0;seg_buf[i]=0;}counter = 0;Num1 = 0;Num2 = 0;Num3 = 0;cal_allow = 1;input_allow = 1;Ne_num = 0;/*负数标志*/funtion_type = nofuntion;}/*如果是“+”键,则显示结果*/if(value == 13 ){if(cal_allow == 1){for(i=0;i<7;i++){seg_copy1[i] = seg_buf[i];/*备份第一次输入的数字*/seg_buf[i]=0; /*显示清零以准备第二次输入数字*/}funtion_type = Add;counter = 0; /*计数器清零允许第二次计数*/cal_allow =1; /*再等号按下前不能再按第二次*/input_allow = 1; /*允许第二次输入数据*/}else{input_allow = 0; /*禁止按下2次功能键时候输入数据*/}/*如果是“-”键,则显示结果*/if(value == 14&& cal_allow == 1){if(cal_allow == 1){for(i=0;i<7;i++){seg_copy1[i] = seg_buf[i];/*备份第一次输入的数字*/seg_buf[i]=0; /*显示清零以准备第二次输入数字*/}funtion_type = Dec;counter = 0; /*计数器清零允许第二次计数*/cal_allow =1; /*再等号按下前不能再按第二次*/input_allow = 1; /*允许第二次输入数据*/}else{input_allow = 0; /*禁止按下2次功能键时候输入数据*/ }}/*如果是“X”键,则显示结果*/if(value == 15 && cal_allow == 1){if(cal_allow == 1){for(i=0;i<7;i++)seg_copy1[i] = seg_buf[i];/*备份第一次输入的数字*/seg_buf[i]=0; /*显示清零以准备第二次输入数字*/}funtion_type = Mut;counter = 0; /*计数器清零允许第二次计数*/cal_allow =1; /*再等号按下前不能再按第二次*/input_allow = 1; /*允许第二次输入数据*/}else{input_allow = 0; /*禁止按下2次功能键时候输入数据*/ }}/*如果是“/”键,则显示结果*/if(value == 16 && cal_allow == 1){if(cal_allow == 1){for(i=0;i<7;i++){seg_copy1[i] = seg_buf[i];/*备份第一次输入的数字*/seg_buf[i]=0; /*显示清零以准备第二次输入数字*/}funtion_type = Div;counter = 0; /*计数器清零允许第二次计数*/cal_allow =1; /*再等号按下前不能再按第二次*/input_allow = 1; /*允许第二次输入数据*/}else{input_allow = 0; /*禁止按下2次功能键时候输入数据*/ }}/*如果是“=”键,则清除显示,清除计算标志*/if(value == 12){for(i=0;i<7;i++){seg_copy2[i] = seg_buf[i];/*拷贝第二次输入的数字*/}/*把输入的数字串1合成运算数字*/Num1 = seg_copy1[6]*100000+seg_copy1[5]*10000+seg_copy1[4]*1000 +seg_copy1[3]*100+seg_copy1[2]*10 +seg_copy1[1];/*把输入的数字串2合成运算数字*/Num2 = seg_copy2[6]*100000+seg_copy2[5]*10000+seg_copy2[4]*1000 +seg_copy2[3]*100+seg_copy2[2]*10 +seg_copy2[1];switch(funtion_type){case Add:{Num1 = Num1+Num2;/*计算结果存在Num1中*/break;}case Dec:{if(Num1==Num2) Num1 = 0;else if(Num1>Num2){Num3 = Num1-Num2;/*计算结果存在Num1中*/ Num1 = Num3;}else if(Num2 > Num1){Num3 = Num2-Num1;Ne_num =1;Num1 = Num3;}break;}case Mut:{Num3 = Num1*Num2;/*计算结果存在Num1中*/ Num1 = Num3;break;}case Div:{if(Num1>=Num2&&Num2!=0){Num3 = Num1/Num2;/*计算结果存在Num1中*/}Num1 = Num3;break;}default:break;}/*显示结果*/if(Num1>999999||(Ne_num ==1&&Num1>99999)||Num2 ==0) {for(i=0;i<7;i++){seg_copy1[i]=0;seg_copy2[i]=0;seg_buf[i]=10;/*显示横杠表示计算溢出错误!*/}for(i=0;i<5;i++){LedOn(1);LedOn(2);LedOn(3);LedOn(4);delayMs(1,200);LedOff(1);LedOff(2);LedOff(3);LedOff(4);delayMs(1,200);}}else{seg_buf[1] = Num1%10;seg_buf[2] = (Num1%100)/10;seg_buf[3] = (Num1%1000)/100;seg_buf[4] = (Num1%10000)/1000;seg_buf[5] = (Num1%100000)/10000;seg_buf[6] = Num1/100000;if(Ne_num ==1){seg_buf[6] = 10;/*显示负号*/}}}delayMs(1,200);}}/******************************************************************** *********** End Of File********************************************************************* ********/七实验现象(1)运行成功以后的计算机界面如图一:图一(2)正确输入6+6=12的现象如图二和图三:图二图三(3)当进行除操作且除数为0时的现象如图四:图四七实验小结在设计计算机的过程中,我们遇到了很多问题,但是都通过查资料和请教同学得到了解决。

编译原理课程设计-简单计算器实现

编译原理课程设计-简单计算器实现

课程设计报告课程:编译原理学号:姓名:班级:11级嵌入式应用技术班教师:时间:2014年6月计算机科学与技术系输入一个简单运算表达式A=当前输入符号A是运算符吗?根据运算符的特点从栈顶部取出若干个运算对象进行该运算,将运果入栈将该字符入栈A=‘\0’程序结束是否是否图二表达式结果计算流程图结果与分析(可以加页):图三实现计算器加法功能图四实现计算器减法功能图五实现计算器乘法功能图六实现计算器除法功能图七实验计算器混合运算功能源代码:#include〈stdio。

h> #include<stdlib.h〉#define MaxSize 99void translate(char str[],char exp[]){struct{char data[MaxSize];int top;}op;char ch;int i = 0,t = 0;op.top = -1;ch = str[i];i++;while(ch != ’\0’){switch(ch){case ’(':op.top++;op。

data[op.top]=ch;break;case ’)':while(op.data[op.top]!= ’('){exp[t]=op.data[op.top];op。

top--;t++;}op.top-—;break;case ’+’:case '—’:while(op.top != -1&&op。

data[op。

top] != '(’){exp[t]= op.data[op.top];op。

top——;t++;}op。

top++;op。

data[op。

top] = ch;break;case '*’:case ’/’:while(op。

data[op。

top] == ’/'||op.data[op。

top] == '*'){exp[t] = op.data[op.top];op。

基于嵌入式Linux的软PLC系统设计与实现的开题报告

基于嵌入式Linux的软PLC系统设计与实现的开题报告

基于嵌入式Linux的软PLC系统设计与实现的开题报告一、研究背景及意义随着现代工业自动化的发展,越来越多的控制系统采用可编程逻辑控制器(PLC)进行控制。

而为了满足工业自动化的需求,软PLC的应用也越来越广泛。

软PLC作为一种软件定义的控制器,具有高度可定制化和灵活性等优点,可以在不同的操作系统上运行,大大降低了控制系统的成本。

嵌入式Linux作为一种非常流行的操作系统,因其可定制性强、开源的特性,越来越多的控制系统采用嵌入式Linux作为软PLC的操作系统,实现了高度可定制化的控制系统。

本论文旨在基于嵌入式Linux系统,设计和实现一种软PLC控制系统,旨在提高控制系统的可定制性和灵活性,并为更多的工业自动化提供一种可选的控制方案。

二、研究内容及研究方法研究内容:1.设计软PLC系统的基本结构和功能模块;2.嵌入式系统的选型和配置;3.开发实现PLC程序;4.实现用户界面;5.系统测试和效果评价。

研究方法:1. 确定软PLC的基本功能,设计系统结构,并选择相应的硬件平台和嵌入式Linux系统;2. 根据软PLC的需求编写应用程序,并实现PLC程序的编译、加载和监视等功能;3. 设计并实现控制系统的用户界面,提供参数配置、状态显示和故障诊断等功能;4. 对软PLC系统进行测试,并对其效果进行评价。

三、预期研究成果本论文预期实现一个基于嵌入式Linux的软PLC控制系统,实现以下功能:1.支持常见的控制逻辑和IO控制函数;2.支持PLC程序的编译和加载;3.具有友好的用户界面,支持参数设置和状态监视;4.支持实时监视和诊断控制系统。

四、研究时间表任务 | 时间节点----|---------研究Linux内核和驱动程序 | 2周编写软PLC控制程序 | 4周设计用户界面并实现 | 2周系统测试和效果评价 | 2周论文撰写和修改 | 4周任务总计 | 14周五、参考文献[1] 刘强, 刘韶跃. 嵌入式Linux应用开发[M]. 电子工业出版社, 2007.[2] Trampert M, Coats R. Application of Linux as a programmable controller operating system[J]. Industria e automazione, 2004, 37(3): 40-45.[3] Du L, Guo J, Zhang W. Research on an embedded Linux-based soft PLC[C]//2017 Asia-Pacific Power and Energy Engineering Conference (APPEEC). IEEE, 2017: 1-5.[4] Gordon A. Raspberry Pi: A quick-start guide[M]. Pragmatic Bookshelf, 2012.。

嵌入式linux小项目实例

嵌入式linux小项目实例

嵌入式linux小项目实例嵌入式系统是一种特殊的计算机系统,它被嵌入到其他设备中,用于控制和管理设备的各种功能。

嵌入式Linux是一种常用的嵌入式系统操作系统,它具有开源、稳定、灵活等特点,被广泛应用于各种嵌入式设备中。

在本文中,我将介绍一个嵌入式Linux小项目的实例,以帮助读者更好地理解和应用嵌入式Linux。

这个项目是一个智能家居控制系统,它可以通过手机APP远程控制家中的各种设备,如灯光、空调、窗帘等。

该系统基于嵌入式Linux开发,使用了一块嵌入式开发板和一些外围设备。

首先,我们需要选择一块适合的嵌入式开发板。

在这个项目中,我们选择了一块基于ARM架构的开发板,它具有强大的计算能力和丰富的外设接口,非常适合用于嵌入式Linux开发。

接下来,我们需要安装和配置嵌入式Linux系统。

我们可以选择一个已经编译好的嵌入式Linux发行版,如Buildroot或Yocto Project,也可以自己从源代码编译一个定制的嵌入式Linux系统。

在这个项目中,我们选择了Buildroot,因为它简单易用,适合初学者。

安装和配置嵌入式Linux系统需要一些基本的Linux知识,如交叉编译、内核配置、文件系统配置等。

在这个项目中,我们需要配置网络、蓝牙和GPIO等功能,以便实现远程控制。

完成系统的安装和配置后,我们需要编写应用程序来实现智能家居控制功能。

在这个项目中,我们使用了C语言和Shell脚本来编写应用程序。

C语言用于编写底层驱动程序和控制逻辑,Shell脚本用于实现一些简单的控制命令和脚本。

在应用程序中,我们使用了一些开源库和工具,如libcurl、BlueZ和GPIO库等。

这些库和工具可以帮助我们更方便地实现网络通信、蓝牙控制和GPIO控制等功能。

最后,我们需要将应用程序和相关的配置文件打包成一个固件,然后烧录到嵌入式开发板中。

烧录固件可以使用一些专门的工具,如dd命令或烧录工具。

完成烧录后,我们可以通过手机APP来远程控制智能家居系统。

嵌入式计算器实训报告

嵌入式计算器实训报告

一、实训目的随着科技的不断发展,嵌入式系统在各个领域得到了广泛应用。

为了提升自身在嵌入式领域的实践能力,我参加了嵌入式计算器实训课程。

本次实训旨在通过实际操作,掌握嵌入式计算器的硬件设计、软件编程和调试方法,提高动手能力和工程实践能力。

二、实训内容1. 硬件设计嵌入式计算器的硬件设计主要包括微控制器、按键输入、显示模块和存储模块等。

本次实训所使用的微控制器为STM32,按键输入采用矩阵键盘,显示模块为LCD液晶显示屏,存储模块采用EEPROM。

2. 软件编程嵌入式计算器的软件编程主要包括按键扫描、运算逻辑、显示控制和数据存储等。

本次实训采用C语言进行编程,主要使用了以下技术:(1)按键扫描:通过查询矩阵键盘的行列状态,实现按键的识别和去抖动。

(2)运算逻辑:实现基本的四则运算功能,包括加、减、乘、除等。

(3)显示控制:将运算结果在LCD液晶显示屏上显示,包括数值和符号。

(4)数据存储:将运算结果和重要数据存储在EEPROM中,以便后续读取。

3. 调试与优化在嵌入式计算器的开发过程中,调试和优化是至关重要的环节。

本次实训主要采用以下方法进行调试:(1)使用调试器观察程序运行状态,分析程序逻辑。

(2)使用逻辑分析仪观察信号波形,检查硬件电路连接。

(3)针对发现的问题,进行代码修改和优化。

三、实训过程1. 硬件搭建首先,根据设计方案,搭建嵌入式计算器的硬件电路。

主要包括微控制器、按键输入、显示模块和存储模块等。

在搭建过程中,注意电路连接的准确性和可靠性。

2. 软件编程在硬件搭建完成后,开始进行软件编程。

首先,编写按键扫描程序,实现按键的识别和去抖动。

然后,编写运算逻辑程序,实现基本的四则运算功能。

接着,编写显示控制程序,将运算结果在LCD液晶显示屏上显示。

最后,编写数据存储程序,将运算结果和重要数据存储在EEPROM中。

3. 调试与优化在编程过程中,不断进行调试和优化。

首先,使用调试器观察程序运行状态,分析程序逻辑。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

沈阳航空航天大学课程设计报告课程设计名称:嵌入式系统综合课程设计课程设计题目:基于嵌入式linux计算器的实现院(系):专业:班级:学号:姓名:指导教师:完成日期:沈阳航空航天大学课程设计报告目录第1章系统分析 (1)1.1需求分析 (1)1.2硬件分析 (1)1.2.1 实验环境 (1)1.3软件分析 (2)1.3.1 操作系统简介 (2)1.3.2 开发技术简介 (2)第2章系统设计 (4)2.1操作系统移植 (4)2.2系统模块设计 (4)2.3函数设计 (4)2.4关键流程 (5)2.4.1 系统主流程 (5)2.4.2 功能按键流程图 (5)第3章QT程序移植 (7)3.1建立交叉编译环境 (7)3.2Q T源文件的编译 (8)3.3Q T应用的移植 (8)第4章系统调试及运行 (9)4.1调试分析 (9)4.2结果分析 (10)参考文献 (11)附录 (12)第1章系统分析1.1 需求分析课程设计内容和要求:设计一个简单的计算器,能够进行加、减、乘、除等数学操作。

(1)利用嵌入式linux和Qt,在ARM9上实现。

(2)界面尽可能友好、美观。

这是一个简单的计算器软件,功能为加、减、乘、除等,在嵌入式设备上实现,使用方便,性能可靠,基于ARM内核的微处理器在市场上绝对处于领导地位,因此该类项目拥有庞大的市场。

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)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只表示操作系统内核本身,但通常采用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是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,易于扩展,允许组件编程。

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)图形整合模块:将写成的文本框、按键整齐排列。

(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.1建立交叉编译环境在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。

这个编译过程就叫交叉编译。

简单地说,就是在一个平台上生成另一个平台上的可执行代码,而这种工具就是交叉编译器(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/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,交叉编译下,看是否能在开发板上运行。

i. 交叉编译测试程序arm-linux-gcc helloworld.c -o helloworldii.把生成的可执行文件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-Star6410,选择COM1,波特率设置为115200,数据控制流为无,点击确定。

2)将开发板调为Nor Flash,打开电源,打开DNW软件。

3)格式化Nand Flash,然后对开发板进行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 计算器界面点击数字按键区会在文本框中显示数据,蓝色框图内为数字键区域,如图4.2所示。

图4.2 数字按键显示点击功能按钮会对文本框中数据进行操作,以开方运算为例,红色框图内为功能按键区,如图4.3所示。

图4.3 功能按键显示4.2 结果分析1)打开软件后,能正确的对文本框中输入int型数据和double型数据。

2)点击运算功能按键时,会对文本框中的数据进行正确运算,并在下一次点击运算按键时,将运算结果显示在文本框上。

3)点击存储功能按键时,会将当前文本框中的数据存入一个寄存器中,在点击其他存储按键时对该数据操作。

4)总体来看,实现了功能需求中要求的功能,界面友好。

参考文献[1] 刘峥嵘等. 嵌入式Linux应用开发详解[M]. 北京:机械工业出版社,2004[2] 蔡志明等. 精通Qt4编程(第2版)[M]. 北京:电子工业出版社,2011[3] 霍亚飞. Qt及Qt Quick开发实战精解[M]. 北京:北京航空航天大学出版社,2012[4] 霍亚飞. Qt Creater快速入门[M]. 北京:北京航空航天大学出版社,2012[5] 陈祥琳. Linux从入门到精通[M]. 北京:人民邮电出版社,2012[6] 博创公司. UP-Star6410 实验指导v4.0[M]. 北京博创兴盛科技有限公司[7] 丁林松等. Qt4图形设计与嵌入式开发[M]. 北京:人民邮电出版社,2009附录部分主要源程序代码#include <QtGui>#include <math.h>#include "button.h"#include "calculator.h"//! [0]Calculator::Calculator(QWidget *parent): QDialog(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.setPointSize(font.pointSize() + 8);display->setFont(font);//! [2]//! [4]for (int i = 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("Clear All"), 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("+"), SLOT(additiveOperatorClicked()));Button *squareRootButton = createButton(tr("Sqrt"), SLOT(unaryOperatorClicked()));Button *powerButton = createButton(tr("x\262"), SLOT(unaryOperatorClicked()));Button *reciprocalButton = createButton(tr("1/x"), 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(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);mainLayout->addWidget(addToMemoryButton, 5, 0);for (int i = 1; i < NumDigitButtons; ++i) {int row = ((9 - i) / 3) + 2;int column = ((i - 1) % 3) + 1;mainLayout->addWidget(digitButtons[i], row, column);}mainLayout->addWidget(digitButtons[0], 5, 1);mainLayout->addWidget(pointButton, 5, 2);mainLayout->addWidget(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, 5);mainLayout->addWidget(reciprocalButton, 4, 5);mainLayout->addWidget(equalButton, 5, 5);setLayout(mainLayout);setWindowTitle(tr("Calculator"));}//! [6]//! [7]void Calculator::digitClicked(){Button *clickedButton = qobject_cast<Button *>(sender());int digitValue = clickedButton->text().toInt();if (display->text() == "0" && digitValue == 0.0)return;if (waitingForOperand) {display->clear();waitingForOperand = false;}display->setText(display->text() + QString::number(digitValue)); }//! [7]//! [8]void Calculator::unaryOperatorClicked()//! [8] //! [9]{Button *clickedButton = 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 (clickedOperator == tr("x\262")) {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]//! [10]void Calculator::additiveOperatorClicked()//! [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)) { abortOperation();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->setText(QString::number(sumSoFar));} else {sumSoFar = operand;}//! [15] //! [16]pendingAdditiveOperator = clickedOperator;//! [16] //! [17]waitingForOperand = true;}//! [17]//! [18]void Calculator::multiplicativeOperatorClicked(){Button *clickedButton = qobject_cast<Button *>(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 {factorSoFar = operand;}pendingMultiplicativeOperator = clickedOperator;waitingForOperand = true;}//! [18]//! [20]void Calculator::equalClicked(){double operand = display->text().toDouble();if (!pendingMultiplicativeOperator.isEmpty()) {if (!calculate(operand, pendingMultiplicativeOperator)) { abortOperation();return;}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));sumSoFar = 0.0;waitingForOperand = true;}//! [20]//! [22]void Calculator::pointClicked(){if (waitingForOperand)display->setText("0");if (!display->text().contains("."))display->setText(display->text() + tr("."));waitingForOperand = false;}//! [22]//! [24]void Calculator::changeSignClicked() {QString text = 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]//! [26]void Calculator::backspaceClicked() {if (waitingForOperand)return;QString text = display->text();text.chop(1);if (text.isEmpty()) {text = "0";waitingForOperand = true;}display->setText(text);}//! [26]//! [28]void Calculator::clear(){if (waitingForOperand)return;display->setText("0");waitingForOperand = true;}//! [28]//! [30]void Calculator::clearAll(){sumSoFar = 0.0;factorSoFar = 0.0;pendingAdditiveOperator.clear();pendingMultiplicativeOperator.clear();display->setText("0");waitingForOperand = true;}//! [30]//! [32]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->text().toDouble();}//! [32]//! [34]Button *Calculator::createButton(const QString &text, const char *member) {Button *button = new Button(text);connect(button, SIGNAL(clicked()), this, member);return button;}//! [34]//! [36]void Calculator::abortOperation(){clearAll();display->setText(tr("####"));}//! [36]//! [38]bool Calculator::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)return false;factorSoFar /= rightOperand;}return true;}//! [38]沈阳航空航天大学课程设计报告。

相关文档
最新文档