1、 ARM 嵌入式系统结构与编程习题答案 第一章 绪论 1. 国内嵌入式系统行业对“嵌入式系统”的定义是什么?如何理解? 答:国内嵌入式行业一个普遍认同的定义是:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能,可靠性,成本,体积,功耗严格要求的专业计算机系统。 从这个定义 可以看出嵌入式系统是与应用紧密结合的,它具有很强的专用性,必须结合实际系统需求进行合理的剪裁利用。因此有人把嵌入式系统比作是一个针对特定的应用而“量身定做”的专业计算机系统。 2嵌入式系统是从何时产生的,简述其发展历程。 答:从 20 世纪 70 年代单片机的出现到目前各式各样的嵌入式微处理器,微控制器的大
2、规模应用,嵌入式系统已经有了 30 多年的发展历史。 嵌入式系统的出现最初是基于单片机的。 Intel 公司 1971 年开发出第一片具有 4 位总线结构的微处理器 4004,可以说是嵌入式系统的萌芽阶段。 80 年代初的 8051 是单片机历史上值得纪念的一页。 20 世纪 80 年代早期,出现了商业级的“实时操作系统内核”,在实时内核下编写应用软件可以使新产品的沿着更快,更节省资金。 20 世纪 90 年代实时内核发展为实时多任务操作系统。步入 21 世纪以来,嵌入式系统得到了极大 的发展。在硬件上, MCU 的性能得到了极大的提升,特别是 ARM 技术的出现与完善,为嵌入式操作系统提供了
3、功能强大的硬件载体,将嵌入式系统推向了一个崭新的阶段。 3 当前最常用的源码开放的嵌入式操作系统有哪些,请举出两例,并分析其特点。 答:主要有嵌入式 Linux 和嵌入式实时操作内核 uC/OS-II 嵌入式 Linux 操作系统是针对嵌入式微控制器的特点而量身定做的一种 Linux 操作系统,包括常用的嵌入式通信协议和常用驱动,支持多种文件系统。主要有以下特点:源码开放,易于移植,内核小,功能强大,运行稳定,效率高等。 uC/OS 是源码工卡的实时嵌入式系统 内核,主要有以下特点:源码公开,可移植性强,可固化,可剪裁,占先式,多任务,可确定性,提供系统服务等。 4举例说明嵌入式设备在工控设备
4、中的应用。 答:由于工业控制系统特别强调可靠性和实时性,“量身定做”的嵌入式控制系统恰能满足工业控制的需求。例如:工业过程控制,数字控制机床,电网设备监测,电力自动控制系统,石油化工监控等。 5嵌入式技术的发展趋势有哪些? 答:未来嵌入式系统的发展趋势有: 1.随着信息化与数字化的发展,嵌入式设备进行网络互联是未来发展的趋势。 2.优 化嵌入式系统软硬件内核,提高系统运行速度,降低功耗和硬件成本。 3.指令集的并行计算技术将引入嵌入式微处理器。 4.嵌入式微处理器将会向多核技术发展。 5.嵌入式技术将引领信息时代。 第 2 章 ARM 技术与 ARM 体系结构 1.简述 ARM 处理器内核调试
5、结构原理 答: ARM 处理器一般都带有嵌入式追踪宏单元 ETM( Embedded Trace Macro),它是 ARM公司自己推出的调试工具。 ARM 处理器都支持基于 JTAG( Joint Test Action Group 联合测试行动小组)的调试方法。它利用芯片内部的 Embedded ICE 来控制 ARM 内核操作,可完成单步调试和断点调试等操作。当 CPU 处理单步执行完毕或到达断点处时,就可以在宿主机端查看处理器现场数据,但是它不能在 CPU 运行过程中对实时数据进行仿真。 ETM 解决了上述问题,能够在 CPU 运行过程中实时扫描处理器的现场信息,并数据送往TAP( T
6、est Access Port)控制器。上图中分为三条扫描链(图中的粗实线),分别用来监视ARM 核, ETM,嵌入式 ICE 的状态。 2. 分析 ARM7TDMI-S 各字母所 代表的含义。 答: ARM7 T D M I S 中 ARM 是 Advanced RISC Machines 的缩写 7 是系列号 ; T: 支持高密度 16 位的 Thumb 指令集 ; D: 支持 JTAG 片上调试; M: 支持 用于长乘法操作( 64 位结果) ARM 指令,包含快速乘法器; I:带有嵌入式追踪宏单元 ETM,用来设置断点和观察点的调试硬件; S:可综合版本,意味着处理器内核是以源代码形式
7、提供的。这种源代码形式又可以编译成一种易于 EDA 工具使用的形式。 3. ARM 处理器的工作模式有哪几种,其中哪些为特权模式,哪些为异常 模式,并指出处理器在什么情况下进入相应的模式。 答: ARM 技术的设计者将 ARM 处理器在应用中可能产生的状态进行了分类,并针对同一类型的异常状态设定了一个固定的入口点,当异常产生时,程序会自动跳转到对应异常入口处进行异常服务。 1用户模式:非特权模式,也就是正常程序执行的模式,大部分任务在这种模式下执行。在用户模式下,如果没异常发生,不允许应用程序自行改变处理器的工作模式,如果有异常发生,处理器会自动切换工作模式 2 FIQ 模式:也称为快速中断模
8、式,支持高速数据传输和通道处理,当一个高优先级 (fast)中 断产生时将会进入这种模式。 3 IRQ 模式:也称为普通中断模式, :当一个低优先级 (normal)中断产生时将会进入这种模式。在这模式下按中断的处理器方式又分为向量中断和非向量中断两种。通常的中断处理都在 IRQ 模式下进行。 4 SVC 模式:称之为管理模式,它是一种操作系统保护模式。当复位或软中断指令执行时处理器将进入这种模式。 5中止模式:当存取异常时将会进入这种模式,用来处理存储器故障、实现虚拟存储或存储保护。 6未定义指令异常模式:当执行未定义指令时会进入这种模式,主要是用来处理未定义的指令陷阱,支持 硬件协处理器的
9、软件仿真,因为未定义指令多发生在对协处理器的操作上。 7系统模式:使用和 User 模式相同寄存器组的特权模式,用来运行特权级的操作系统任务。 在这 7 种工作模式中,除了用户模式以外,其他 6 种处理器模式可以称为特权模式,在这些模式下,程序可以访问所有的系统资源,也可以任意地进行处理器模式的切换。 在这 6 种特权模式中,除了系统模式外的其他 5 种特权模式又称为异常模式,每种异常都对应有自己的异常处理入口点。 4. 分析程序状态寄存器( PSR)各位的功能描述,并说明 C,Z,N,V 在什么情况下进行置位和清零 。 答: 条件位: N = 1-结果为负 , 0-结果为正或 0 Z = 1
10、-结果为 0, 0-结果不为 0 C =1-进位, 0-借位 V =1-结果溢出, 0 结果没溢出 Q 位: 仅 ARM 5TE/J 架构支持 指示增强型 DSP 指令是否溢出 中断禁止位: I = 1: 禁止 IRQ. F = 1: 禁止 FIQ. T Bit 仅 ARM xT 架构支持 T = 0: 处理器处于 ARM 状态 T = 1: 处理器处于 Thumb 状态 Mode 位 (处理器模式位 ): 0b10000 User 0b10001 FIQ 0b10010 IRQ 0b10011 Supervisor 0b10111 Abort 0b11011 Undefined 0b1111
11、1 System 5. 简述 ARM 处理器异常处理和程序返回的过程。 答: 只要正常的程序流被暂时中止,处理器就进入异常模式。例如响应一个来自外设的中断。在处理异常之前, ARM7TDMI 内核保存当前的处理器状态,这样当处理程序结束时可以恢复执行原来的程序。如果同时发生两个或更多异常,那么将按照固定的顺序来处理异常 。 异常或入口 返回指令 向量表偏移 处理器模式 优先级 BL MOV PC,R14 SWI MOVS PC,R14_svc SVC 6 0x00000008 未定义的指令 MOVS PC,R14_und UND 6 0x00000004 预取指中止 SUBS PC,R14_a
12、bt,#4 ABT 5 0x0000000C 快中断 SUBS PC,R14_fiq,#4 FIQ 3 0x0000001C 中断 SUBS PC,R14_irq,#4 IRQ 4 0x00000018 数据中止 SUBS PC,R14_abt,#8 ABT 2 0x00000010 复位 无 SVC 1 0x00000000 在异常发生后, ARM7TDMI 内核会作以下工作: 1.在适当的 LR 中保存下一条指令的地址 2.将 CPSR 复制到适当的 SPSR 中; 3. 将 CPSR 模式位强制设置为与异常类型相对应的值; 4.强制 PC 从相关的异常向量处取指。 ARM7TDMI 内核
13、在中断异常时置位中断禁止标志,这样可以防止不受控制的异常嵌套。 注:异常总是在 ARM 状态中进行处理。当处理器处于 Thumb 状态时发生了异常,在 异常向量地址装入 PC 时,会自动切换到 ARM 状态。 当异常结束时,异常处理程序必须: 1.将 LR 中的值减去偏移量后存入 PC,偏移量根据异常的类型而有所不同; 2.将 SPSR 的值复制回 CPSR; 3.清零在入口置位的中断禁止标志。 注:恢复 CPSR 的动作会将 T、 F 和 I 位自动恢复为异常发生前的值。 6. ARM 处理器字数据的存储格式有哪两种?并指出这两种格式的区别。 答: ARM7TDMI 处理器可以将存储器中的字
14、以下列格式存储 大端格式( Big-endian) 小端格式( Little-endian) 小端存储器系统: 在小端格式中,高位数字存放在高位字节中。因此存储器系统字节 0 连接到数据线7 0。 大端存储器系统: 在大端格式中,高位数字存放在低位字节中。因此存储器系统字节 0 连接到数据线31 24。 7. 分析带有存储器访问指令( LDR)的流水线运行情况,并用图示说明流水线的运行机制。 答: 存储器访问指令 LDR 流水线举例 取指的存储器访问和执行的数据路径占用都是不可同时共享的资源,对于多周期指令来说,如果指令复杂以至于不能在单个时钟周期内完成执行阶段,就会产生流水线阻塞。 对存储器
15、 的访问指令 LDR 是非单周期指令 LDR 指令 的 执行,访问存储器,回写寄存器(占 用了 3 个 周期) 。造成了 MOV 指令的执行被阻断。 8. 简述 ARM9 的 5 级流水线每一级所完成的功能和实现的操作。 答: ARM920 在指令操作上采用 5 级流水线 . 取指:从指令 Cache 中读取指令。 译码:对指令进行译码,识别出是对哪个寄存器进行操作并从通用寄存器中读取操作数。 执行:进行 ALU 运算和移位操作,如果是对存储器操作的指令,则在 ALU 中计算出要访问的存储器地址。 存储器访问:如果是对存储器访问的指令,用来实现数据缓冲功能(通过数 据 Cache)。 寄存器回
16、写:将指令运算或操作结果写回到目标寄存器中。 9. 什么叫流水线互锁?应如何来解决,举例说明。 答: 互锁:当前指令的执行需要前面指令的执行结果,但前面的指令没有执行完毕,引起流水线的等待 。 互锁发生时,硬件会停止指令的执行,直到数据准备好。 上边程序中 ORR 指令执行时需要使用 LDR 指令加载后的 R4 寄存器,因此造成了 ORR 指令的等待。 编译器以及汇编程序员可以通过重新设计代码的顺序或者其他办法来减少互锁的数量。 第 3 章 ARM 指令集寻址方式 1.在指令编码中,条件码占几位,最多有多少 个条件,各个条件是如何形成的? 答: 条件码占 4 位,最多有 15 个条件 操作码
17、条件助记符 标志 含义 0000 EQ Z=1 相等 0001 NE Z=0 不相等 0010 CS/HS C=1 无符号数大于或等于 0011 CC/LO C=0 无符号数小于 0100 MI N=1 负数 0101 PL N=0 正数或零 0110 VS V=1 溢出 0111 VC V=0 没有溢出 1000 HI C=1,Z=0 无符号数大于 1001 LS C=0,Z=1 无符号数小于或等于 1010 GE N=V 有符号数大于或等于 1011 LT N!=V 有符号数小于 1100 GT Z=0,N=V 有符号数大于 1101 LE Z=1,N!=V 有符号数小于或等于 1110
18、AL 任何 无条件执行 (指令默认条件 ) 1111 NV 任何 从不执行 (不要使用 ) 2. 指令条件码中, V 标志位在什么情况下才能等于 1? 答: V溢出标志位 对于加减法运算指令,当操作数和运算结果为二进制补码表示的带符号数时, V=1 表示符号位溢出,其他指令通常不影响 V 位。 3. 在 ARM 指令中, 什么是合法的立即数?判断下面各立即数是否合法,如果合法则写出在指令中的编码格式(也就是 8 位常数和 4 位移位数) 0x5430 0x108 0x304 0x501 0xfb10000 0x334000 0x3FC000 0x1FE0000 0x5580000 0x7F80
19、0 0x39C000 0x1FE80000 答: 立即数必须 由 1 个 8 位的常数通过进行 32 位循环右移偶数位得到,其中循环右移的位数由一个 4 位二进制的两倍表示。 即一个 8 位的常数通过循环右移 2*rotate_4 位(即 0,2,4,。30)得到 0X5430 0000,0000,0000,0000,0101,0100,0011,0000 非法立即数 0X108 0000,0000,0000,0000,0000,0001,0000,1000 0x42 循环右移 30 位 ( rotate_4=0xF) 0X304 0000,0000,0000,0000,0000,0011,0
20、000,0100 0xC1 循环右移 30 位 ( rotate_4=0xF) 0x501 0000,0000,0000,0000,0000,0101,0000,0001 非法立即数 0xfb10000 0000,1111,1011,0001,0000,0000,0000,0000 非法立即数 0x334000 0000,0000,0011,0011,0100,0000,0000,0000 0Xcd 循环右移 18 位( rotate_4=0x9) 0x3FC000 0000,0000,0011,1111,1100,0000,0000,0000 0XFF 循环右移 18 位( rotate_4
21、=0x9) 0x1FE0000 0000,0001,1111,1110,0000,0000,0000,0000 非法立即数 0x5580000 0000,0101,0101,1000,0000,0000,0000,0000 非法立即数 0x7F800 0000,0000,0000,0111,1111,1000,0000,0000 非法立即数 0x39C000 0000,0000,0011,1001,1100,0000,0000,0000 0XE7 循环右移 18 位( rotate_4=0x9) 0x1FE80000 0001,1111,1110,1000,0000,0000,0000,000
22、0 非法立即数 4.分析逻辑右移,算术右移,循环右移,带扩展的循环右移它们间的差别。 答: LSL 逻辑左移 : LSR 逻辑右移 : ASR 算术右移 : 3 1 003 1 00ROR 循环右移 : RRX 带扩展的循环右移: 5.ARM 数据处理指令具体的寻址方式 有哪些,如果程序计数器 PC 作为目标寄存器,会产生什么结果? 答: 数据处理指令寻址方式具体可分为 5 种类型: 1)第二操作数为立即数 2)第二操作数为寄存器 3)第二操作数为寄存器移位方式且移位的位数为一个 5 位立即数 4)第二操作数为寄存器移位方式且移位数值放在寄存器中 5)第二操作数位寄存器进行 RRX 移位得到。
23、如果 PC ( R15)用作目标寄存器,指令会产生不可预知的结果。 6.在 Load/Store 指令寻址中,字,无符号字节的 Load/Store 指令寻址和半字,有符号字节寻址,试分析它们之间的差别。 答: 在 Load/Store 指令寻址中, 字,无符号字节的 Load/Store 指令寻址中共有以下 3 种内存地址构成格式: 1) Addressing_mode 中的偏移量为立即数 2) Addressing_mode 中的偏移量为寄存器的值 3) Addressing_mode 中的偏移量通过寄存器移位得到 半字,有符号字节的 Load/Store 指令寻址中共有以下 2 种内存地
24、址构成格式: 1) Addressing_mode 中的偏移量为立即数 2) Addressing_mode 中的偏移量为寄存器的值 7.块拷贝 Load/Store 指令在实现寄存器组合连续的内存单元中数据传递时,地址的变化方式有哪几种类型,并分析它们的地址变化情况。 答: 批量 Load/Store 指令在实现寄存器组合连续的内存单元中数据传递时,地址的变化方式有以下 4 种类型: 后增 IA (Increment After) :每次数据传送后地址加 4; 先增 IB (Increment Before) :每次数据传送前地址加 4 ; 后减 DA (Decrement After) :
25、每次数据传送后地址减 4 ; 先减 DB (Decrement Before) : 每次数据传送前地址减 4 ; 8.栈操作指令 地址的变化方式有哪几种类型,并分析它们的地址变化情况,从而得出栈操作指令寻址和块拷贝 Load/Store 指令之间的对应关系。 答: 根据堆栈指针的指向位置不同和堆栈的生长方向不同,共有 4 种类型的堆栈工作方式: 满递增堆栈 FA:堆栈指针指向最后压入的数据,且由低地址向高地址生成。 满递减堆栈 FD:堆栈指针指向最后压入的数据,且由高地址向低地址生成。 空递增堆栈 EA:堆栈指针指向下一个要放入数据的空位置,且由低地址向高地址生成。 3 10C3 103 10
26、空递减堆栈 ED:堆栈指针指向下一个要放 入数据的空位置,且由高地址向低地址生成。 9.分析协处理器加载 /存储指令的寻址方式种的内存地址索引格式中不同的汇编语法格式下内存地址的计算方法。 答: 协处理器加载 /存储指令的寻址方式种的内存地址索引格式中,索引格式类似于 LDR/STR指令寻址中的立即数作为地址偏移量的形式。 Addressing_mode 中的偏移量为 8 位立即数的汇编语法格式有以下 3 种: 前变址不回写形式: , #+/-*4 第一个内存地址编号为基地址寄存器 Rn 值加上 /减去 imm_offset8 的 4 倍, 后续的每一个地址是前一个内存地址加 4,直到协处理器
27、发出信号,结束本次数据传输为止。 前变址回写形式: , #+/-*4! 第一个内存地址编号为基地址寄存器 Rn 值加上 /减去 imm_offset8 的 4 倍,后续的每一个地址是前一个内存地址加 4,直到协处理器发出信号,结束本次数据传输为止。当指令执行时,生成的地址值将写入基址寄存器。 后变址回写形式: , #+/-*4 内存地址为基址寄存器 Rn 的值,当存储器操作完成后,将基地址寄存器 Rn 值加 上 /减去 imm_offset8 的 4 倍,后续的每一个地址是前一个内存地址加 4,直到协处理器发出信号,结束本次数据传输为止。最后将 Rn 值加上 /减去 imm_offset8 的
28、 4 倍写回到基址寄存器 Rn(更新基地址寄存器)。 10. 写出下列指令的机器码,并分析指令操作功能。 MOV R0, R1 MOV R1, ,0X198 ADDEQS R1, R2, ,0xAB CMP R2,#0Xab LDR R0,R1,#4 STR R0,R1,R1,LSL #2! LDRH R0,R1,#4 LDRSB R0,R2,#-2! STRB R1,R2,#0Xa0 LDMIA R0,R1,R2,R8 STMDB R0!,R1-R5,R10,R11 STMED SP!R0-R3,LR 答: 机器码部分略。 MOV R0, R1 ; R0 -R1 MOV R1, ,0X198
29、 ; R0 -0X198 ADDEQS R1, R2, ,0xAB ;当 Z=1 时, R1 -R2+0xAB 并影响标志位 CMP R2,#0Xab ; R2-0xAB,并 影响标志位 LDR R0,R1,#4 ; R0 -【 R1+4】 STR R0,R1,R1,LSL #2! ;【 R1+R1*4】 -R0, R1=R1+R1*4 LDRH R0,R1,#4 ; R0 -【 R1+4】半字, R0 的高 16 位清零 LDRSB R0,R2,#-2! ; R0 -【 R2-2】字节, R0 有符号扩展为 32 位, R2=R2-2 STRB R1,R2,#0Xa0 ;【 R2+0Xa0】
30、 -R1 低 8 位, LDMIA R0,R1,R2,R8 ; 将内存单元【 R0】 【 R+11】以字为单位读取到 R1, R2, R8 中 STMDB R0!,R1-R5,R10,R11 将寄存器 R1R5, R10, R11 的值以字为单位依次写入【 R0】中,每写一个字之前 R0=R0-4 STMED SP!R0-R3,LR 将寄存器 R0R3, LR 的的值以字为单位依次写入【 SP】中,每写一个字之后 SP=SP-4 第 4 章 ARM 指令集系统 1.ARM 指令可分为哪几类?说出哪几条指令是无条件执行的。 答: ARM 微处理 器的指令集可以分为:数据处理指令,分支指令,加载
31、/存储指令,批量加载 /存储指令,交换指令,程序状态寄存器( PSR)处理指令,协处理器操作指令和异常产生指令八大类。 几乎所有的 ARM 指令都是可以有条件执行的。带链接和状态切换的跳转指令 BLX,当目标地 址由程序标号给出时,即: BLX 由于指令码中是没有条件编码位的,所以指令是无条件执行的。 2.如何实现两个 64 位数的加法操作,如何实现两个 64 位数的减法操作,如何求一个 64 位数的负数? 答: 1) 使用 ADC 实现 64 位加法,结果存于 R1、 R0 中 : ADDS R0,R0,R2 ;R0 等于低 32 位相加,并影响标志位 ADC R1,R1,R3 ;R1 等于高 32 位相加,并加上低位进位 2) 使用 SBC 实现 64 位减法,结果存于 R1、 R0 中 : SUBS R0,R0,R2 ; 低 32 位相减,并影响标志位 SBC R1,R1,R3 ;高 32 位相减,并减去低位借位 3) 使用 RSC 指令实现求 64 位数值的负数 : RSBS R2,R0,#0 RSC R3,R1,#0 3.写出 LDRB指令与 LDRSB指令的二进制编码格式,并指出它们之间的区别。 答: LDRB指令的二进制编码格式: