学校嵌入式期末考试复习 目录 目录分值分布复习题选择题填空题判断题PPTCISC和RISC比较ARM发展历史字节大小端little/big endian(必考)ARM指令处理器工作模式寄存器数量是否越多越好?(必考)当前程序状态寄存器(CPSR)流水线架构指令简介寻址方式立即数寻址寄存器寻址寄存器移位寻址寄存器间接寻址基址寻址相对寻址普通Load/Store指令的寻址批量Load/Store指令的寻址堆栈操作寻址基本指令加法指令与减法指令乘法指令除法指令逻辑操作指令移位操作指令比较操作指令字节交换指令测试指令分支指令AT&T汇编C和汇编混合编程GPIOGPIO特性GPIO应用PWM的占空比串行和并行通信(必考)同步通信和异步通信UARTI2C总线I2C总线术语I2C—-传输控制I2C—-数据格式ADC基本过程ADC主要性能指标传感器传感器定义传感器分类即热饮水机 分值分布 PPT40分 书上作业6-8分 实验20分-前4个10分,后4个10分 寄存器数量是否越多越好?最少15分 复习题 选择题 1.下列哪个表述不正确( )。 A.ARM是一个公司的名称 B.ARM是对一类微处理器的统称 C.ARM是一种技术的名字 D.ARM是一款芯片的名称 2.下面哪点不是嵌入式操作系统的特点( )。 A.内核精简 B.专用性强 C.功能强大 D.高实时性 3.下面哪点不是嵌入式操作系统的特点( )。 A.实时性 B.不可定制 C.微型化 D.可移植性 4.在ARM中,一个字指的是( )位。 A.8 B.16 C.32 D.64 5.以下叙述中,不符合RISC 特征的是( )。 A.指令长度固定,种类少 B.寻址方式丰富,指令功能尽量增强 C. 设置大量通用寄存器,访问存储器指令简单 D.选取使用频率较高的指令 DCBCB 6.以下叙述中,不符合RISC特征的是( )。 A.流水线每周期前进一步 B.更多通用寄存器 C. 指令长度不固定,执行需要多个周期 D.独立的Load和Store指令完成数据在寄存器和外部存储器之间的传输 7.以下叙述中,不符合CISC 特征的是( )。 A.指令长度不固定,执行需要多个周期 B.可以直接访问内存 C.容易实现指令执行流水线 D.指令数量非常多 8.ARM处理器的工作模式有( )种。 A.5 B.6 C.7 D.8 9.在ARM中,双字指的是( )位。 A.16 B.32 C.64 D.128 10.在下列ARM处理器模式中,( )模式有自己独立的R8~R14寄存器。 A.FIQ B.User C.IRQ D.Abort CCCCA 11.按照ARM过程调用标准(ATPCS), 栈指针使用的是( )寄存器。 A.R12 B.R13 C.R14 D.R15 12.按照ARM过程调用标准(ATPCS), LR使用的是( )寄存器。 A. R12 B.R13 C.R14 D.R15 13.下列CPSR寄存器标志位的作用说法错误的是( )。 A.N:负数 B.Z:零 C.C:借位 D.V:进位 14.ARM指令集和Thumb指令集分别是( )的。 A.16位,8位 B.32 位,16位 C.32位,32位 D.16位,16位 15.存储一个32bit数0x到2000H~2003H四个字节单中,若以大端模式存储,则2000H存储单的内容为( )。 A.0x12 B.0x34 C.0x56 D.0x78 BCDBA 17.ADD RO,R1,#5属于( )寻址方式。 A.立即寻址 B.多寄存器寻址 C.寄存器直接寻址 D.相对寻址 18.ADD RO,R1,R2属于( )寻址方式。 A.立即寻址 B.多寄存器寻址 C.寄存器直接寻址 D.相对寻址 20.指令“LDMIA RO!,{R1, R2, R3, R4}”的寻址方式为( )。 A.立即寻址 B.寄存器间接寻址 C.多寄存器寻址 D.堆栈寻址 ACC 21.对寄存器R1的内容乘以8的正确指令是( )。 A.LSR R1,3 B.LSL R1,#3 C. MOV R1,R1,LSL #3 D. MOV R1,R1,LSR #3 22.下面指令执行后,改变R1寄存器内容的指令是( )。 A.TST R1,#2 B.ORR R1,R1,R1 C.CMP R1,#2 D.EOR R1,R1,R1 23.设备连接中,符合IIC协议的设备连接的串行连接线为( )。 A.SCL和RTX B.RTX和RCX C.SCL和SDA D.SDA和RCX 24.在IIC总线中,当SCL信号线为高电平,SDA信号线上的电平由高电平变为低电平,说明( )。 A. 传输出错 B. Start 信号 C. Stop信号 D.传输了1bit的0 25.计算机系统中的四级存储器,其存取速度从高到底的顺序是( )。 A. 主存,Cache,寄存器,辅存 B. Cache,寄存器,主存,辅存 C.寄存器,Cache, 主存,辅存 D.寄存器,主存,Cache,辅存 CDCBC 26.ARM处理器的CPSR的主要作用是( )。 A.检查当前指令执行的正确与否。 B.纠正当前指令执行的结果。 C.产生影响或控制某些后续指令所需的标志。 D.决定CPU是否继续工作 27.指令寻址方式通常是寻找( )的方式。 A.操作码 B.操作数 C.I/O 端口 D.内存单 28.计算机系统中,中断向量通常是指( )。 A.中断服务程序的入口地址 B.终端的优先级 C.终端发生的先后顺序 D.中断的类型编号 29.在堆栈操作寻址方式中,ARM处理器共支持( )种寻址方式。 A.一 B.二 C.三 D.四 30.通常意义上的传感器包含了敏感件和( )两个组成部分。 A.放大电路 B.采集电路 C.转换件 D.滤波件 CBADC 31.若将计算机比喻成人的大脑,那么传感器则可比喻为人的( )。 A.眼睛 B.感觉器官 C.手 D.皮肤 32.在石油化工领域中,需要对输油管道实时检测是否破损或者泄露。可以使用的传感器有( )。 A.温度传感器 B.光敏电阻 C.声音传感器 D. 金属探测仪 33.在监测金库、仓库、古建筑防止挖墙、打洞、爆破灯破坏行为时,应该使用的传感器有( )。 A.声音传感器 B.应变式传感器 C.光敏传感器 D.温度传感器 BCB 填空题 15空考5个 1.嵌入式处理器按照功能可以分为4大类型:分别是MPU、( )、DSP、( )。 2.在ARM的寄存器中,用于保存程序调用返回地址的寄存器是( )。 3.在ARM的寄存器中,用于保存堆栈地址的是( )。 4.在同样的传输频率下,串行通信与并行通信,更快的是( )。 5.在IIC总线中,接收者收到一个完整字节以后,需要发送一个( )信号确认。 1.MCU、SoC 2.R14 3.R13 4.并行 5.ACK 6.在AD转换中,量化过程有( )和( )两种方法。 7.在AD转换中,通常按( )、( )、量化和编码四个步骤进行。 8.导体或半导体在受到外界力的作用时,产生机械变形,机械变形导致其阻值变化,这种因形变而使阻值发生变化的现象称为( )。 9.能够感受规定的被测量并按照一定规律转换成可用输出信号的器件和装置,通常由( )和( )组成。 6.舍入法、截断 7.采样、保持 8.应变效应 9.敏感件、转换件 判断题 7分 × 1.ARM11,指的是ARM的第11个版本。 √ 2.在ARM汇编和c语言混合编程中,C语言可以调用汇编语言编写的函数。 × 3.在ARM汇编和C语言混合编程中,汇编语言不可以调用C语言函数。 √ 4.根据ATPCS标准,应尽可能使函数的参数控制4个以下。 × 5.根据ATPCS标准,C函数的参数不能超过4个。 × 6.Thumb指令集和ARM指令集可以互相调用。 × 7.Thumb-2指令集是Thumb指令集的升级版。 × 8.在IIC 总线中,使用片选信号来确定与哪一个设备发起通信。 √ 9.IIC是同步串行数据总线。 √ 10.在SPI总线中,使用片选信号来确定与哪一个设备发起通信。 × 11.SPI协议属于异步通信。 √ 12.GPIO只能输出高电平或低电平,不能输出一个“0.5”的电平。 × 13.GPIO只能输出高电平或低电平,故只能控制LED灯的亮灭,不能使LED保持在一个“0.5” 亮度的状态。 √ 14.通过配置GPIO的工作状态,可以避免GPIO口由于短路被烧坏。 × 15.将数字信号转换成模拟信号的电路是AD转换器。 实验5.点灯 for (;;) { for (i = 0; i < 50; i++) { delay(20); // 灭->亮,每次+5 (0,250) // 亮->灭,每次-5 (250,0) // 绿灯 (1,259) } } 实验6.按键 press release double 需要用两次按键来判断 // old 上一次按键状态 // new 这次按键状态 // old == new说明两次按键状态不变 old != new if (new == 1) { release; } else { press; } // 0.5s内实现double if(count == 50) { if(release >= 2) { double; } } PPT CISC和RISC比较 考选择题,例:以下不是CISC/RISC的特点是? CISCRISC 指令数量 非常多 <100 执行时间 变化 短 指令长度 变化 1~15B 固定 4B 寻址模式 直接访问内存 不能直接访问内存 流水线 非常难 容易 ARM发展历史 考选择题 ARM是一家公司, 是一种技术(Advanced RISC Machine), 是一系列处理器的统称, 是某一款芯片(×) 是一系列芯片 ARM的不同系列 ARM有8个版本 ARM10中的10指的是它的版本 字节大小端little/big endian(必考) 理解大小端字节序 三种题型 解答题 字节序,简单来说,就是指的超过一个字节的数据类型在内存中存储的顺序. 那么就很明显了,像char这样的类型,肯定不存在字节序的问题了。 大端字节序:高位字节数据存放在低地址处,低位数据存放在高地址处; 小段字节序:高位字节数据存放在高地址处,低位数据存放在低地址处; 什么是高地地址: 在内存中,栈是向下生长的,以char arr[4]为例,(因为char类型数据只有一个字节,不存在字节序的问题)依次输出每个素的地址,可以发现,arr[0]的地址最低,arr[3]的地址最高
什么是高低位: 给一个十进制整数,,很明显左边的是高位,右边的是低位。计算机也是这样认为的。给一个16进制数,0x,以字节为单位,从高位到低位依次是 0x12、0x34、0x56、0x78。 8位为一个字节,16进制的两位其实是2个4位组合起来,合起来就是16进制的两位表示1个字节 将高地地址和高低位对应。 一个整形占4个字节,给一个整形数据0x,如果是大端存储,存储格式如下:
如何判断当前系统是大端还是小端呢? 一个数0x存放在一个4字节空间里
如果我们可以得到 1 在内存中存储的第一个字节,那么我们就可以知道当前系统是大端存储还是小端存储了。 写代码判断是大端存储还是小端存储。(5分) #include <stdio.h> int main() { int a = 1; char pc = *(char*)(&a); if (pc == 1) { printf(“第一个字节为1,小端存储 ”); } else { printf(“第一个字节为0,大端存储 ”); } return 0; } 选择题 例:将写入内存,告诉你,如果大端,那么从某个地址读出来的数据是什么。
ARM指令 ARM中字节是什么?半字是什么?字是什么?双字是什么? Byte:8 bits Halfword: 16 bits (2 byte) Word :32 bits (4 byte) Doubleword:64-bits(8byte)(Cortex-A处理器) 两条指令集分别是多少位? ARM 指令集(32-bit) Thumb 指令集(16-bit ) 处理器工作模式 给出工作模式名字,选择工作模式的概念 有7个基本工作模式: 名称概念 User 非特权模式,大部分任务执行在这种模式 FIQ 当一个高优先级(fast) 中断产生时将会进入这种模式 IRQ 当一个低优先级(normal) 中断产生时将会进入这种模式 Supervisor 当复位或软中断指令执行时将会进入这种模式 Abort 当存取异常时将会进入这种模式 Undef 当执行未定义指令时会进入这种模式 System 使用和User模式相同寄存器集的特权模式 另外Cortex-A特有模式: 名称概念 Monitor 是为了安全而扩展出的用于执行安全监控代码的模式,也是一种特权模式 哪一种模式独有的寄存器最多? FIQ模式 这张图至少考15分
在ARM中,堆栈寄存器要使用的是? R13 CPSR的作用是? 当前程序状态寄存器 R0-R12 通用寄存器 R13 堆栈寄存器 R14 链接寄存器 R15 PC程序计数器 CPSR 当前程序状态寄存器 SPSR 程序状态保存寄存器 每个状态下,最多只可见18个寄存器 寄存器数量是否越多越好?(必考) 不是. 保存现场。现在操作系统都是多线程的,在发生线程切换时,必须保存所有通用寄存器,重新加载新线程上下文中的所有寄存器,这无疑会增加线程资源开销。 数据处理指令机器码格式。要重新设计指令系统。 重新编排新的指令格式的话,那么原有的格式就不能平滑的使用了。当前每个CPU内核同一时间只能处理1-2条运算指令,而汇编的命令又不是很多,所以过多的寄存器也是没有意义的。 当前程序状态寄存器(CPSR)
条件码标志N、Z、C、V分别指什么? N = Negative result from ALU Z = Zero result from ALU C = ALU operation Carried out or borrow V = ALU operation Overflowed 标志位含 义 N 负或小于。当用两个补码表示的带符号数进行运算时,N=1表示运算的结果为负数;N=0表示运算的结果为正数或零 Z 零。 Z=1表示运算的结果为零,Z=0表示运算的结果非零。 C 进位或借位扩展。 可以有4种方法设置C的值: -加法运算(包括CMP):当运算结果产生了进位时(无符号数溢出),C=1,否则C=0。 -减法运算(包括CMP):当运算时产生了借位时(无符号数溢出),C=0,否则C=1。 -对于包含移位操作的非加/减运算指令,C为移出值的最后一位。 -对于其它的非加/减运算指令,C的值通常不会改变。 V 溢出标志。 可以有2种方法设置V的值: -对于加减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出 -对于其它的非加/减运算指令,V的值通常不会改变。 Vector Table中断向量表,存放中断服务程序的入口地址 流水线 选择、填空。 影响流水线的因素? 互锁、跳转 PC寄存器指向正被取指的指令,而非正在执行的指令 架构 Thumb2指令集不是Thumb(16-bit)指令集的升级版 指令简介 选择题写一条代码来选择正确的结果 选择题写一段代码,里面有的指令+s,也有的没有加,判断结果。{S}决定指令执行是否影响CPSR 实验题写程序 ARM指令在汇编程序中用助记符表示,一般ARM指令的助记符格式为: / <opcode>操作码 {<cond>}决定指令执行的条件域 {S}决定指令执行是否影响CPSR <Rd>目的寄存器 <Rn>第一个操作数,必须为寄存器 {<operand2>}第二个操作数 */ <opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>} ARM指令语法格式中,< >中的内容是必须的,而{ }中的内容是可选的。 CPSR:
条件码速查表 不用记,考试会给出,但需要知道是做什么的,不要现场学习,可能来不及 每种条件码可用两个字符表示,这两个字符可以添加在指令助记符的后面和指令同时使用。 例如,跳转指令B可以加上后缀EQ变为BEQ表示“相等则跳转”,即当CPSR中的Z标志置位时发生跳转。 Z置位就是Z=1,Z清零就是Z=0
1.ARM指令条件码前缀的作用: ARM指令可以通过添加适当的条件码前缀来达到条件执行的目的。 这样可以提高代码密度,减少分支跳转指令数目,提高性能; 比如: CMP r3,#0 —比较r3和0 BEQ skip —相等就跳到skip ADD r0,r1,r2 —不相等就执行 r0 = r1 + r2 skip …… 看看加后缀简化后的样子: CMP r3,#0 —比较r3和0 ADDNE r0,r1,r2 —加了NE后缀,不相等就执行r0 = r1 + r2 2.默认情况下,数据处理指令不影响条件码标志位,但可以选择通过添加“S”来影响标志位。 CMP不需要增加“S”就可以改变相应的标志位。 1)、什么是标志位? 即条件码标志位,就是程序执行的条件,每执行完一个指令条件标志位就会改变; 是前面“ARM寄存器详解“里面讲到的CPSR: CPSR程序状态寄存器剖析 1.高4位:NZCV N 置1:结果是负数; Z 置1:结果是0; C 置1:结果完成或借位 V 置1:结果溢出 2)、加S怎样影响标志位? 如:SUBS r3,r3,#0 —r3 = r3 – 0 BEQ skip —如果相等就跳转 注:这个S的意义是:执行SUB后如果不相等的话,CPSR的Z清0(置1),按照这个条 件再继续执行下面的。而CMP是默认可以改变标志位的,就不需要加S。 3.处理器如何知道根据指令来更改对应的条件标志位呢? 这里说的单指数据处理指令,其他指令的话不需要运算就不需要改变CPSR的标志位; 示例1: ADD r0, r1, r2 ; r0 = r1 + r2, 不更新标志位 ADDS r0, r1, r2 ; r0 = r1 + r2, 后缀S表示更新标志位 ADDCSS r0, r1, r2 ; If C 标志为1,则执行r0 = r1 + r2, 且更新标志 CMP r0, r1; CMP指令肯定会更新标志. 寻址方式 给一条指令问是什么寻址方式 立即数寻址 立即寻址指令中的操作码字段后面的地址码部分即是操作数本身,即数据就包含在指令当中,取出指令也就取出了可以立即使用的操作数(这样的数称为立即数)。 立即数可表示为常数表达式。在立即数寻址方式中,规定这个立即数必须是一个8位的常数通过循环右移偶数位得到。ARM只提供了12位来放数据,其中8位是用来记录数值的,另外4位放移位的位数,以此来形成一个立即数。 例如: SUBS R0,R0,#1 ; R0减1,结果放入R0 MOV R0,#0x800 ; 将立即数0x800装入R0寄存器 立即数以“#”开头,16进制数在“#”后加“0x”或 “&”表示。 寄存器寻址 Rm——寄存器方式。在寄存器方式下,操作数即为寄存器的数值。操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来操作。
例如: MOV R1,R2 ; 将R2的值存入R1 SUB R0,R1,R2 ; 将R1的值减去R2的值,结果保存到R0 注意:第1个是目的寄存器,然后是第一操作数寄存器,最后是第二操作数寄存器。 寄存器移位寻址 寄存器移位寻址是ARM指令集特有的寻址方式。当第2个操作数是寄存器移位方式时,第2个寄存器操作数在与第1个操作数结合之前,选择进行移位操作。 例如: MOV R0,R2,LSL #3 ; R2的值左移3位,结果放入R0,即是R0=R2×8 ANDS R1,R1,R2,LSL R3 ; R2的值左移R3位,与R1相与,结果放入R1 寄存器间接寻址 指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在存储器指定地址的存储单中,即寄存器是操作数的地址指针。用于间接寻址的寄存器必须用[ ]括起来。 例如: LDR R1,[R2] ;将以R2的值作为地址的存储器中的数据传送到R1中。
基址寻址 基址寻址方式就是将寄存器的内容与指令中给出的地址偏移量相加,从而得到操作数的有效地址 例如: LDR R2,[R3,#0x0C] ; 读取R3+0x0C 地址上的 存储单的内容,放入R2
带自动变址的前变址寻址。 例如: LDR R0,[R1, #4]! ;R0 ← [R1+4], R1 ← R1+4 “!”符号表明指令在完成数据传送后应该更新基址寄存器。ARM的这种自动变址不消耗额外的时间。 后变址寻址:基址加偏移寻址。基址不带偏移作为传送的地址,传送后自动变址。 例如: LDR R0,[R1],#4 ;R0 ← [R1], R1 ← R1+4 这里没有“!”符号,只使用立即数偏移作为基址寄存器的修改量。这条指令是将寄存器R1的内容作为操作数的有效地址,从该地址取得操作数存入寄存器R0 中,然后将 R1 的内容自增4 。 相对寻址 相对寻址和基址变址寻址方式类似,以程序计数器PC的当前值作为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。 例如以下程序段中的跳转指令采用了相对寻址: BL SUBR1 ;调用到SUBR1子程序,BL是带链接跳转 BEQ LOOP ;条件跳转到LOOP标号处 … LOOP MOV … SUBR … 普通Load/Store指令的寻址 1,寄存器间接寻址: LDR|STR {<cond>} {B} {T} <Rd>, [Rm] 2,基址变址寻址: LDR|STR {<cond>} {B} {T} <Rd>, [Rm, ±<addressing_mode>] 注:B为加载字节数据,T为可选后缀。若指令有T,那么即使处理器在特权模式下,存储系统也将访问看成是在用户模式下进行的。T在用户模式下无效。 批量Load/Store指令的寻址 批量Load/Store指令将一片连续内存单的数据加载到通用寄存器组中或将一组通用寄存器的数据存储到内存单中。 它的寻址模式产生一个内存单的地址范围,指令寄存器和内存单的对应关系满足这样的规则,即编号低的寄存器对应于内存中低地址单,编号高的寄存器对应于内存中的高地址单。 语法格式如下: LDM|STM{<cond>} <addressing_mode><Rn>{!},<register><^> 举例: LDMIA R0, {R1,R2,R3,R4} ;也可以写成 LDMIA R0, {R1-R4} ; R1 ← [R0], R2 ← [R0 + 4] ; R3 ← [R0 + 8], R4 ← [R0 + 12] 从R0中存储的地址依次取数存放到R1,R2,R3,R4
LDMIA 中的 I 是 increase 的缩写,A 是 after 的缩小,LD加载(load)的意思 LDMIA R1!,{R0,R4-R12}; R1后面的感叹号“!”表示会自动调节 R1里面存的指针 所以整句话意思是任务栈R1的存储地址由低到高,将R1存储地址里面的内容手动加载到 CPU 寄存器 R0,R4-R12里 STMIA R0!, {R1-R7} ;将R1~R7的数据保存到R0所指向的存储器中,R0的值之后增加,增长方向为向上增长,类似C语言中的i++ ST是store,存储 STMIB R0!, {R1-R7} ; R0的值先增加,后将R1~R7的数据保存到R0所指向的存储器中,增长方向为向上增长,类似C语言中的++i STMDA R0!, {R1-R7} ;将R1~R7的数据保存到R0所指向的存储器中,R0的值之后增加,增长方向为向下增长,类似C语言中的i– STMDA R0!, {R1-R7} ; R0的值先减少,后将R1~R7的数据保存到R0所指向的存储器中,增长方向为向下增长,类似C语言中的–i 堆栈操作寻址 堆栈是一个按特定顺序进行存取的存储区,操作顺序为“ 后进先出”。堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单 是堆栈的栈顶。根据不同的寻址方式,将堆栈分为以下4种。 (1)满堆栈:堆栈指针指向栈顶素。 (2)空堆栈:堆栈指针指向第一个可用素。 (3)递减栈:堆栈向内存地址减小的方向生长。 (4)递增栈:堆栈向内存地址增加的方向生长。 满堆栈和空堆栈对比
递减栈和递增栈对比
根据堆栈的不同种类,将其寻址方式分为以下4种 (1)满递减FD(Full Descending) (2)空递减ED(Empty Descending) (3)满递增FA(Full Ascending) (4)空递增EA(Empty Ascending) 例如: 满递减堆栈:STMFD SP!,{R1-R7,LR} ;将R1~R7、LR入栈 空递减堆栈:LDMFD SP!,{R1-R7,LR} ;数据出栈放入 R1~ R7、LR 基本指令 加法指令与减法指令 给出一个公式写出ARM汇编 指令格式: // S是刷新程序状态寄存器CPSR的标志 <opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>} <opcode>{<cond>}{S}<Rd>,<Rn>,#立即数 给出程序,问,R0,R1分别是多少 有些指令后面加了s,有些没有,就影响后面的指令,可能执行,可能不执行 加、减法指令举例: ADD R5,R9,R0 ; 加法,R5 ←R9+R0 ADDS R1,R1,#1 ; R1 ←R1+1 SUB R4,R1,R0 ; 减法,R4 ←R1-R0 SUBS R0, R0,#1 ; R0 ←R0-1;a = a – 1; SUBS R2, R1,R2 ; R2 ←R1-R2 RSB R3,R1,#0xFF00 ; R3=0xFF00-R1 RSBS R1,R2,R2,LSL #2 ; R1=(R2<<2) – R2 = R2 * 3 RSBS R5,R2,#0x80 ; 反减法R5=0x80-R2 乘法指令 32 位乘法运算使用乘法指令MUL;32 位乘加运算使用乘法指令MLA;32位乘减运算使用乘减指令MLS。 指令格式: MUL {<cond>}{S}<Rd>,<Rn>,<operand2> MUL/MLS {<cond>}{S}<Rd>,<Rn>,<operand2>,<operand3> 其中,Rd和Rn均为32位带符号数或无符号数 指令示例: MUL R0,R1,R2 ;R0=R1*R2 MLA R0,R1,R2,R3 ; R0=R1*R2+R3 MLS R4,R5,R6,R7 ;R4=R7-(R5*R6) 除法指令 无符号除法运算使用UDIV;带符号除法运算使用SDIV 指令。 指令格式: SDIV/UDIV Rd,Rm,Rs SDIV/UDIV Rd,Rm 其中: Rd—目标寄存器,也可存放被除数; Rm—存放被除数的寄存器; Rs—存放除数的寄存器。 注意:这是2条32位运算指令,结果是一个32位的数据,存储在目标寄存器中。如果不能被整除,余数将丢失。 除法指令应用举例: SDIV R0,R5,R7 ; 带符号除法,R0=R5/R7 UDIV R8,R2,R3 ; 无符号除法,R8=R2/R3 逻辑操作指令 两个操作对象“相与”使用指令AND;两个操作对象“相或”使用指令ORR;两个操作对象 “异或”使用指令EOR;对寄存器按位清0 使用指令BIC;对寄存器进行“非或”使用指令 ORN,即先对第2 操作对象进行“非”操作,然后和第1操作对象进行“或”操作。 指令格式: <opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>} 选择题,下面哪条指令可以使R1的值×8 逻辑操作指令举例: AND R8,R4,#0x80 ; R4 与0x80,结果放在R8中 ANDS R0,R0,#0x01 ; R0=R0 与0x01,取出最低位数据 ORR R6,#0x40 ; R6 或0x40,结果放在R6中 ORR R0,R0,#0x0F ; 将R0 的低4 位置1 EOR R9,R6,R5 ; R6和R5进行异或,结果放在R9中 EOR R1,R1,#0x0F ; 将R1的低4 位取反 EORS R0,R5,#0x01 ; 将R5和0x01 进行逻辑异或 ; 结果保存到R0,并影响标志位 AND R5,R6 ; R5与R6,结果放在R5 中 BIC R1,R1,#0x1 ; 将R1的第1位清零,其他位不变 BIC R1,R2,R3 ; 将R3的反码和R2 相逻辑“与”,结果保存到R1中 ORN R6,R7,R14 ; 把R14先求非,然后或R7,结果放在R6中 移位操作指令 考2-4分 LSL:逻辑左移(Logical Shift Left),寄存器中字的低端空出的有效位补0。 LSR:逻辑右移(Logical Shift Right),寄存器中字的高端空出的有效位补0。 ASR:算术右移(Arithmetic Shift Right)算术移位的对象是带符号数,在移位过程中必须保持 操作数的符号位不变。若源操作数为正,则字的高端空出的有效位补0;若源操作数为负数,则 字的高端空出的有效位补1。 ROR:循环右移(Rotate Right),从字的最低端移出的有效位依次填入空出字的高端有效位。 RRX:带扩展位的循环右移(Rotate Right Extended),按操作数所指定的数量向右循环移位, 空位用原来C 标志位填充。 比较操作指令 不会改变寄存器的值,只会影响标志位。 两个操作对象的比较操作使用指令CMP,两个操作对象的取反比较操作使用指令CMN。 CMP/CMN{条件} 操作数1,操作数2 CMP 指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行比较,同时更新 CPSR(Current Program Status Register,程序状态寄存器)中条件标志位的值。 CMN 指令用于把一个寄存器的内容和另一个寄存器的内容或立即数取反后进行比较,同时更新CPSR 中条件标志位的值。 例如: CMP R1,R0 ; 将寄存器R1 的值与寄存器R0 的值相减,并根据结果设置CPSR 的标志位 CMP R1,#100 ; 将寄存器R1 的值与立即数100 相减,并根据结果设置CPSR 的标志位 字节交换指令 考6分 这些指令用来在一个32 位的字内实现字节交换,交换的结果使源字的大端或小端的格式发 生变化。一个32位的字在大端和小端之间转换使用指令REV;一个16位的半字在大端和小端 之间转换使用指令REV16;把16位的带符号半字转换成相反格式的32位带符号字使用指令 REVSH;位翻转使用指令RBIT。 指令格式: REV/REV16/REVSH/RBIT 目标寄存器,源寄存器 用于大小端转换 REV Rd, Rn ; Rd = rev(Rn) 在字中反转字节序
REV16 Rd, Rn ; Rd = rev16(Rn) 在半字中反转字节序
指令举例,其中R5 中数据是0x0A0B0504。 REV.W R3,R5 ; 对R5 实现32 位转换,结果是R3=0x04050B0A REV16.N R7,R5 ; 对R5 实现16 位转换,结果是R7=0x0B0A0405 REVSHS R0,R5 ; 把R5 低16 位带符号交换扩展,结果R0=0x00000405 ;刷新标志 RBIT R4,R5 ; 翻转R5,结果写入寄存器R4,R4=0x20A0D050 测试指令 不考写代码,只需要知道干了什么 TST 指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的“与”运算,不保存运算结果但会根据运算结果更新CPSR 中条件标志位的值。操作数1 是要测试的数据,操作数2 是一个位掩码。该指令一般用来检测是否设置了特定的位。 TEQ 指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的“异或”运算,不保存运算结果但会根据运算结果更新CPSR中条件标志位值。该指令通常用于比较操作数1和操作数2是否相等。 指令格式: TST/TEQ{条件}操作数1,操作数2 分支指令 没有分支指令的代码效率更高 在ARM中有两种方式可以实现程序的跳转,一种是使用分支指令直接跳转,另一种则是直接向PC寄存器赋值实现跳转。 分支指令有以下三种: 分支指令B; Branch : B{<cond>} label 带链接的分支指令BL; Branch with Link : BL{<cond>} subroutine_label 带状态切换的分支指令BX。 Branch with Reg : BLX{<cond>} Register 分支指令——B指令,该指令跳转范围限制在当前指令的±32M字节地址内(ARM指令为字对齐,最低2位地址固定为0)。指令格式如下: 例如: B WAITA ; 跳转到WAITA标号处 AT&T汇编 前四个实验考10分 .global _ start伪操作用于申明全局标号_start,即程序的入口地址。相当于C语言的main(); svc 0指令的作用是执行Linux服务调用命令终止程序,返回linux终端。
C和汇编混合编程 汇编可以访问C语言全局变量、可以调用C语言函数。 C语言可以调用汇编函数 如果C语言函数有6个参数,怎么传参数? 分开传参。前四个用寄存器R0,R1,R2,R3,剩下两个放在递减栈中。 编译链接 汇编 as 如果可执行程序的入口是汇编,使用LD,如果是C语言的类函数使用gcc C语言 gcc GPIO GPIO特性 GPIO口在复位后为了安全起见,一般会设置为输入模式。如果将PA0口配置为输出,且输入为高电平“1”,那么就容易造成短路,将PA0烧坏。 点LED灯是输出模式,给LED提供的是脉冲宽度调制(PWM)。 读按键是输入模式。 GPIO应用 后四个实验考一个 按键消抖 delay() 定时器中断 PWM的占空比 占空比:就是输出的PWM中,高电平保持的时间与该PWM的时钟周期的时间之比。
串行和并行通信(必考) 书上作业6-8分。串行通信与并行通信的概念?同步通信与异步通信的概念及区别? 串行通信与并行通信的概念? 串行通信是指计算机与I/O设备之间数据传输是按顺序依次一位接一位进行传送。通常数据在一根数据线或一对差分线上传输。 并行通信是指计算机与I/O设备之间通过多条传输线交换数据,数据的各位同时进行传送。 同步通信与异步通信的概念及区别? 同步通信是指数据传送是以数据块(一组字符)为单位,字符与字符之间、字符内部的位与位之间都同步。 以数据块为单位传送信息。 在一个数据块内,字符与字符间无间隔。 因为一次传输的数据块中包含的数据较多,所以接收时钟和发送时钟严格同步,通常要有同步时钟。 异步通信是指数据传送是以字符为单位,字符与字符之间的传送完全是异步的,位与位之间的传送基本上是同步的。 以字符为单位传送信息。 相邻两字符间的间隔是任意长。 因为一个字符中的波特位长度有限,所以需要的接收时钟和发送时钟只要相近就可以。 字符间异步,字符内部各位同步。 在一个总线上如果挂了多个设备,CPU如何决定是与哪个设备通信? 编址 片选 同步通信和异步通信 UART I2C总线是同步,有时钟。 IIC(Inter-Integrated Circuit)总线。又写作I2C、I2C。 SPI总线也是同步。 只有2根信号线,如何判别是与哪一个IIC设备通信? 7-bit或者10-bit作为地址 I2C总线 I2C总线术语 Transmitter—–发送者。 Receiver—–接收者。 Master—–主设备。产生时钟,发起通信,发送命令,结束通信的设备。 Slave—–从设备。监听总线,并被主设备编址的设备。 Multi-Master—–多主设备。允许在一个总线上挂接多个主设备。 Arbitration—–仲裁。 Bus Signals—–总线信号。也就是SDA和SCL。当总线是空闲的时候,两根信号线都是高电平。 I2C—-传输控制 I2C总线,当SCL信号线为高电平的时候,SDA信号线的电平发生变化: Start——开始传输,当SDA由高变低的时候。 Stop——停止传输,当SDA由低变高的时候。
I2C—-数据格式 每个字节在SDA信号线上都是8-bit长。相对于发送的7bit,多出的1bit用来确定方向(是读还是写)。 每个字节传输完成后都由接收者发送一个确认位(ACK)。
SPI总线是同步的,有一个SCLK用来同步。 ADC基本过程 A/D转换器(ADC) 模数转换电路是将输入连续变化的模拟信号转换为与其成正比的数字信号量输出。在进行AD转换的时候,通常需按采样、保持、量化、编码四个步骤进行。 保持。模拟信号经采样后,得到一系列样值脉冲。采样脉冲宽度一般是很短暂的,在下一个采样脉冲到来之前,应暂时保持所得的样值脉冲幅度,以便进行转换。因此,在采样电路之后须加保持电路。 量化。输入的模拟电压经过采样保持后,得到的是阶梯波。而该阶梯波仍是一个可以连续取值的模拟量,但n位数字量只能表示2^n个数值。因此,用数字量来表示连续变化的模拟量时就有一个类似于四舍五入的问题。 编码。将量化后的离散量用相应的二进制码表示的过程。 ADC主要性能指标 分辨率是表示数字量变化一个相邻的数码(例如从1到2)所需要输入模拟电压的变化量。 例如一个8位ADC模块的分辨率为满刻度电压的1/256。如果满刻度电压位5V,那么该ADC可分辨5/256即约20mv的电压变化。 传感器 石化企业输油管道、储油罐等压力容器的破损和泄露检测。使用压力、声音传感器。 汽车怎么检测碰撞?使用加速度传感器。 传感器定义 传感器由敏感件和转换件组成。 传感器分类 应变式传感器 应变效应。导体或半导体在受到外界力的作用时,产生机械变形,机械变形导致其阻值变化,这种因形变而使阻值发生变化的现象称为应变效应。 应变式数显扭矩扳手、振动式地音入侵探测器 压阻式传感器 压阻效应。单晶硅材料在受到应力作用后,其电阻率发生明显变化,这 种现象被称为压阻效应。 电涡流式传感器 金属探测、电磁炉、探伤 热电式传感器 即热饮水机 5分 设计要求: 可以放出20℃、45℃、75℃和100℃四种温度的水。 可以选择一次放出200ml或350ml的水。 缺水提醒。 实时显示温度。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/26798.html