嵌入式系统原理及应用题目要求+程序代码

合集下载

《嵌入式系统原理与应用》实验报告01-GPIO输出控制实验

《嵌入式系统原理与应用》实验报告01-GPIO输出控制实验
二、实验设备(环境)及要求
硬件:PC机;
软件:PC机操作系统windows XP,ADS1.2集成开发环境,Proteus软件。
3、实验内容与步骤
实验内容:
LPC2138外接3个按键,4个LED灯,实现不同流水灯的效果。
4、实验结果与数据处理
1.实验连接图
图1 实验原理图
2.程序代码
#include "config.h"
图3.3:模式3下蓝灯亮起
图3.4:模式3下绿灯亮起
5、分析与讨论
在这一次实验中,我学会了通过教程下载并安装了ADS和Proteus软件,同时根据录播,一步一步地熟悉两个软件的时候,同时也完成了利用仿真实验模拟了GPIO输出控制。初步掌握并理解了Proteus仿真软件的使用,对ARM7有了进一步的了解,为之后的学习打下了基础。
}
void LED_3(void)
{
IO0SET = 0x0001;
delay(1000);
IO0CLR = 0x0001;
IO0SET = 0x0040;
delay(1000);
IO0CLR = 0x0040;
IO0SET = 0x0008;
delay(1000);
IO0CLR = 0x0008;
delay(1000);
IO0CLR = 0x0008;
IO0SET = 0x0040;
delay(1000);
IO0CLR = 0x0040;
IO0SET = 0x0200;
delay(1000);
IO0CLR = 0x0200;
}
void LED_2(void)
{
IO0SET = 0x0200;

嵌入式系统的原理及应用.ppt

嵌入式系统的原理及应用.ppt
17
VIVI 第2阶段介绍
第5步:mtd_dev_init()
mtd_dev_init()用来扫描所使用的NAND Flash的型号,构造 MTD设备,即构造一个mtd_info的数据结构。对于本开发板,它 直接调用mtd_init(),mtd_init又调用smc_init(),此函数在 drivers/mtd/maps/s3c2410_flash.c中。
嵌入式系统的原理及应用
3.3 嵌入式Linux系统的开发
编写BootLoader; 裁减嵌入式Linux内核; 裁减嵌入式Linux文件系统; 烧写BootLoader到目标板; 烧写嵌入式Linux内核和文件系统到目标板。
2
3.3.1 编写BootLoader
一个嵌入式Linux系统从软件角度看可以分为四个层次:
怎样编写BootLoader程序?
初学者最好采用拿来主义,在别人的BootLoader源代码基础上 进行修改、编译、调试。
19
18
VIVI 第2阶段介绍
第7步:misc()和init_builtin_cmds()
这两个函数都是简单地调用add_command函数,给一些命令 增加相应的处理函数。在vivi启动后,可以进去操作界面,这些命 令,就是供用户使用的。
第8步:boot_or_vivi()
此函数根据情况,或者启动“vivi_shell”,进入与用户进行交 互的界面,或者直接启动linux内核。
9
head.S通常完成如下几件事情:
(5) 检查是否从掉电模式唤醒,若是,则调用WakeupStart函数进 行处理——这是一段没用上的代码,vivi不可能进入掉电模式; (6) 点亮所有LED (7) 初始化UART0:

嵌入式系统原理与设计考试试卷

嵌入式系统原理与设计考试试卷

嵌入式系统原理与设计考试试卷(答案见尾页)一、选择题1. 嵌入式系统的核心是什么?A. 中央处理器(CPU)B. 内存(RAM和ROM)C. 输入输出设备D. 操作系统和软件2. 嵌入式系统的基本工作原理是什么?A. 单任务处理B. 多任务并发处理C. 硬件和软件协同工作D. 顺序执行指令3. 嵌入式系统通常用于哪些领域?A. 个人电脑B. 智能手机C. 游戏机D. 以上都是4. 在嵌入式系统中,什么是实时操作系统(RTOS)?A. 一种操作系统,具有严格的时间限制和多任务处理能力B. 一种操作系统,专为嵌入式系统设计,具有高效的内存管理C. 一种操作系统,支持多种硬件平台D. 一种编程语言5. 嵌入式系统设计中,硬件和软件的划分依据是什么?A. 功能B. 性能C. 可维护性6. 在嵌入式系统开发过程中,以下哪个阶段是必不可少的?A. 系统分析B. 系统设计C. 系统实现D. 系统测试7. 嵌入式系统中的程序员需要具备哪些技能?A. 编程语言知识B. 计算机体系结构知识C. 操作系统知识D. 以上都是8. 嵌入式系统的可靠性是指什么?A. 系统在一定时间内无故障运行的能力B. 系统在特定条件下的稳定性C. 系统在长时间运行后的性能保持D. 系统的可扩展性9. 在嵌入式系统开发中,常使用的开发工具包括哪些?A. 集成开发环境(IDE)B. 仿真器C. 调试器D. 以上都是10. 嵌入式系统未来的发展趋势是什么?A. 更高的性能B. 更多的智能化功能C. 更广泛的应用领域D. 以上都是11. 嵌入式系统的特点是?B. 功能单一C. 硬件和软件紧密相关D. 可扩展性差12. 嵌入式系统通常工作在什么频率下?A. 低频B. 中频C. 高频D. 超高频13. 在嵌入式系统中,以下哪个不是常用的操作系统?A. LinuxB. Windows CEC. VxWorksD. Android14. 嵌入式系统设计中,通常会考虑哪些因素?A. 性能B. 成本C. 易用性D. 扩展性15. 嵌入式系统中的任务调度通常基于什么原则?A. 先来先服务B. 最短作业优先C. 时间片轮转D. 优先级16. 在嵌入式系统中,硬件抽象层(HAL)的主要作用是什么?A. 提供设备驱动程序B. 实现操作系统内核C. 抽象硬件逻辑D. 进行系统编程17. 嵌入式系统中的实时性是指什么?A. 系统响应时间短B. 系统错误率低C. 系统资源利用率高D. 系统可维护性好18. 在嵌入式系统开发过程中,以下哪个阶段是硬件平台搭建的关键?A. 系统设计B. 集成测试C. 硬件平台搭建D. 软件开发19. 嵌入式系统与传统计算机的根本区别是什么?A. 微型化B. 便携性C. 嵌入式软件D. 可嵌入性20. 嵌入式系统的基本操作系统中,通常不包括以下哪个组件?A. 内存管理器B. 文件系统C. 设备驱动程序D. 用户应用程序21. 在嵌入式系统中,以下哪种编程语言不是其主要编程语言?A. CB. C++C. JavaD. Assembly22. 嵌入式系统设计中,硬件和软件的紧密关系体现在哪一方面?A. 硬件和软件可以互换B. 硬件和软件必须完全相同C. 硬件和软件需要协同工作以实现特定功能D. 硬件总是比软件复杂23. 下列哪个不是嵌入式系统的特点?A. 低功耗B. 高性能C. 可定制性D. 不可靠24. 在嵌入式系统的开发过程中,以下哪个阶段不是必需的?A. 系统需求分析B. 硬件设计C. 软件开发D. 性能测试25. 在嵌入式系统的调试过程中,以下哪种工具不是常用的?A. 逻辑分析仪B. 示波器C. 编程器D. 调试器26. 嵌入式系统设计中,通常会考虑哪些因素来优化系统性能?A. 硬件性能B. 软件效率C. 系统功耗D. 所有以上因素27. 在嵌入式系统的数据采集和处理中,以下哪种设备不是常用的数据输入设备?A. 键盘B. 鼠标C. 数字相机D. 触摸屏28. 嵌入式系统的基本操作系统中,通常不包括以下哪项功能?A. 进程管理B. 文件管理C. 网络通信D. 安全加密29. 嵌入式系统通常用于控制哪些类型的设备?A. 大型机器B. 小型家电C. 数码产品D. 大型工业设备30. 在嵌入式系统设计中,通常优先考虑的是:A. 性能B. 成本C. 功能性D. 可靠性31. 下列哪个不是嵌入式系统常用的编程语言?A. C语言B. C++C. JavaD. Python32. 在嵌入式系统开发中,硬件通常包括以下哪项?A. 软件B. 外围设备C. 操作系统D. 应用程序33. 嵌入式系统的生命周期包括哪些阶段?A. 设计、开发、测试、部署、维护B. 设计、编码、测试、部署、维护C. 设计、开发、测试、部署、更新D. 设计、编码、测试、部署、优化34. 在嵌入式系统设计中,如何确保系统的可靠性和稳定性?A. 使用高质量的组件B. 提供充分的文档和注释C. 进行彻底的测试和验证D. 选择成熟的开源软件35. 嵌入式系统在现代社会中扮演着什么角色?A. 主要用于大型企业和工业控制B. 主要用于个人计算机和游戏机C. 主要用于消费电子产品和智能家居D. 主要用于军事和航空航天36. 嵌入式系统的硬件通常包括哪些组件?A. CPU、内存、I/O设备B. 仅CPU和内存C. 仅内存和I/O设备D. 仅CPU和I/O设备37. 嵌入式系统的实时性是指什么?A. 系统能够立即响应外部事件B. 系统能够在预定的时间内响应外部事件C. 系统响应时间的长短无关紧要D. 系统不支持多任务处理38. 在嵌入式系统中,通常使用哪种编程语言?A. 汇编语言B. C语言C. JavaD. Python39. 嵌入式系统通常用于哪个领域?A. 云计算B. 大数据C. 物联网(IoT)D. 移动应用40. 嵌入式系统的开发过程通常包括哪些阶段?A. 设计、编码、测试、部署B. 编码、测试、设计、部署C. 测试、设计、编码、部署D. 部署、设计、编码、测试41. 在嵌入式系统的调试过程中,常用的工具有哪些?A. 调试器B. 代码编辑器C. 版本控制系统D. 图形用户界面(GUI)工具42. 在嵌入式系统的安全性方面,通常关注哪些问题?A. 系统的物理安全B. 系统的软件安全C. 系统的网络安全D. 系统的电源安全二、问答题1. 什么是嵌入式系统?请简要描述其特点。

嵌入式系统原理与应用课程教学大纲

嵌入式系统原理与应用课程教学大纲

《嵌入式系统原理与应用》课程教学大纲一、课程基本信息课程代码:230449课程名称:嵌入式系统原理与应用英文名称:Principle and Application of Embedded System课程类别:专业课学时:72(其中实验18学时)学分:3.5适用对象: 计算机科学与技术业考核方式:考试(平时成绩占总评成绩的30%,期末考试成绩占70%)先修课程:计算机组成原理、操作系统、编译原理二、课程简介嵌入式系统原理与应用是计算机科学技术专业的一门专业课,讲述嵌入式系统的基本理论、原理。

本课程是一门既与硬件关系紧密,又与嵌入式操作系统、嵌入式软件关系十分紧密课程。

它围绕目前流行的32位ARM处理器和源码开放的Linux操作系统,讲述嵌入式系统的概念,软、硬件组成,开发过程以及嵌入式应用程序开发设计方法。

本课程的知识将为学生今后从事嵌入式系统研究与开发打下坚实的基础。

The principle of embedded system is an important course of computer science and technology, which introduce the principles and the theory of embedded system.T his curriculum is tied closely with not only hardware but also embedded operating system and embedded software. It introduce the conception of embedded system, components of software and hardware, developing progresses and designing methods of embedded programming which based on the 32bit arm processor and operating system of opened linux.The knowledge of this course would be solid foundation for the student who would be engaged in researching or developing about embedded system.三、课程性质与教学目的嵌入式系统原理与应用课程的性质:该课程是计算机科学与技术专业的专业课。

嵌入式系统原理及运用课程设计

嵌入式系统原理及运用课程设计

摘要嵌入式系统开始于20世纪80年代单片机的使用。

嵌入式技术已经渗透到各个领域,且与人们的日常生活密不可分,给人们生活和工业生产带来极大方便。

本文论述了嵌入式系统概念、嵌入式处理器、嵌入操作系统和嵌入软件开发环境,解释了嵌入式系统组成中的各个部分。

嵌入式操作系统具有良好的可移植性,能够用在根据应用要求选择的微处理器中。

嵌入式系统设计带来了与传统系统设计全然不同的挑战。

嵌入式系统已成为计算机领域的一个重要组成部分。

广泛讲,凡是带有微处理器的专用软硬件系统都可以称为嵌入式系统。

嵌入式系统可以通过各种无线形式和有线形式的网络连接方式实现它们之间的相互连接。

因此,在网络通信市场上极具生命力。

关键词嵌入式系统,嵌入式操作系统,μC/OS-ⅡABSTRACTThe Embedded system commenced with the use of SCM in 1980’s. The embedded technology has penetrated in every field. It’s inseparable with our daily life and it brings great convenience to people’s life and the industry.This paper discusses the concept of the embedded system, the embedded processor, the embedded operating system and the embedded software developing environment, explains the components of the embedded system.The embedded system has great compatibility. It can be used in MPU selected according to the application. The design of the embedded system brings the challenge witch is different with the traditional design.The embedded system has been an important component of the computer field. Universally speaking, all the private soft-hardware systems with MPU can be named with embedded system. The embedded systems can connect with each other through wireless and cable connecting way. Therefore, it is animate in the market of the communication networks.KEY WORDS Embedded system, Embedded operating system,μC/OS-Ⅱ目录第一章嵌入式系统概述 (1)1.1 嵌入式系统简介 (1)1.2 嵌入式系统的分类 (3)1.3 嵌入式系统设计的特点 (3)第二章嵌入式处理器 (5)2.1 嵌入式处理器简介 (5)2.2 常用嵌入式处理器 (6)第三章嵌入式操作系统 (7)3.1 嵌入式操作系统简介 (7)3.1.1 嵌入式操作系统的机制 (8)3.1.2 嵌入式操作系统的特点: (9)3.1.3 嵌入式操作系统的分类 (10)3.2 μC/OS-Ⅱ嵌入式操作系统 (10)3.2.1 μC/OS-Ⅱ实时操作系统结构 (11)3.2.2 μC/OS-Ⅱ嵌入式操作系统的特点 (11)3.2.3 μC/OS-Ⅱ的移植 (13)第四章嵌入式系统编程语言 (15)4.1 嵌入式系统的高级语言特点 (15)4.2 嵌入式系统高级语言开发过程 (15)4.3 嵌入式系统编程与系统硬件 (17)4.3.1 存储器映射 (17)4.3.2 I/O映射 (18)结束语 (19)参考文献 (20)第一章嵌入式系统概述1.1 嵌入式系统简介何谓嵌入式系统?根据英国电机工程师协会的定义所做的翻译,“嵌入式系统为控制、监视或辅助设备、机器或甚至工厂操作的装置”。

嵌入式Linux实时操作系统及应用编程代码与答案

嵌入式Linux实时操作系统及应用编程代码与答案

嵌入式Linux实时操作系统及应用编程嵌入式Linux实时操作系统及应用编程嵌入式Linux实时操作系统及应用编程嵌入式Linux实时操作系统及应用编程附录A 习题参考答案嵌入式Linux实时操作系统及应用编程第1章1.嵌入式系统是指操作系统和功能软件集成于计算机硬件系统之中。

简单的说就是系统的应用软件与系统的硬件一体化,类似与BIOS的工作方式。

具有软件代码小,高度自动化,响应速度快等特点。

特别适合于要求实时的和多任务的体系。

根据IEEE(国际电气和电子工程师(原文为devices 协会)的定义:嵌入式系统是“用于控制、监视或者辅助操作机器和设备的装置”used to control,monitor,or assist the operation of equipment,machinery or plants)。

简单地讲就是嵌入到对象体中的专用计算机系统。

嵌入式系统一般有3个主要的组成部分:硬件、实时操作系统以及应用软件。

●硬件:包括处理器、存储器(ROM、RAM)、输入输出设备、其他部分辅助系统等。

●实时操作系统(Real-Time Operating System,RTOS):用于管理应用软件,并提供一种机制,使得处理器分时地执行各个任务并完成一定的时限要求。

●应用软件:实现具体业务逻辑功能。

2.嵌入式系统的三要素是嵌入、专用、计算机;其中嵌入性指的是嵌入到对象体系中,有对象环境要求;专用性是指软、硬件按对象要求裁减;计算机指实现对象的智能化功能。

广义地说一个嵌入式系统就是一个具有特定功能或用途的计算机软硬件集合体。

即以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。

3.嵌入式实时操作系统(Real-Time Operating System,RTOS)是指操作系统本身要能在一个固定时限内对程序调用(或外部事件)做出正确的反应,亦即对时序与稳定性的要求十分严格。

单片机嵌入式系统原理及应用课后答案

单片机嵌入式系统原理及应用课后答案

单片机嵌入式系统原理及应用课后答案【篇一:单片机原理及嵌入式系统设计第一次作业习题】1、用8位二进制数表示出下列十进制数的补码:+65 、—115[+65]补:0100 0001[-115]补:1100 11012 、写出十进制数12.4用的bcd码和二进制数:bcd码:0001 0010.0100 二进制数:1100.0110011001100110(结果保留16位小数) 3 、当采用奇校验时,ascii码1000100和1000110的校验位d7应为何值?这2个代码所代表的字符是什么?答:分别为0和1,代表字符分别是d和f4、计算机由(运算器、控制器、存储器、输入设备、输出设备)五部分组成。

5、画出微机的组成框图,说明三总线的作用。

数据总线db:在控制总线的配合下传递cpu的输入/输出数地址总线ab:选择芯片或选择芯片中的单元,以便cpu通过控制总线让数据总线与该单元之间单独传输信息控制总线cb:配合数据总线与地址总线起作用,负责传递数据总线或地址总线的有效时刻和数据总线的传输方向等信息6、8位微机所表示的无符号数、带符号数、bcd码的范围分别是多少?答:8位微机所表示的无符号数范围:0~255带符号数范围:-128~+127bcd码范围:0~997、1001001b分别被看作补码、无符号数、ascii码、bcd码时,它所表示的十进制数或字符是什么?答:分别是补码73,无符号数73,bcd码498、举例说出单片机的用途。

答:比如马路上红路灯的时间控制;洗衣机的洗涤、甩干过程的自动控制等9、举例说明cpu执行指令的过程。

答:计算机每执行一条指令都可分为三个阶段进行。

即取指令、分析指令、执行指令。

根据程序计数器pc中的值从程序存储器读出现行指令,送到指令寄存器。

将指令寄存器中的指令操作码取出后进行译码,分析其指令性质。

如指令要求操作数,则寻找操作数地址。

计算机执行程序的过程实际上就是逐条指令地重复上述操作过程,直至遇到停机指令可循环等待指令。

嵌入式单片机STM32原理及应用

嵌入式单片机STM32原理及应用

嵌入式单片机STM32原理及应用简要介绍嵌入式单片机STM32的基本概念和应用领域。

解释嵌入式单片机的基本原理和构造。

探讨STM32芯片的特点和功能。

介绍搭建嵌入式开发环境所需的软件和硬件工具。

提供逐步指南以完成环境的搭建。

介绍STM32的编程语言和开发工具。

探讨基本的编程概念和语法规则。

提供一些实际的应用案例,展示STM32在各个领域的应用。

包括但不限于智能家居、工业自动化、医疗设备等。

探讨一些与STM32开发相关的工具、调试技巧和在线资源。

提供一些值得参考的书籍、网站和社区。

总结嵌入式单片机STM32的基本原理和应用。

提供进一步研究的方向和建议。

列出所参考的相关文献和资源。

1.简介嵌入式单片机STM32是一种高性能、低功耗的微控制器系列,广泛应用于现代科技领域。

本文将介绍嵌入式单片机STM32的概念以及其在各个领域中的应用。

嵌入式单片机STM32是由___推出的一系列32位ARMCortex-M内核的微控制器。

它具有高性能、低功耗、丰富的外设资源和灵活的扩展能力,适用于各种嵌入式应用。

在现代科技中,嵌入式单片机STM32的应用非常广泛。

它可以用于工业自动化控制系统,如制造业中的机器人控制、流水线控制等。

此外,它还被广泛应用于智能家居系统,如智能门锁、智能灯光控制等。

嵌入式单片机STM32还可以用于交通工具控制系统,如汽车电子控制单元(ECU)、飞机控制系统等。

此外,它还可以用于医疗设备、安防系统、物联网设备等领域。

总之,嵌入式单片机STM32以其强大的功能和广泛的应用领域,成为现代科技中不可或缺的一部分。

通过研究嵌入式单片机STM32的原理和应用,我们能够更好地理解和应用这一领域的技术进展。

本部分将讲解嵌入式单片机STM32的基本原理,包括其构成和工作原理。

嵌入式单片机STM32是一种高性能、低功耗的微控制器,由处理器核、存储器、外设接口和时钟控制等组成。

它通过引脚与外围电路连接,用于控制各种电子设备和系统。

嵌入式原理实验代码集合

嵌入式原理实验代码集合

嵌⼊式原理实验代码集合=============================================================实验⼀AREA Examplel,CODE,READONLY;声明代码段ENTRY ;标识程序⼊⼝CODE32 ;声明32位ARM指令START MOV R0,#15 ;设置参数MOV R1,#8ADDS R0,R0,R1 ;R0=R0+R1B STARTEND========================================================================= 实验⼆=========================================================================实验⼆汇编指令实验1COUNT EQU 0x40003100 ;定义⼀个变量,地址为0x40003100AREA Example2,CODE,READONLY ;声明代码段Example2ENTRY ;标识程序⼊⼝CODE32 ;声明32位ARM指令START LDR R1,=COUNT ;R1<=COUNTMOV R0,#0 ;R0<=0STR R0,[R1] ;[R1]<=R0LOOP LDR R1,=COUNTLDR R0,[R1] ;R0<=[R1]ADD R0,R0,#1 ;R0<=R0+1CMP R0,#10 ;R0与10⽐较,影响条件码标志MOVHS R0,#0 ;若R0⼤于等于10.执⾏R0<=0STR R0,[R1] ;[R1]<=R0,即保存COUNTB LOOPEND实验⼆思考题:思考题:第五题:COUNT EQU 0x40003400 ;定义⼀个变量,地址为0x40003400AREA Example2,CODE,READONLY ;声明代码段Example2ENTRY ;标识程序⼊⼝CODE32 ;声明32位ARM指令START LDR R1,=COUNT ;R1<=COUNTMOV R0,#80 ;R0<=80STR R0,[R1] ;[R1]<=R0LOOP LDR R1,=COUNTLDR R0,[R1] ;R0<=[R1]SUB R0,R0,#2 ;R0<=R0-2CMP R0,#60 ;R0与60⽐较,影响条件码标志MOVLO R0,#80 ;若R0⼤于等于60.执⾏R0<=80STR R0,[R1] ;[R1]<=R0,即保存COUNTB LOOPEND思考题第六题COUNT EQU 0x40003400 ;定义⼀个变量,地址为0x40003400AREA Example2,CODE,READONLY ;声明代码段Example2ENTRY ;标识程序⼊⼝CODE32 ;声明32位ARM指令START LDR R1,=COUNT ;R1<=COUNTLDR R0,=0xAA11BB22 ;R0<=0xAA11BB22STR R0,[R1] ;[R1]<=R0LDR R1,=COUNTLDR R0,[R1]LDRH R0,[R1]LDRSH R0,[R1]LDRB R0,[R1]LDRSB R0,[R1]LDR R0,=0xFFFFFFCCSTRB R0,[R1]STRH R0,[R1]STR R0,[R1]B STARTEND实验三汇编指令实验2X EQU 11 ; 定义X的值为11Y EQU 8 ; 定义Y的值为8BIT23 EQU (1<<23) ; 定义BIT23的值为0x00800000AREA Example3,CODE,READONLY ; 声明代码段Example3ENTRY ; 标识程序⼊⼝CODE32 ; 声明32位ARM指令START ; 使⽤MOV、ADD指令实现:R8 = R3 = X + YMOV R0,#X ; R0 <= X,X的值必须是8位图数据MOV R1,#Y ; R1 <= Y,Y的值必须是8位图数据ADD R3,R0,R1 ; 即是R3 = X + YMOV R8,R3 ; R8 <= R3; 使⽤MVN、SUB指令实现:R5 = 0x5FFFFFF8 - R8 * 8MVN R0,#0xA0000007 ; 0xA0000007的反码为0x5FFFFFF8SUB R5,R0,R8,LSL #3 ; R8左移3位,结果即是 R8 * 8; 使⽤CMP指令判断(5*Y/2)>(2*X)吗?若⼤于则R5 = R5&0xFFFF0000,否则R5 = R5|0x000000FF MOV R0,#YADD R0,R0,R0,LSL #2 ; 计算R0 = Y + 4*Y = 5*YMOV R0,R0,LSR #1 ; 计算R0 = 5*Y/2MOV R1,#XMOV R1,R1,LSL #1 ; 计算R1 = 2*XCMP R0,R1 ; ⽐较R0和R1,即(5*Y/2)和(2*X)进⾏⽐较LDRHI R2,=0xFFFF0000 ; 若(5*Y/2)>(2*X),则R2 <= 0xFFFF0000ANDHI R5,R5,R2 ; 若(5*Y/2)>(2*X),则R5 = R5&R2ORRLS R5,R5,#0x000000FF ; 若(5*Y/2)≤(2*X),则R5 = R5|0x000000FF; 使⽤TST指令测试R5的bit23是否为1,若是则将bit6位清零(使⽤BIC指令)TST R5,#BIT23BICNE R5,R5,#0x00000040B STARTEND实验三思考题:思考题1:不正确,直接带⼊,不符合图8位AREA Example4,CODE,READONLY;声明代码段 Example4ENTRY;CODE32 ;声明32位ARM指令STARTLDR R2,=0x1234LDR R3,=0x5678LDR R5,=0x9ACDLDR R6,=0xEF12ADDS R5,R2,R5;ADC R6,R3,R6;B STARTENDX EQU 11 ; 定义X的值为11Y EQU 8 ; 定义Y的值为8BIT23 EQU (1<<23) ; 定义BIT23的值为0x00800000AREA Example3,CODE,READONLY ; 声明代码段Example3ENTRY ; 标识程序⼊⼝CODE32 ; 声明32位ARM指令START ; 使⽤MOV、ADD指令实现:R8 = R3 = X + YMOV R0,#X ; R0 <= X,X的值必须是8位图数据MOV R1,#Y ; R1 <= Y,Y的值必须是8位图数据ADD R3,R0,R1 ; 即是R3 = X + YMOV R8,R3 ; R8 <= R3; 使⽤MVN、SUB指令实现:R5 = 0x5FFFFFF8 - R8 * 8MVN R0,#0xA0000007 ; 0xA0000007的反码为0x5FFFFFF8SUB R5,R0,R8,LSL #3 ; R8左移3位,结果即是 R8 * 8; 使⽤CMP指令判断(5*Y/2)>(2*X)吗?若⼤于则R5 = R5&0xFFFF0000,否则R5 = R5|0x000000FF MOV R0,#YADD R0,R0,R0,LSL #2MOV R0,R0,LSR #1MOV R1,#XMOV R1,R1,LSL #1CMP R0,R1LDRLS R2,=0xFFFF0000;ANDHI R5,R5,#0x000000FF;ORRLS R5,R5,R2B STARTENDX EQU 200 ; 定义X的值为11Y EQU 163 ; 定义Y的值为8BIT23 EQU (1<<23) ; 定义BIT23的值为0x00800000AREA Example3,CODE,READONLY ; 声明代码段Example3ENTRY ; 标识程序⼊⼝CODE32 ; 声明32位ARM指令START ; 使⽤MOV、RSB指令实现:R8 = R3 = X - YMOV R0,#X ; R0 <= X,X的值必须是8位图数据MOV R1,#Y ; R1 <= Y,Y的值必须是8位图数据RSB R3,R0,R1 ; 即是R3 = X-YMOV R8,R3 ; R8 <= R3;R5=R8*5-0x123ADD R8,R8,R8,LSL #2;R8=R8+4*R8=5R8LDR R2,=0x123;SUB R5,R8,R2;; 使⽤CMP指令判断(4*Y/3+30)>(3*X-20)吗?若⼤于则R5 = R5&0xFF0000FF,否则R5 = R5|0x00FF0000 MOV R0,#Y/3MOV R0,R0,LSL #2ADD R0,R0,#30MOV R1,#XADD R1,R1,R1,LSL #1SUB R1,R1,#20;CMP R0,R1 ; ⽐较R0和R1LDRHI R2,=0xFF0000FF ; 若断(4*Y/3+30)>(3*X-20)则R2 <= 0xFF0000FFANDHI R5,R5,R2 ; 若(4*Y/3+30)>(3*X-20),则R5 = R5&R2ORRLS R5,R5,#0x00FF0000 ; 若(4*Y/3+30)<=(3*X-20),则R5 = R5|0x00FF0000B STARTEND实验四汇编指令实验3实验的⽬的使⽤ARM汇编指令实现结构化程序编程1 使⽤ARM汇编指令实现 if 条件执⾏2 使⽤ARM汇编指令实现 for 循环结构3 使⽤ARM汇编指令实现 while 循环结构4 使⽤ARM汇编指令实现 do...while 循环结构5 使⽤ARM汇编指令实现 switch 开关结构1 使⽤ARM汇编指令实现 if 条件执⾏第⼀个案例 if结构;if(x>y); z=100;;else; z=50;;设x为R0,y为R1,z为R2(x,y,z均为⽆符号整数)AREA Example4,CODE,READONLY;声明代码段 Example4ENTRY;CODE32 ;声明32位ARM指令START MOV R0,#76;初始化x的值MOV R1,#234;初始化y的值CMP R0,R1;判断x>yMOVHI R2,#100;x>y条件正确,z=100MOVLS R2,#50;条件失败,z=502 使⽤ARM汇编指令实现 for 循环结构⼆案例 for结构;forIi==0;i<10;i++);{;x++;};设x为R0,i为R2(i,x均为⽆符号整数)AREA Example5,CODE,READONLY;声明代码段 Example5ENTRY;CODE32 ;声明32位ARM指令MOV R0,#0;初始化x的值MOV R2,#0;设置i=0FOR_L1 CMP R2,#10;判断i<10?BHS FOR_END;若条件失败,退出循环ADD R0,R0,#1;循环体,X++ADD R2,R2,#1;i++B FOR_L1FOR_END NOP3 使⽤ARM汇编指令实现 while 循环结构第三个案例 while结构;while(x<y);{;x*=2;};设x为R0,y为R1(x,y均为⽆符号整数)AREA Example6,CODE,READONLY;声明代码段 Example6 ENTRY;CODE32 ;声明32位ARM指令MOV R0,#1;初始化x的值MOV R2,#20;初始化y的值B WHILE_L2;⾸先要盘判断条件WHILE_L1 MOV R0,R0,LSL #1;循环体,x*=2WHILE_L2 CMP R0,R1;判断x<=yBLS WHILE_L1;若条件正确,继续循环WHILE_END NOP4 使⽤ARM汇编指令实现 do...while 循环结构第四个案例do....while()结构;do;{;x--;;}while(x>0);设x为R0,(x为⽆符号整数)AREA Example6,CODE,READONLY;声明代码段 Example6 ENTRY;CODE32 ;声明32位ARM指令MOV R0,#5;初始化x的值DOWHILE_L1 ADD R0,R0,#-1;循环体,x--;DOWHILE_L2 MOVS R0,R0;R0<=R0,并且影响条件标志BNE DOWHILE_L1;若R0不为0(即x不为0)继续循环DOWHILE_END NOP5 使⽤ARM汇编指令实现 switch 开关结构第五个案例switch;switch(key&0x0F);{; case0:; case2:; case3:x=key+y;; break;; case5:x=key-y;; break;; case7:x=key*y;; break;; default x=168;; break;;};设x为R0,y为R1,key为R2(x,y,key均为⽆符号整数)AREA Example6,CODE,READONLY;声明代码段 Example6 ENTRY;CODE32 ;声明32位ARM指令MOV R1,#3;初始化y的值MOV R2,#2;初始化key的值SWITCH AND R2,R2,#0x0F;switch(key&0x0F)CASE_0 CMP R2,#0;case0:CASE_2 CMPNE R2,#2;case2:CASE_3 CMPNE R2,#3;case3:BNE CASE_5ADD R0,R2,R1;x=key+yB SWITCH_END;break;CASE_5 CMP R2,#5;case5:BNE CASE_7SUB R0,R2,R1;x=key-yB SWITCH_END;break;CASE_7 CMP R2,#7;case7:BNE DEFAULTMUL R0,R2,R1;x=key*yB SWITCH_END;breakDEFAULT MOV R0,#168;default x=168SWITCH_END NOPHALT B HALTEND实验四思考题:;if(x>80){; if(x>90){; z=4;; }else{; z=3;; };}else{; if(x>70){; z=2;; }else{; if(x>=60) z=1;else z=0;; };};设x为R0,z为R2(x,z均为⽆符号整数)AREA Example4,CODE,READONLY;声明代码段 Example4 ENTRY;CODE32 ;声明32位ARM指令START MOV R0,#76;初始化x的值CMP R0,#80;x与80⽐较BHS IF_L1;⼤于或者等于80的时候BLO IF_L2;⼩于80的时候IF_L1 CMP R0,#90;x与90⽐较MOVHS R2,#4;⼤于等于90的时候对z=4MOVLO R2,#3;⼤于80⼩于90的时候z=3IF_L2 CMP R0,#70;x与70⽐较MOVHS R2,#2CMPLO R0,#60;MOVHS R2,#1;MOVLO R2,#0;HALT B HALTEND思考题3:if结构;if(a==b) c=100;;else c=50;;设a为R0,b为R1,c为R2;a,b,c均为⽆符号整数AREA Example4,CODE,READONLY;声明代码段 Example4 ENTRY;CODE32 ;声明32位ARM指令START MOV R1,#3;初始化y的值MOV R2,#2;初始化key的值CMP R0,R1;判断a==bMOVEQ R2,#100;MOVHE R2,#50;思考题3:for结构;for(x=0;i=5;i>0;i--);{;x=x+i;;};设x为R0,i为R2(i,x均为⽆符号整数)AREA Example4,CODE,READONLY;声明代码段 Example4ENTRY;CODE32 ;声明32位ARM指令START MOV R0,#0;初始化x的值MOV R2,#5;初始化iFOR_L1 CMP R2,#0;i>0?BLS FOR_END;ADD R0,R0,R2;SUB R2,R2,#1;B FOR_L1FOR_END NOP思考题3:while()结构;x=0;y=0;;while(x<10);{; y=y+x;; x++;;};设x为R0,y为R1(x,y均为⽆符号整数)AREA Example4,CODE,READONLY;声明代码段 Example4ENTRY;CODE32 ;声明32位ARM指令START MOV R0,#0;MOV R1,#0;B WHILE_L1;⾸先要盘判断条件WHILE_L1 ADD R1,R0,R1;ADD R0,R0,#1;WHILE_L2 CMP R0,#10;BLO WHILE_L1;WHILE_END NOP;思考题3:swith()结构;x=1;;switch(x){; case0:y=0;break;; case1:y=1;break;; case2:y=2;break;; default:y=3;break;;};设x为R0,y为R1(x,y均为⽆符号整数)AREA Example4,CODE,READONLY;声明代码段 Example4ENTRY;CODE32 ;声明32位ARM指令START MOV R0,#1;SWITCHCASE_0 CMP R0,#0;ENE CASE_1MOV R1,#0;B SWITCH_ENDCASE_1 CMP R0,#1;BNE CASE_2MOV R1,#1;B SWITCH_ENDCASE_2 CMPNE R0,#2;BNE DEFAULTMOV R1,#2;B SWITCH_ENDDEFAULT MOV R1,#3;SWITCH_END实验五;定义堆栈的⼤⼩USR_STACK_LEGTH EQU 64SVC_STACK_LEGTH EQU 0FIQ_STACK_LEGTH EQU 16IRQ_STACK_LEGTH EQU 64ABT_STACK_LEGTH EQU 0UND_STACK_LEGTH EQU 0AREA Example5,CODE,READONLY ; 声明代码段Example5ENTRY ; 标识程序⼊⼝CODE32 ; 声明32位ARM指令START MOV R0,#0MOV R1,#1MOV R2,#2MOV R3,#3MOV R4,#4MOV R5,#5MOV R6,#6MOV R7,#7MOV R8,#8MOV R9,#9MOV R10,#10MOV R11,#11MOV R12,#12BL InitStack ; 初始化各模式下的堆栈指针; 打开IRQ中断 (将CPSR寄存器的I位清零)MRS R0,CPSR ; R0 <= CPSRBIC R0,R0,#0x80MSR CPSR_cxsf,R0 ; CPSR <= R0; 切换到⽤户模式MSR CPSR_c, #0xd0MRS R0,CPSR; 切换到管理模式MSR CPSR_c, #0xdfMRS R0,CPSRHALT B HALT; 名称:InitStack; 功能:堆栈初始化,即初始化各模式下的堆栈指针。

嵌入式系统原理及应用技术

嵌入式系统原理及应用技术

1.嵌入式系统的定义:一般都认为嵌入式系统是以应用为中心,以计算机技术为根底,并且软硬件可裁剪,可满足应用系统对功能、可靠性、本钱、体积和功能有严格要求的专用计算机系统。

2.嵌入式系统的特征:〔1〕通常是面向特定应用的。

具有功耗低、体积小和集成度高等特点。

〔2〕硬件和软件都必须高效率地设计,量体裁衣,力争在同样的硅片面积上实现更高的性能,这样才能满足功能、可靠性和功耗的苛刻要求。

〔3〕实时系统操作支持。

〔4〕嵌入式系统与具体应用有机结合在一起,升级换代也同步进展。

〔5〕为了提高运行速度和系统可靠性,嵌入式系统中的软件一般固化在存储器芯片中。

3.ARM嵌入式微系统的应用:工业控制、网络系统、成像和平安产品、无线通信、消费类电子产品。

4.ARM嵌入式微处理器的特点:〔1〕体积小、低功耗、低本钱、高性能。

〔2〕支持Thumb〔16位〕/ARM〔32位〕双指令集,兼容8位/16位器件。

〔3〕使用单周期指令,指令简洁规整。

〔4〕大量使用存放器,大多数数据都在存放器中完成,只有加载/存储指令可以存储器,以提高指令的执行效率。

〔5〕寻址方式简单灵活,执行效率高。

〔6〕固定长度的指令格式。

5.嵌入式系统一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统、用户软件构成。

2.哈佛体系构造的主要特点是将程序和数据存储在不同的存储空间。

3.嵌入式处理器主要有四种嵌入式微处理器〔EMPU〕、嵌入式微控制器〔MCU〕、嵌入式数字信号处理器〔DSP〕、嵌入式片上系统〔SoC)4.ARM7采用3级流水线构造,采用·诺依曼体系构造;ARM9采用5级流水线构造,采用哈佛体系构造。

5.ARM处理器共有37个32bit存放器,包括31个通用存放器和6个状态存放器。

6.ARM体系构造可以用2种方法存储字数据,即大端格式和小端格式。

7.ARM处理器既支持32位的ARM指令集又支持16位的THCMB指令集。

8.ARM处理器有7种工作模式,他们分为两大类特权模式、非特权模式。

嵌入式系统原理及应用大作业题目

嵌入式系统原理及应用大作业题目

嵌入式系统原理及应用大作业题目1、基于ARM的数字相框以实验箱为基础编程实现多幅图片(4幅以上,按照屏幕的分辨率选择图片即可)的显示。

可以裸机编程,也可建立于uC/osII操作系统平台基础上。

多幅图片换页显示,使用触摸屏进行翻页,手写笔向左滑动实现上一页图片显示,相反,手写笔向右滑动实现下一页图片显示。

扩展功能1,实现图片间切换的动态效果;扩展功能2,实现图片放大缩小的效果。

2、基于ARM的数字式万年历可以显示时、分、秒,倒计时,秒表等功能,显示器可选(数码管或液晶屏);要求使用LPC内部的实时时钟;实现按键调整时间。

扩展功能:用触屏查询。

3、基于ARM+LCD的菜单设计具有3级菜单,每级菜单至少3个菜单项。

扩展功能:每个菜单项设计一个小的演示功能。

4、公交报站显示器用触摸屏点击模拟到站,通过液晶显示提示信息(汉字)。

5、计算器用触摸屏做人机接口,实现软计算器。

6、直流电机控制用7290键盘控制直流电机转速,设置转速阈值,实现超限报警(闪灯)。

7、远程报警指示器通过RS485总线实现远程通信,报警端通过按键触发并蜂鸣,然后通过总线远传到显示端,显示端使用LCD显示报警的主机号,并蜂鸣;显示端实现回传信息撤销报警。

扩展功能:使用CAN总线替换RS485总线实现通信。

8、步进电机控制用LCD显示一个滑块控件,通过触摸屏操作滑块来设置步进电机转动的角度;扩展功能:实现顺、逆时针两个方向的转动;实现多级变速。

9、彩灯显示用触屏控制数码管、单色灯,实现8种以上的动态亮灯方案。

10、交通灯自行设定交通规则,要求在LCD显示器上画出交通灯模型,在数码管上显示交通灯的秒表倒计时数。

嵌入式操作系统原理及应用考试试卷

嵌入式操作系统原理及应用考试试卷

嵌入式操作系统原理及应用考试试卷(答案见尾页)一、选择题1. 嵌入式操作系统的主要特点是什么?A. 多任务处理B. 低资源消耗C. 高性能计算D. 实时性2. 在嵌入式系统中,中断服务程序的主要作用是什么?A. 提供用户界面B. 处理输入输出操作C. 管理内存分配D. 强制执行特定任务3. 嵌入式实时操作系统与普通操作系统的区别主要在于什么?A. 多任务处理能力B. 资源利用率C. 任务响应时间D. 系统开销4. 下面哪个不是嵌入式操作系统的组成部分?A. 内核B. 文件系统C. 应用编程接口D. 硬件抽象层5. 在嵌入式系统中,中断控制器的主要功能是什么?A. 管理中断请求B. 提供硬件驱动C. 进行多任务调度D. 进行系统调试6. 嵌入式操作系统通常用于哪种类型的设备?A. 智能手机B. 笔记本电脑C. 家庭电器D. 工业控制系统7. 嵌入式操作系统的内存管理通常采用什么方式?A. 分段存储管理B. 分页存储管理C. 段页式存储管理D. 逻辑地址映射8. 在嵌入式系统中,设备驱动程序的主要作用是什么?A. 提供用户界面B. 控制硬件设备C. 管理内存分配D. 进行系统调试9. 嵌入式操作系统的文件系统通常采用什么结构?A. 分层树状结构B. 网状结构C. 图状结构D. 链表结构10. 在嵌入式系统中,任务调度算法的选择通常基于什么因素?A. 任务的优先级B. 任务的处理时间C. 任务之间的依赖关系D. 系统的资源限制11. 嵌入式操作系统的基本特征不包括以下哪项?A. 可定制性B. 实时性C. 可靠性D. 开放性12. 在嵌入式系统中,最常见的操作系统内核类型是:A. 微内核B. 硬实时内核C. 软实时内核D. 完整内核13. 嵌入式操作系统的主要应用领域不包括以下哪项?A. 消费电子产品B. 工业控制系统C. 汽车电子D. 个人计算机14. 下列哪种编程语言不是嵌入式操作系统常用的编程语言?A. C语言B. C++C. JavaD. Python15. 在嵌入式系统设计中,通常优先考虑的是:A. 性能B. 可靠性C. 易用性D. 成本16. 嵌入式操作系统中的任务调度通常基于以下哪种算法?A. 先来先服务(FCFS)B. 最短作业优先(SJF)C. 时间片轮转(RR)D. 多级反馈队列(MFQ)17. 在嵌入式系统中,中断服务例程通常属于以下哪种类型的代码?A. 临界区B. 递归C. 中断处理程序D. 子程序18. 嵌入式系统中常用的I/O设备驱动程序通常具有以下哪些特点?A. 高效性B. 简单性C. 可移植性D. 可扩展性19. 在嵌入式系统开发过程中,通常首先需要进行的是:A. 系统需求分析B. 硬件平台选择C. 软件开发D. 测试与验证20. 嵌入式操作系统的性能优化通常涉及以下哪些方面?A. 代码优化B. 系统架构调整C. 外设选用D. 功耗管理21. 嵌入式操作系统的核心特点是什么?A. 多任务处理B. 实时性C. 可移植性D. 高度集成22. 下列哪个不是嵌入式操作系统的组成部分?A. 内核B. 应用程序C. 设备驱动程序D. 系统调用接口23. 在嵌入式系统中,实时性是指什么?A. 系统响应时间短B. 系统不出现故障C. 系统能够自主运行D. 系统兼容性好24. 嵌入式操作系统通常如何管理内存?A. 分段存储管理B. 分页存储管理C. 段页式存储管理D. 无分页管理25. 嵌入式系统中的设备驱动程序主要用于:A. 提供用户界面B. 管理硬件资源C. 运行应用程序D. 连接网络26. 嵌入式操作系统中的多任务处理是如何实现的?A. 通过进程实现B. 通过线程实现C. 通过时间片轮转实现D. 通过优先级调度实现27. 嵌入式操作系统如何确保数据的安全性?A. 使用加密技术B. 采用访问控制列表C. 实施冗余备份D. 进行病毒和恶意软件检测28. 在嵌入式系统开发中,通常使用哪种编程语言?A. C语言B. JavaC. PythonD. JavaScript29. 嵌入式系统的生命周期通常比传统计算设备长,这主要是因为:A. 嵌入式系统更加节能B. 嵌入式系统通常工作在低功耗模式下C. 嵌入式系统的硬件更新缓慢D. 嵌入式系统的软件复杂性较低30. 嵌入式操作系统的基本特征包括:A. 可移植性B. 可扩展性C. 稳定性D. 兼容性31. 在嵌入式系统中,通常使用哪种编程语言进行开发?A. 汇编语言B. C语言C. JavaD. Python32. 嵌入式操作系统的主要应用领域不包括:A. 消费电子产品B. 工业控制系统C. 汽车电子D. 个人电脑33. 下面哪个不是嵌入式操作系统的工作模式?A. 单任务模式B. 多任务模式C. 循环任务模式D. 中断驱动模式34. 在嵌入式系统中,中断服务程序的作用是:A. 处理高优先级的中断事件B. 提供系统调用接口C. 管理硬件设备D. 保证数据一致性35. 嵌入式实时操作系统的特点不包括:A. 及时性B. 可预测性C. 不确定性D. 有限性36. 在嵌入式系统开发中,常用的开发工具有哪些?A. 集成开发环境(IDE)B. 仿真器C. 调试器D. 编译器37. 嵌入式操作系统的启动过程通常包括以下几个阶段:A. 启动引导程序B. 加载操作系统内核C. 系统初始化D. 用户登录38. 在嵌入式系统设计中,为了提高系统的可靠性,通常会采用哪种冗余技术?A. 冗余硬件B. 冗余软件C. 数据冗余39. 下面哪个不是嵌入式操作系统的内存管理方式?A. 分页管理B. 分段管理C. 段页式管理D. 页表式管理40. 嵌入式操作系统通常运行在哪种类型的硬件上?A. 大型机B. 小型计算机C. 微型计算机D. 单片机或微控制器41. 在嵌入式系统中,中断服务例程的主要作用是什么?A. 处理异常情况B. 实现多任务C. 管理内存资源D. 提供系统调用42. 嵌入式操作系统中的任务调度算法通常考虑哪些因素?A. 优先级B. 资源利用率C. 任务等待时间D. 以上都是43. 嵌入式系统中常用的设备驱动程序类型有哪几种?A. 字符设备驱动程序B. 块设备驱动程序C. 网络设备驱动程序D. 以上都是44. 嵌入式操作系统的实时性是通过什么来保证的?B. 软件优化C. 系统架构设计D. 以上都是45. 在嵌入式系统开发中,选择合适的嵌入式操作系统需要考虑哪些因素?A. 性能需求B. 功能需求C. 成本预算D. 以上都是46. 嵌入式操作系统的内存管理通常采用哪种策略?A. 分页B. 分段C. 段页式D. 以上都是47. 在嵌入式系统应用程序开发中,常用的编程语言有哪些?A. CB. C++C. JavaD. Python注意:虽然Python也可以用于嵌入式系统开发,但在此题中可能更偏向于通用知识,因此没有将其列为正确答案。

