《《ARM嵌入式系统结构与编程》习题答案(共8页).doc》由会员分享,可在线阅读,更多相关《《ARM嵌入式系统结构与编程》习题答案(共8页).doc(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上1章 绪论 1.国内嵌入式系统行业对“嵌入式系统”的定义是什么?如何理解? 答:见教材1.1节。 2.嵌入式系统是从何时产生的,简述其发展历程。 答:见教材1.1节。 3.当前最常见的源码开放的嵌入式操作系统有哪些,请举出两例,并分析其特点。 答:见教材1.2.1节的嵌入式Linux和嵌入式实时操作内核UC /OS-I。 4.举例说明嵌入式设备在工控设备中的应用。 答:见教材1.3节的“工业控制领域”。 5.未来嵌入式技术的发展趋势有哪些? 答:见教材1.4节的嵌入式技术的发展趋势。 2章 ARM技术与ARM体系结构 1简述ARM处理器内核调试结构原理。 答:对教材1
2、.2节的图2-1进行描述。 2.分析ARM7TDMI-S各字母所代表的含义。 答:参考教材2.12 ARM核版本命名规则说明。3ARM处理器的工作模式有哪几种,其中哪些为特权模式,哪些为异常模式,并指出处理器在什么情况下进入相应的模式。 ARM处理器共有7种工作模式: 用户模式:非特权模式,也就是正常程序执行的模式,大部分任务在这种模式 下执行。在用户模式下,如果没异常发生,不允许应用程序自行改变处理器的工作模式,如果有异常发生,处理器会自动切换工作模式 FIQ模式:也称为快速中断模式,支持高速数据传输和通道处理,当一个高优(fast)中断产生时将会进入这种模式。 IRQ模式:也称为普通中断模
3、式,:当一个低优先级中断产生时将会进入这种模式。在这模式下按中断的处理器方式又分为向量中断和非向量中断两种。通常的中断处理都在IRQ模式下进行。 SVC模式:称之为管理模式,它是一种操作系统保护模式。当复位或软中断指令执行时处理器将进入这种模式。 中止模式:当存取异常时将会进入这种模式,用来处理存储器故障、实现虚拟存储或存储保护。 未定义指令异常模式:当执行未定义指令时会进入这种模式,主要是用来处理 未定义的指令陷阱,支持硬件协处理器的软件仿真,因为未定义指令多发生在对协处理器的操作上。 系统模式:使用和User模式相同寄存器组的特权模式,用来运行特权级的操作系统任务。 在这7种工作模式中,除
4、了用户模式以外,其他6种处理器模式可以称为特权模式,在这些模式下,程序可以访问所有的系统资源,也可以任意地进行处理器模式的切换。在这6种特权模式中,除了系统模式外的其他5种特权模式又称为异常模式 4分析程序状态寄存器(PSR)各位的功能描述,并说明C、Z、N、V在什么情况下进行置位和清零。 PSR的具体格式为 V溢出标志位 对于加/减法运算指令,当操作数和运算结果为二进制补码表示的带符号数时,V1表示符号位溢出,其他的指令通常不影响V位。 例如:两个正数(最高位为0)相加,运算结果为一个负数(最高位为1),则符号位溢出,相应V=1。 C进位或借位标志位 对于加法指令(包括比较指令CMN),结果
5、产生进位,则C1,表示无符号数运算发生上溢出,其他情况下C0; 在减法指令中(包括比较指令CMP),结果产生借位,则C0,表示无符号数运算发生下溢出,其他情况下C1; 对于包含移位操作的非加/减法运算指令,C中包含最后一次溢出位的数值; 对于其他非加/减法运算指令,C位的值通常不受影响。 Z结果为0标志位 Z1表示运算结果是0,Z0表示运算结果不是零; 对于CMP指令,Z1表示进行比较的两个数大小相等。 NT符号标志位 本位设置成当前指令运算结果的bit31的值。当两个补码表示有符号整数运算时,N1表示运算的结果为负数,N0 表示结果为正数或零。 5.简述ARM处理器异常处理和程序返回的过程。
6、 答:ARM在异常产生时会进行以下操作: (1) 将引起异常指令的下一条指令地址保存到新的异常模式的LR中,使异 常处理程序执行完后能根据LR中的值正确返回; (2) 将CPSR的内容复制到新的异常模式下的SPSR中; (3) 根据异常类型将CPSR模式控制位强制设定为发生异常所对应的模式值; (4) 强制PC指向相应的异常向量地址。 ARM在异常返回时 (1) 从 SPSR_恢复CPSR; (2) 从LR_恢复PC 。 6.ARM处理器字数据的存储格式有哪两种?并指出这两种格式的区别。 答: 1) 小端存储格式(Little-Endian) 在小端存储格式中,对于地址为A的字单元,其中字节单
7、元由低位到高位字节地址顺序为A,A+1,A+2,A+3;对于地址为A的半字单元,其中字节单元由低位到高位字节地址顺序为A,A+1; 2) 大端存储格式(Big-Endian) 在大端存储格式中,对于地址为A的字单元,其中字节单元由高位到低位字节地址顺序为A,A+1,A+2,A+3;对于地址为A的半字单元,其中字节单元由高位到低位字节地址顺序为A,A+1。7 分析带有存储器访问指令(LDR)的流水线运行情况,并用图示说明其流水线的运行机制。 答:在ARM三级流水线下: 对存储器的访问指令LDR就是非单周期指令。这类指令在“执行”阶段后,还要进行“存储器访问”和“寄存器回写”操作,每一步占用1个时
8、钟周期。在指令执行时空图中,处于时钟周期T5时,LDR指令要进行数据的存储器操作(访存),在时钟周期T6要进行寄存器的回写操作,这两步还要占用执行单元,因此其下1条指令的“执行”就被阻断了,其下数第2条指令的译码被阻断,要等待LDR指令 操作完毕后,流水线的正常运行才能被恢复。 在图中,处理器用6个时钟周期执行了4条指令,指令平均周期数(CPI) = 1.5 时钟周期。 8简述ARM9的5级流水线每一级所完成的功能和实现的操作。 答:在ARM9在指令操作上采用5级流水线。 1) 取指:从指令Cache中读取指令。 2) 译码:对指令进行译码,识别出是对哪个寄存器进行操作并从通用寄存器中读取操作
9、数。 3) 执行:进行ALU运算和移位操作,如果是对存储器操作的指令,则在ALU中计算出要访问的存储器地址。 4) 存储器访问:如果是对存储器访问的指令,用来实现数据缓冲功能(通过数据Cache);如果不是对存储器访问的指令,本级流水线为一个空的时钟周期。 寄存器回写:将指令运算或操作结果写回到目标寄存器中。 9 什么叫做流水线互锁?应如何来解决,举例说明。 答: 在流水线运行过程中可能会出现这种情况:当前指令的执行可能需要前面指令的执行结果,但这时前面的指令没有执行完毕,从而会导致当前指令的执行无法获得合法的操作数,这时就会引起流水线的等待,这种现象在流水线机制里称为互锁。 举例:参见教材第
10、29页: 当互锁发生时,硬件会停止这个指令的执行,直到数据准备好为止。如图所示,LDR指令进行完执行阶段,还需要两个时钟周期来完成存储器访问和寄存器写操作,但这时指令MOV中用到的R9正是LDR中需要进行寄存器加载操作后的寄存器, 因此MOV要进行等待,直到LDR指令的寄存器写操作完成。 3章 ARM指令集寻址方式1 在指令编码中,条件码占有几位,最多有多少个条件,各个条件是如何形成的?答:见教材3.1节的描述。 2指令条件码中,V标志位在什么情况下才能等于1? 答:当指令的算术运算发生异常时,V标志位置1。例如,两个正数相加,其结果为一负数;或者是两个负数相加,其结果为一正数,都会置V标志位
11、。 3在ARM指令中,什么是合法的立即数?判断下面各立即数是否合法,如果合法则写出在指令中的编码格式(也就是8位常数和4位的移位数)。 0x5430 0x108 0x304 0x501 0xFB10000 0x 0x3FC000 0x1FE0000 0x 0x7F800 0x39C000 0x1FE80000 答:每个立即数由一个8位的常数进行32位循环右移偶数位得到,其中循环右移的位数由一个4位二进制的两倍表示。即: =immed_进行32位循环右移(2*rotate_4)位 符合这一条件的都为合法的立即数。 0x5430 0B 0101 0100 0011 0000 不合法 0x108 0
12、B 0001 0000 1000 1111 (30/2) 0x304 0B 0011 0000 0100 1111 (30/2) 0x501 0B 0101 0000 0001 不合法 0xFB10000 0B 1111 1011 0001 0000 0000 0000 不合法 0x 0B 0011 0011 0100 0000 0000 0000 1001 (18/2) 0x3FC000 0B 0011 1111 0000 0000 0000 1010 (18/2) 0x1FE0000 0B 0001 1111 1110 (0000)4 不合法 0x 0B 0101 0101 1000 (0
13、000)4 不合法 0x7F80000 0B 0111 1000 0001 (0000)4 不合法 0x39C000 0B 0011 1001 1100 0000 0000 0000 1001 (18/2) 0x1FE80000 0B 0001 1111 1110 (0000)4 不合法 4 分析逻辑右移、算术右移、循环右移、带扩展的循环右移它们间的差别。 答:见教材3.2节的图3-1移位操作功能描述。 5 ARM数据处理指令具体的寻址方式有哪些,如果程序计数器PC作为目标寄存器,会产生什么结果?ARM数据处理指令具体的寻址方式有5种,见教材3.2节的具体说明。如果程序计数器PC作为目标寄存器
14、,会产生程序发生跳转。6 在Load/Store指令寻址中,字、无符号字节的Load/Store指令寻址和半字、有符号字节寻址,试分析它们之间的差别。 答:在Load/Store指令寻址中,字、无符号字节的Load/Store指令寻址有三种,具体见教材3.3.2节; Load/Store指令寻址中,半字、有符号字节寻址有两种,具体见教材3.3.3节; 它们之间的差别:在半字、有符号字节寻址中,没有Addressing_mode中的偏移量通过寄存器移位得到的形式。 7 块拷贝Load/Store指令在实现寄存器组和连续的内存单元中数据传递时,地址的变化方式有哪几种类型,并分析它们的地址变化情况。
15、 答: Load/Store指令在实现寄存器组和连续的内存单元中数据传递时,地址的变化方式(addr_mode)有以下4种类型: 后增IA (Increment After) :每次数据传送后地址加4; IB (Increment Before) :每次数据传送前地址加4 ; 后减DA (Decrement After) :每次数据传送后地址减4 ; DB (Decrement Before) :每次数据传送前地址减4 。 8栈操作指令地址的变化方式有哪几种类型,并分析它们的地址变化情况,从而得出栈操作指令寻址和块拷贝Load/Store指令之间的对应关系。 答: (1) 四种类型的堆栈工作方
16、式,即: 满递增堆栈FA(Empty Ascending):堆栈指针指向最后压入的数据,且由低地址向高地址生成。 满递减堆栈FD(Full Descending):堆栈指针指向最后压入的数据,且由高地址向低地址生成。 空递增堆栈EA(Full Ascending):堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。 空递减堆栈ED(Empty Descending):堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。 (2) 栈操作指令寻址和块拷贝Load/Store指令之间的对应关系见表3-10。 9 分析协处理器加载/存储指令的寻址方式中的内存地址索引格式中不同
17、的汇编语法格式下内存地址的计算方法。 答:具体见教材3.3.2节 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 答:现对以下三条指令进行编码,其余的参照本章的编码说明。4章 ARM指令集系统 1. A
18、RM指令可分为哪几类?说出哪几条指令是无条件执行的。 ARM指令可分为: 数据处理指令 程序状态寄存器与通用寄存器之间的传送指令 Load/Store指令 转移指令 异常中断指令 协处理器指令 无条件执行指令:BLX,BKPT 2.如何实现两个64位数的加法操作,如何实现两个64位数的减法操作,如何求一个64位数的负数? 答:(1)见教材例4-4: 实现64位数据加法运算:假设R0和R1存放了一个64位数据(作为被加数),R0存放数据的低32位;R2和R3中存放了另一个64位数据(作为加数),R2中存放低32位数据。运算结果送回到R1:R0中(R0中存放低32位)。 ADDS R0,R0,R2
19、 ;低落32位相加并影响标志位 ADC R1,R1,R3 ;高32位相加再加上C标志位 (进位值) 2)见教材例4-6: SBC指令和SUBS指令联合使用可以实现两个64位的操作数相减。如果寄存器R0和R1中放置一个64位的被减数,其中R0中放置低32位数值;寄存器R2和R3中放置一个64位的减数,其中R2中放置低32位数值。运算结果送回到R1:R0中(R0中存放低32位)。 SUBS R0,R0,R2 ;低32位相减并影响标志位 SBC R1,R1,R3 ; 高32位相减再减去C标志位的反码 3)见教材例4-8: 如果寄存器R0和R1中放置一个64位数,其中R0中放置低32位数值;寄存器R4
20、和R5中放置其负数,其中R4中放置低32位数值。 RSBS R4,R0,#0 ; 0减去低32位并影响标志位 RSC R5,R1,#0 ; 0减去高32位再减去C标志位的反码 3.写出LDRB指令与LDRSB指令二进制编码格式,并指出它们之间的区别。 答:提示:LDRB指令与LDRSB指令编码的符号不同,在功能上LDRB所加载的寄存器高24位清0,而LDRSB则是用符号位扩展。 4.分析下列每条语句的功能,并确定程序段所实现的操作。 CMP R0,#0 MOVEQ R1,#0 MOVGT R1,#1 答:分析: 当R0等于0时,MOVEQ执行,则R1等于0; 当R0等于正数时,MOVGT执行,
21、则R1等于1; 此功能码段可以判别R0中的值为正数还是0。 5.请使用多种方法实现将字数据0xFFFFFFFF送入寄存器R0。 答: 例如,MVN R0,#0 或者: MOV R0,#0 SUB R0,R0,#1 还可以用其它运算指令来实现,读者自行写出。 6. 写一条 ARM 指令,分别完成下列操作: a)R0 = 16 b)R0 = R1 / 16 (带符号的数字) c)R1 = R2 * 3 d)R0 =-R0答:a)RO=16MOV RO,OX10b) RO=R1/16(带符号的数字)MOV RO,R1,ASR#4c) R1= R2*3ADD R1,R2.R2.LSL#1d) R0 =
22、-RORSB RO,RO.#0 7.编写一个ARM汇编程序,累加一个队列中的所有元素,碰上0时停止。结果放入 R4。 解答:(参考程序) /*- 寄存器的使用说明: R0:队列指针 R1:加载队列中的数据 R4:队列数据的累加结果 *-*/ .global start .text start: LDR R0, =DataZone 初始化为队列的起始地址 MOV R4, #0 结果寄存器初始化为0 addNum: LDRB R1, R0, #1 加载队列中的数据存入R1中 CMP R1, #0 判断R1的值是否为0 BLS stop 如果R1的值小于或等于0则停止累加 ADD R4, R4, R
23、1 累加求和 B addNum 继续循环 stop: B . DataZone: .space 10, 0x10 在存储单元中申请10个字节的连续空间并用0x10填充 .zero 5 在存储单元中申请5个字节的连续空间并用0填充 .end 8.写出实现下列操作的ARM指令: 当Z=1时,将存储器地址为R1的字数据读入寄存器R0。 当Z=1时,将存储器地址为R1+R2的字数据读入寄存器R0。 将存储器地址为R1-4的字数据读入寄存器R0。 将存储器地址为R1+R6的字数据读入寄存器R0,并将新地址R1R6写入R1。解答(1) MOVEQ R0, R1 (2) LDREQ R0, R1,R2 (3
24、 LDR R0,R1,#-4 (4) LDR R0 R1,R6! 9.写出下列ARM指令所实现操作: LDR R2,R3,-4 ! LDR R0,R0,R2 LDR R1,R3,R2,LSL2!; LDRSB R0,R2,#-2! STRB R1,R2,#0xA0 LDMIA R0,R1,R2,R8 STMDB R0!,R1-R5,R10,R11 解答: LDR R2,R3,#-4! 将存储器地址为R3-4的字数据读入R2,并将地址R3-4写入R3 LDR R0,R0,R2 将存储器地址为R0的字数据读入R0,并将地址R0+R2写入R0 LDR R1,R3,R2,LSL#2! 将存储器地址为R
25、3+R2*4的字数据读入R1,并将地址R3+R2*4写入R3 LDRSB R0,R2,#-2! 将存储器地址为R2-2的字节数据读入R0的低8位,将R0的高24位用符号位扩展,并将地址R2-2写入R2 STRB R1,R2,#0xA0 R0的低8位存入存储器地址为R2+0xA0字节中 LDMIA R0,R1,R2,R8 将内存单元R0所指向的地址单元以字为单位递减方式读取到R1,R2,R8中,低地址编号的字数据内存单元对应低编号寄存器 STMDB R0! R1-R5,R10,R11 R1-R5,R10,R11存储到以R0为起始地址的递减内存中,最终R0指向存放R11的地址单元 10. SWP
26、指令的优势是什么? 答: ARM指令支持原子操作,主要是用来对信号量的操作,因为信号量操作的要求是作原子操作,即在一条指令中完成信号量的读取和修改操作。SWP数据交换指令就能完成此功能,能在一条指令中实现存储器和寄存器之间交换数据。 11.如何用带PSR操作的批量字数据加载指令实现IRQ中断的返回? 答:见教材例4-31 在进入IRQ中断处理程序时,首先计算返回地址,并保存相关的寄存器 SUB R14,R14,#4 ; STMFD R13!, R0-R3, R12, LR ; 如果IRQ中断处理程序返回到被中断的进程则执行下面的指令。该指令从数据栈中恢复寄存器R0R3及R12的值,将返回地址传送到PC中并将SPSR_irq值复制到CPSR中 LDMFD R13!, R0-R3, R12, PC 12.用ARM汇编语言编写代码,实现将ARM处理器切换到用户模式,并关闭中断。.equ User_Mode, 0x10 .equ Mode_Mask 0x1F .equ NOINT, 0xC0 MRS R0, CPSR 读CPSR BIC R0, R0, #Mode_Mask ORR R1, R0, #User_Mode | NOINT 修改 MSR CPSR_cxsf, R1 进入用户模式 专心-专注-专业