嵌入式系统代码

嵌入式系统代码

嵌入式系统代码第1章无代码第2章2.5 实践-HelloWorldHelloWorld.cpp#include //头文件,包含常用的标准库函数int main(void) //主函数,程序入口{ //函数开始标志printf("HelloWorld!"); //调用标准库函数return 0; //函数返回值} //函数结束标志第3章3.1程序式计算器实例cal1.cpp#include#includeint main(void){int a,b,sum,sub,mul,div;printf(“请输入两个整数”);scanf(“%d%d”,&a,&b);sum=a+b;printf(“a+b=%d\n”,sum);sub=a-b;printf(“a-b=%d\n”,sub);mul=a*b;printf(“a*b=%d\n”,mul);div=a/b;printf(“a/b=%d\n”,div);}3.2基本要素fun_test.cpp#include#includeint main(void){double x,s;printf("input number:\n");scanf("%lf",&x);s=sin(x); //求x的sin值。

printf("sin of %lf is %lf\n",x,s);return 0;}3.7语句scanf_test.cpp#includeint main(void){int a,b,c;printf("input a,b,c\n");scanf("%d%d%d",&a,&b,&c);//输入三个整数printf("a=%d,b=%d,c=%d",a,b,c); //输出三个整数return 0;}fun_arg_test.cpp#includeint main(void){int i=8;printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,++i,++i,i++,+ +i); return 0;}3.8main函数详解before_main_after.cpp#include#includevoid fun1(void){printf("calling fun1\n");}int main(void){atexit(fun1);//注册main执行后自动调用printf("main exit\n");return 0;}3.11技能训练选择式计算器cal2.cpp#include#include#includeint main(void){int a,b,c;float key;while(1)//常用死循环结构{printf("1.加;2.减;3.乘;4.除;5.开方;6.乘方; 7.退出\n"); scanf("%f",&key);//以下是if选择结构if ( ((key-(int)key)==0) && key>0 && key<8 ){switch((int)key)//switch选择结构{case 1: /*加法*/printf("请输入两个整数:");scanf("%d%d",&a,&b);c=a+b;printf("The result is :%d\n",c);break;case 2:/*减法*/printf("请输入两个整数:");scanf("%d%d",&a,&b);c=a-b;printf("The result is :%d\n",c);break;case 3:/*乘法*/printf("请输入两个整数:");scanf("%d%d",&a,&b);c=a*b;printf("The result is :%d\n",c);break;case 4:/*除法*/printf("请输入两个整数:");scanf("%d%d",&a,&b);c=a/b;printf("The result is :%d\n",c);break;case 5:/*开方*/int y;double z;printf("请输入一个整数:"); scanf("%d",&y);z=sqrt(y);printf("The result is :%g\n",z); break;case 6:/*乘方*/printf("请输入一个整数:"); scanf("%d",&a);b=a*a;printf("The result is :%d\n",b); break;case 7: /*退出*/exit(0);}printf("\n");}elseprintf("Enter wrong!\n");}return 0;}循环式计算器cal3.cpp#includeint main(void){int sum=0;for (int i=0;i<100;i++)//for循环{sum=sum+i;printf("sum等于%d\n",sum); }return 0;}函数式计算器mul_fun_cal.cpp#include#includeint plus(){int a,b,sum;printf("请输入两个整数:"); scanf("%d%d",&a,&b);sum=a+b;printf("%d",sum);return sum;}int sunbduction(){int a,b,c;printf("请输入两个整数:"); scanf("%d%d",&a,&b);c=a-b;printf("%d",c);return c;}int multiplication(){int a,b,c;printf("请输入两个整数:"); scanf("%d%d",&a,&b); c=a*b;printf("%d",c);return c;}int division(){int a,b,c;printf("请输入两个整数:"); scanf("%d%d",&a,&b); c=a/b;printf("%d",c);;return c;}int sqrt(){int a,b;printf("请输入一个整数:"); scanf("%d",&a);b=sqrt(a);printf("%d",b);return b;}int power(){int a,b;printf("请输入一个整数:");scanf("%d",&a);b=a*a;printf("%d",b);return b;}int main(void){int a;printf("1.加法;2.减法;3.乘法;4.除法;5.开方;6.乘方\n"); scanf("%d",&a);if(a==1) plus();else if(a==2) sunbduction();else if(a==3) multiplication();else if(a==4) division();else if(a==5) sqrt();else if(a==6) power();return 0;}多文件计算器plus.h#ifndef PLUS_H#define PLUS_Hint plus();int a;#endifplus.cpp#include#include"plus.h"int plus(){int a,b,sum;printf("请输入两个整数:"); scanf("%d%d",&a,&b);sum=a+b;printf("%d\n",sum);return sum;}sub.h#ifndef SUB_H#define SUB_Hint sunbduction();#endifsub.cpp#include#include"sub.h"int sunbduction(){int a,b,c;printf("请输入两个整数:"); scanf("%d%d",&a,&b);c=a-b;printf("%d\n",c);return c;}…main.h#include "..\\div\\div.h"#include "..\\mul\\mul.h"#include "..\\plus\\plus.h"#include "..\\power\\power.h"#include "..\\sub\\sub.h"#include "..\\sqrt\\sqrt.h"main.cpp#include#include "main.h"int main(void){while(1){printf("选择你要的运算:1.加法;2.减法;3.乘法;4.除法;5.开方;6.乘方\n");scanf("%d",&a);if(a==1) plus();else if(a==2) sunbduction();else if(a==3) multiplication();else if(a==4) division();else if(a==5) sqrt();else if(a==6) power();}return 0;}3.12案例特训类型转换datatype_change1.cpp#include#includeint main(void){double num1 = 100.2000;double num2 = 3.56;int num3 = 200;char str1[25], str2[25], str3[25];gcvt(num1, 8, str1);//调用gcvt函数把浮点数转换成字符串gcvt(num2, 7, str2); //同上itoa(num3, str3, 3); //调用itoa把一整数转换为字符串printf("'num1' is %f and 'str1' is %s.\n",num1, str1);printf("'num2' is %f and 'str2' is %s.\n",num2, str2);printf("'num3' is %d and 'str3' is %s.\n",num3, str3);return 0;}datatype_change2.cpp#include#includeint main(void){int num = 100;char str[25];sprintf(str,"%d", num);// sprintf转变printf ("The number num is %d and the string str is %s.\n" , num, str);return 0;}进制转换num_conv.cpp#include#includevoid convert(char *p_output , int input_num, int number_digital) {//具体转变函数char bit[]={"0123456789ABCDEF"};int len;if(input_num==0){strcpy(p_output,"");return;}convert(p_output,input_num/number_digital,number_digital );len=strlen(p_output);p_output[len]=bit[input_num%number_digital];p_output[len+1]='\0';}int main( void ){char output_str[80];int input_value,number_digital,choose=0;while (1){printf("1:十进制转其它进制2:十六进制转其它进制3:退出\n");scanf("%d",&choose);getchar();if(choose==1){printf("请输入十进制数:");scanf("%d",&input_value);printf("请输入转换的进制:");scanf("%d",&number_digital);convert(output_str,input_value,number_digital);printf("%s\n",output_str);}if(choose==2){printf("请输入十六进制数:");scanf("%x",&input_value);printf("请输入转换的进制:");scanf("%d",&number_digital);convert(output_str,input_value,number_digital);printf("%s\n",output_str);}if(choose==3){break;}}return 0;}main_2_arg_1.cpp#includeint main(int argc, char *argv[]){int count;printf("The command line has %d arguments: \n",argc-1);for(count=1;count<argc;count++)< bdsfid="460" p=""></argc;count++)<>printf("%d: %s\n",count,argv[count]);return 0;}main_2_arg_2.cpp#includeint main(int argc, char *argv[]){FILE *fp;fp=fopen(argv[1],"w");fputs("I LOVE YOU!",fp);fclose(fp);return 0;}main_3_arg.cpp#includeint main(int argc,char *argv[],char *envp[]){int i;printf("You have inputed total %d argments\n",argc); for(i=0;i<argc;i++)< bdsfid="483" p=""></argc;i++)<> {printf("arg%d:%s\n",i,argv[i]);}printf("The follow is envp:\n");for(i=0;envp[i]!='\0';i++){printf("%s\n",envp[i]);}return 0;}第4章无参宏macro_no_arg.cpp#include#include#define PI 3.1415926 //无参宏int main(void){double x,y;printf(“输入一个数:”);scanf(“%1f”,&x);y=x*x*PI+4; //调用无参宏定义printf(“y=%f\n”,y);#undef PI //取消无参宏定义printf(“PI”);printf(“\n”);system(“PAUSE”);return 0;}带参宏macro_arg.cpp#include#include#define EXPR (x * x + 3 * x) //有参宏定义int main(void) {int x,y;printf("输入一个数:");scanf("%d", &x);y = 3 * EXPR + 4; //有参宏调用printf("y = %d\n", y);system("PAUSE");return 0;}条件编译compile_condition.cpp#include#define LINUX //定义宏int main(void){#ifdef OS_WIN32//没定义宏不编译printf("WINDOWS!\n");#else//编译printf("LINUX\n");#endifreturn 0;}断言assertassert.cpp#include//#define NDEBUG//来禁用assert调用#include#includeint main( void ){FILE *fp;fp = fopen( "test1.txt", "w" );assert( fp );fclose( fp );fp = fopen( "test2.txt", "r" );assert( fp );fclose( fp );return 0;}标准预定义宏std_macro.cppvoid print_version_info(void){printf("Date Compiled:%s\n",__DATE__);printf("Time Compiled:%s\n",__TIME__); }int main(void){print_version_info();return 0;}第5章调试测试无代码第6章数组6.1 数组array_test.cpp#includeint main(void){int i;int iArr[7];//数值数组char cArr[] = {'Q','U','A','N','X','U','E'};//字符数组printf("iArr=%p, cArr=%p\n\n", iArr, cArr);for (i=0; i<7; i++) {printf("iArr[%d]=%p, cArr[%d]=%p\n", i, &iArr[i], i, &cArr[i]); }return 0;}6.2 字符数组string_test.cpp#include#includeint main(void){char cArr[] = {'Q','U','A','N','X','U','E'};//字符数组char sArr[] = "qianrushi";//字符串赋值,末尾多个'\0' printf("cArr的长度=%d\n", sizeof(cArr));printf("sArr的长度=%d\n", sizeof(sArr));printf("cArr的内容=%s\n", cArr);printf("sArr的内容=%s\n", sArr);printf("cArr的长度=%d\n", strlen(cArr));printf("sArr的长度=%d\n", strlen(sArr));return 0;}6.3多维数组mul_array.cpp#includeint main(void){int i, j, k=0;int iArr[4][5]; //4行5列整数数组for (i=0; i<4; i++) {for (j=0; j<5; j++) {iArr[i][j] = k++;printf("iArr[%d,%d]=%2d &iArr[%d,%d]=%p\n", i, j, iArr[i][j], i, j, &iArr[i][j]);}printf("\n");}return 0;}字符串排序string_order.cpp#include#include#includevoid Bubble(char items[ ], int count)//冒泡排序算法{ int iNum;int iSeq;char t;for(iNum=1; iNum < count; ++iNum){for(iSeq=count-1; iSeq >= iNum; --iSeq){if(items[iSeq-1] > items[iSeq]){t = items[iSeq-1];items[iSeq-1] = items[iSeq];items[iSeq] = t;}}}}int main(void){char s[255];printf("Please input a string:");gets(s);Bubble(s, strlen(s));printf("The sorted string is: %s.\n", s);system("PAUSE");return 0;}第7章指针7.1指针实现连接两个字符串string_cat.cpp#include#include#includechar *StrCat (register char *dest, register const char *src) { register char *s1 = dest;register const char *s2 = src;register char ch;do{ch = *s1++;}while (ch != '\0');s1 -= 2;do{ch = *s2++;*++s1 = ch;} while (ch != '\0');return dest;}int main(void){char strDest[161] = "You are ";char strName[81];puts("Please Enter your name:");while ( (strlen(strDest)<80) && strlen(gets(strName)) ) {StrCat(strDest, strName);printf("%s\n", strDest);}system("PAUSE");return 0;}7.2指针数组和数组指针实现相同的功能pa_ap.cpp#includeint main(){char a[3][2]={{'f','i'},{'s','e'},{'t','h'}}; char *ap[3];// 指针数组char (*pa)[2]; //数组指针int i;for (i=0;i<3;i++){ap[i]=a[i];printf("%c %c\n",*ap[i],*(ap[i]+1));}pa=a;for(i=0;i<3;i++)printf("%c %c\n",**(pa+i),*(*(pa+i)+1)); return 0;}7.3返回指针函数p_fun.cpp#includefloat *find(float(*pionter)[4],int );int main(void){static float score[][4]={{60,70,80,90},{56,89,34,45},{34,23,56,45}}; float *p;int i,m;printf("Enter the number to be found:"); scanf("%d",&m);printf("the score of NO.%d are:\n",m);p=find(score,m);for(i=0;i<4;i++)printf("%5.2f\t",*(p+i));return 0;}float *find(float(*pionter)[4],int n){float *pt;pt=*(pionter+n);return(pt);}函数指针调用函数的方法fun_pointer.cpp#includeint max(int x,int y){ return(x>y?x:y); }int main(void){int (*ptr)(int,int);int a,b,c;ptr=max;scanf("%d,%d",&a,&b);c=(*ptr)(a,b);printf("a=%d,b=%d,max=%d",a,b,c); }第8章函数8.1max函数调用max_fun.cpp#includeint max(int a,int b){if(a>b)return a;else return b;}int main(void){int max(int a,int b);int x,y,z;printf("input two numbers:\n"); scanf("%d%d",&x,&y);z=max(x,y);printf("maxmum=%d",z);return 0;}函数入栈顺序arg_order.cpp#includeint main (void){int i=8;printf("%d-%d-%d-%d-\n",++i,++i,++i,++i); system("PAUSE");return 0;}参数传递的单向性arg_pass.cpp#include#includeint sum(int n){int i;for(i=n-1;i>=1;i--)n=n+i;printf("n=%d\n",n);return n;}int main(void){int n;printf("input number\n");scanf("%d",&n);sum(n);printf("n=%d\n",n);return 0;}8.3参数传递交换两个数swap.cpp#include//值传递void swap1(int a, int b) {int temp;temp = a;a = b;b = temp;}//指针传递void swap2(int *a, int *b) { int temp;temp = *a;*a = *b;*b = temp;}//数组传递void swap3(int x[]){int z;z=x[0];x[0]=x[1];x[1]=z;}//引用传递void swap4(int &a, int &b) {int temp;temp = a;a = b;b = temp;}int main(void){int num1, num2;num1 = 123;num2 = 456;printf("The two numbers are:%d %d\n", num1, num2);swap1(num1, num2);printf("After swap1, the two numbers are:%d %d\n", num1, num2);num1 = 123;num2 = 456;swap2(&num1, &num2);printf("After swap2, the two numbers are:%d %d\n", num1, num2);int a[2]={1,2};swap3(a);printf("After swap4, a[0]=%d\na[1]=%d\n",a[0],a[1]);num1 = 123;num2 = 456;swap4(num1, num2);printf("After swap3, the two numbers are:%d %d\n", num1, num2);return 0;}8.5 字符串库函数mystrcpy.cpp#includechar * mystrcpy(char * strDest,const char * strSrc){if ((strDest==NULL)||(strSrc==NULL))throw( "Invalid argument(s)"); char * strDestCopy=strDest;while ((*strDest++=*strSrC++)!='\0');。

嵌入式系统原理及应用题目要求+程序代码讲解

嵌入式系统原理及应用题目要求+程序代码讲解

《嵌入式系统原理及应用》作业题目作业1一、调试下面的程序,并回答问题。

.global _start.text_start:LDR SP, =srcLDMFD SP!,{R0-R6}STMFD SP!,{R0-R6}LDMFD SP!,{R3}LDMFD SP!,{R4}LDMFD SP!,{R5}LDMFD SP!,{R6}LDMFD SP!,{R0}LDMFD SP!,{R1}LDMFD SP!,{R2}stop: b stop.ltorgsrc:.long 1,2,3,4,5,6,7.end问:该程序完成了什么功能?答:该程序完成的功能:先把数据区堆栈中的1~7这七个数据送给R0~R0寄存器,然后又把寄存器列表中的R0~R7存入堆栈,然后又依次把堆栈中的1~7这七个数送给R3~R6,R0~R2,然后程序就结束了,在取数和存数的过程中。

堆栈指针sp由0x0000变到0x8030再到0x804c,然后到0x8030,然后依次加4,最后到0x804c;程序计数器R15(PC)由0x8000地址依次加4 。

二、LDMFD,STMFD伪代码实现的原理。

答:指令STMFD和LDMFD分析:根据ATPCS规则,我们一般使用FD(Full Descending)类型的数据栈!所以经常使用的指令就有STMFD和LDMFD,通过ARM对于栈操作和批量Load/Store指令寻址方式,可以知道指令STMFD和LDMFD的地址计算方法:STMFD指令的寻址方式为事后递减方式(DB)而DB寻址方式实际内存地址为:start_address = Rn - (Number_Of_Set_Bits_In(register_list)*4) end_address = Rn - 4STM指令操作的伪代码:if ConditionPassed(cond) thenaddress = start_addressfor i = 0 to 15if register_list[i] == 1Memory[address] = Riaddress = address + 4有上面两个伪代码可以得出 STMFD SP!,{R0-R7,LR} 的伪代码如下: SP = SP -9×4;address = SP;for i = 0 to 7Memory[address] = Ri;address = address + 4;Memory[address] = LR;LDMFD指令的寻址方式为事后递增方式(IA)IA内存的实际地址的伪代码start_address = Rnend_address = Rn + (Number_of_set_bits_in(register_list)*4) - 4 LDM指令操作的伪代码(未考虑PC寄存器):if ConditionPassed(cond) thenaddress = start_addressfor i = 0 to 15if register_list[i] == 1Ri = Memory[address,4]address = address + 4所以LDMFD SP!,{R0-R7,PC}^ (;恢复现场,异常处理返回)伪代码是: address = SP;for i = 0 to 7Ri = Memory[address ,4]address = address + 4;SP = address;作业2一、用移位操作完成(R0)*10运算。

大学20秋《嵌入式系统原理及应用》大作业题目及要求

大学20秋《嵌入式系统原理及应用》大作业题目及要求

大学20秋《嵌入式系统原理及应用》大
作业题目及要求
一、题目
请根据以下两个选题中的一项,完成一份嵌入式系统的设计与实现。

选题范围包括但不限于硬件设计、软件开发、系统集成等。

选题一:智能家居系统设计与实现
选题二:智能交通系统设计与实现
二、要求
1. 设计并实现一个嵌入式系统模型,包括硬件和软件部分。

2. 需要提供详细的设计文档,包括系统结构图、硬件设计图、软件设计图等,以便他人能够理解和复现你的设计。

3. 你需要使用适当的开发平台和工具来完成你的设计和实现,例如Arduino、Raspberry Pi、ARM等。

4. 必须考虑系统的可靠性、稳定性和安全性,以及与现有智能
家居或智能交通系统的兼容性。

5. 你需要自行设定设计和实现的功能与特性,并在文档中详细
描述。

6. 需要在规定的时间内完成设计和实现,并提交设计文档和系
统演示。

7. 设计文档应包括项目概述、需求分析、系统设计、实现步骤、测试方法和结果等内容。

8. 请注意文档的语法、格式和逻辑清晰,以便他人能够准确理
解你的设计思路和实现过程。

以上为《嵌入式系统原理及应用》大作业题目及要求,请按照
要求完成设计与实现,并及时提交设计文档与系统演示。

祝你成功!。

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

《嵌入式系统原理及应用》作业题目作业1一、调试下面的程序,并回答问题。

.global _start.text_start:LDR SP, =srcLDMFD SP!,{R0-R6}STMFD SP!,{R0-R6}LDMFD SP!,{R3}LDMFD SP!,{R4}LDMFD SP!,{R5}LDMFD SP!,{R6}LDMFD SP!,{R0}LDMFD SP!,{R1}LDMFD SP!,{R2}stop: b stop.ltorgsrc:.long 1,2,3,4,5,6,7.end问:该程序完成了什么功能?答:该程序完成的功能:先把数据区堆栈中的1~7这七个数据送给R0~R0寄存器,然后又把寄存器列表中的R0~R7存入堆栈,然后又依次把堆栈中的1~7这七个数送给R3~R6,R0~R2,然后程序就结束了,在取数和存数的过程中。

堆栈指针sp由0x0000变到0x8030再到0x804c,然后到0x8030,然后依次加4,最后到0x804c;程序计数器R15(PC)由0x8000地址依次加4 。

二、LDMFD,STMFD伪代码实现的原理。

答:指令STMFD和LDMFD分析:根据ATPCS规则,我们一般使用FD(Full Descending)类型的数据栈!所以经常使用的指令就有STMFD和LDMFD,通过ARM对于栈操作和批量Load/Store指令寻址方式,可以知道指令STMFD和LDMFD的地址计算方法:STMFD指令的寻址方式为事后递减方式(DB)而DB寻址方式实际存地址为:start_address = Rn - (Number_Of_Set_Bits_In(register_list)*4)end_address = Rn - 4STM指令操作的伪代码:if ConditionPassed(cond) thenaddress = start_addressfor i = 0 to 15if register_list[i] == 1Memory[address] = Riaddress = address + 4有上面两个伪代码可以得出STMFD SP!,{R0-R7,LR} 的伪代码如下:SP =SP -9×4;address =SP;for i = 0 to 7Memory[address] = Ri;address= address + 4;Memory[address] = LR;LDMFD指令的寻址方式为事后递增方式(IA)IA存的实际地址的伪代码start_address = Rnend_address = Rn + (Number_of_set_bits_in(register_list)*4) - 4LDM指令操作的伪代码(未考虑PC寄存器):if ConditionPassed(cond) thenaddress = start_addressfor i = 0 to 15if register_list[i] == 1Ri =Memory[address,4]address = address + 4所以LDMFD SP!,{R0-R7,PC}^ (;恢复现场,异常处理返回)伪代码是: address = SP;for i = 0 to 7Ri = Memory[address ,4]address = address + 4;SP = address;作业2一、用移位操作完成(R0)*10运算。

参考程序:.text.global _start_start:mov R0,#10mov R1,R0,LSL #3mov R2,R0,LSL #1add R3,R1,R2stop:B stop.end二、已知数据缓冲池中有两组数据x和y,每组中有3个数据(例如x: 90,60,30,y: 60,40,20),将x中的数据减去y中的数据,最后将两组数相减得到的结果送回到x中去!参考代码:.text.global _start_start:LDR SP,=xLDMFD SP!,{R0-R2}LDMFD SP!,{R3-R5}sub R2,R2,R5Sub R1,R1,R4Sub R0,R0,R3STMFD SP!,{R0-R2}stop:b stop.ltorgx: .long 80,90,100y: .long 10,20,30.end作业3已知R0和R1的值,要求保留R0的低16位,保留R1的高16位状态,最后将这两个值组成一个新的数送给R3.参考代码:.text.global _start_start:LDR R0,=0x12345678LDR R1,=0x87654321ldr R2,=0xffffLDR R4,=0xffff0000AND R0,R0,R2AND R1,R1,R4ORR R3,R0,R1stop: B stop.end作业4在ARM GNU环境下用ARM汇编语言编程序实现,00,0,0x xy x xx x>⎧⎪===⎨⎪-<⎩参考代码:.text.global _start_start:LDR R0,=xLDR R1,=yLDR R2,[R0]CMP R2,#0BEQ ZEROBGT ZHENGBLT FUZERO:MOV R3,#0STR R3,[R1]B stopZHENG:mov R3,R2STR R3,[R1]B stopFU:mvn R3,R2mov R4,#0x1add R3,R3,R4STR R3,[R1]B stopstop:B stop.ltorgx: .long -10y: .long 0作业5求20的阶乘:64位结果放在【R9:R8】中,R9放高32位,R放低32位思路:每轮乘法操作中,低32位(R8)乘以X(R0)后,结果的低32位放在R8中,高32位放在R9中;高32位R1乘以X(R0)后再加上R9,得到64位结果的高32位,存入R9 参考程序:.global _start.text_start:MOV R8 , #20 低32位初始化为20MOV R9 , #0 高位初始化为0SUB R0,R8,#1 初始化计数器Loop:MOV R1 , R9 暂存高位值UMULL R8 , R9 , R0 , R8 [R9:R8]=R0*R8MLA R9 , R1 , R0 , R9 R9=R1*R0+R9SUBS R0 , R0 , #1 计数器递减BNE Loop 计数器不为0继续循环Stop:B stop.end二、已知a=R0,b=R1.while(a< >b) doif(a>b) thena=a-belsea=b-aend ifend whileresult=a根据以上代码写出对应的汇编代码:参考代码:CMP R0,R1CMPNE R0,R1SubGT R0,R0,R1SubLT R0,R1,R0.end作业61.将下面的ADS环境下的程序代码改写成GUN环境下的程序代码。

(调试时使用F11 step into,注意和F10 step over的区别)AREA Jump, CODE, READONLYnum EQU 4 ; 函数地址表容的个数ENTRYCODE32startLDR R0, =choice ; R0指向存储区的choice单元LDR R0, [R0] ; 设置第一个参数:选择执行哪一个函数MOV R1, #16 ; 设置第1个操作数MOV R2, #2 ; 设置第2个操作数BL arithfunc ; 调用子程序arithfuncstopMOV R0, #0x18 ; 程序结束返回编译器调试环境LDR R1, =0x20026SWI 0x123456arithfuncCMP R0, #num ; 比较R0的值是否超过函数地址表的个数MOVHS PC, LR ; 如果大于,那么就返回到标号stop处ADR R3, JumpTable ; 将函数地址表的地址作为基地址LDR PC, [R3, R0, LSL #2] ; 根据R0参数进入对应的子程序JumpTable ; 函数地址表的入口基地址DCD DoAdd ; 加法子程序DCDDoSub ; 减法子程序DCDDoMul ; 乘法子程序DCDDoDiv ; 除法子程序DoAddADD R0, R1, R2 ; R0 = R1 + R2MOV PC, LR ; 返回DoSubSUB R0, R1, R2 ; R0 = R1 - R2MOV PC, LR ; 返回DoMulMOV R0, R1, LSL R2 ; R0 = R1 << R2MOV PC, LR ; 返回DoDivMOV R0, R1, LSR R2 ; R0 = R1 >> R2MOV PC, LR ; 返回AREA NUM, DATA, READWRITEchoice DCD3 ; 0:表示选择加法子程序1:表示选择减法子程序; 2:表示选择乘法子程序3:表示选择除法子程序END参考程序:.equ num,4 函数地址表容的个数.text.global _start_start:LDR R0,=choice R0指向存储区的choice单元LDR R0,[R0] 设置第一个参数:选择执行哪一个函数MOV R1,#16 设置第1个操作数MOV R2,#2 设置第2个操作数Bl arithfunc 调用子程序arithfuncstop:b stoparithfunc:CMP R0,#num 比较R0的值是否超过函数地址表的个数MOVHS PC, LR 如果大于,那么就返回到标号stop处ADR R3, JumpTable 将函数地址表的地址作为基地址LDR PC, [R3, R0, LSL#2] 根据R0参数进入对应的子程序JumpTable: 函数地址表的入口基地址.long DoAdd 加法子程序.long DoSub 减法子程序.long DoMul 乘法子程序.long DoDiv 除法子程序DoAdd:ADD R0, R1, R2 R0 = R1 + R2MOV PC, LR 返回DoSub:SUB R0, R1, R2 R0 = R1 - R2MOV PC, LR 返回DoMul:MOV R0, R1, LSL R2 R0 = R1 << R2MOV PC, LR 返回DoDiv:MOV R0, R1, LSR R2 R0 = R1 >> R2MOV PC, LR 返回.ltorgchoice: .long 3 0:表示选择加法子程序1:表示选择减法子程序2:表示选择乘法子程序:表示选择除法子程序.end2. 改写以下程序,实现从ARM状态切换到thumb状态,最后再切换到ARM状态!#*******************************************************************************************# NAME: ThumbCode.s *# Author: Embest *# Desc: ThumbCode examples *# History: shw.He 2005.02.22 *#*********************************************************************************************/*-----------------------------------------------------------------------------------------------------------*//* constant define *//*-----------------------------------------------------------------------------------------------------------*/.global _start/*-----------------------------------------------------------------------------------------------------------*//* unable to locate source file. code *//*-----------------------------------------------------------------------------------------------------------*/.text_start:.arm /* Subsequent instructions are ARM */header:adr r0, Tstart + 1 /* Processor starts in ARM state, */bx r0 /* so small ARM code header used *//* to call Thumb main program. */ nop.thumbTstart:mov r0, #10 /* Set up parameters */mov r1, #3bl doadd /* Call subroutine */stop:b stop/*------------------------------------------------------------------------------------------*//* Subroutine code:R0 = R0 + R1 and return *//*------------------------------------------------------------------------------------------*/doadd:add r0, r0, r1 /* Subroutine code */mov pc, lr /* Return from subroutine. */.end /* Mark end of file */参考程序:.global _start.text_start:mov r3,#0.armheader:adr r0,Tstart + 1add r3,r3,#1 //设置循环标志,便于从thumb切换到arm后能停止程序cmp r3,#2Beq stopbx r0stop:b stop.thumbTstart:LDR r2,=headermov r0, #10mov r1, #3bl doaddbx r2doadd:add r0, r0, r1mov pc, lr.end作业7已知1,00,01,0xy xx>⎧⎪==⎨⎪-<⎩,若任意给一个定值,假定为-25,存放在x单元,函数值存放在y单元;要求根据x中的值来确定y的值。

相关文档
最新文档