《ARM复习课后题答案(完整版)22670.pdf》由会员分享,可在线阅读,更多相关《ARM复习课后题答案(完整版)22670.pdf(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1/10 1.国内嵌入式系统行业对嵌入式系统的定义是什么?如何理解 答:以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。从这个定义看以看出嵌入式系统是与应用紧密结合的,它具有很强的专用性,必须结合实际系统要求进行合理的裁剪利用。因此有人把嵌入式系统比作是一个针对特定的应用而量身定做的专用计算机系统。2.当前最常见的源码开放的嵌入式操作系统有哪些,请举出两例,并分析其特点 答:嵌入式 linux 和嵌入式实时操作系统 uc/os-II Linux:(1)linux 是源码开放的,每一个技术细节都是透明的,易于裁剪定制。(2)
2、目前嵌入式 linux 已经在多种嵌入式处理器芯片移植成功,有大量且不断增加的开发工具,这些工具为嵌入式系统开发提供了良好的开发环境。(3)Linux 内核小、功能强大、运作稳定、效率高。Ucos:(1)源代码公开(2)可移植性。(3)可固化(4)可裁剪(5)占先式(6)多任务(7)可确定性。(8)系统服务 第 2 章 ARM 技术与 ARM 体系结构 3.arm 处理器的工作模式有哪几种,其中哪些为特权模式,哪些为异常模式,并指出处理器在什么情况下进入相应的模式。答:ARM 处理器共有7 种工作模式:用户模式:非特权模式,也就是正常程序执行的模式,大部分任务在这种模式 下执行。在用户模式下,
3、如果没异常发生,不允许应用程序自行改变处理器的工作 模式,如果有异常发生,处理器会自动切换工作模式 FIQ 模式:也称为快速中断模式,支持高速数据传输和通道处理,当一个高优 先级(fast)中断产生时将会进入这种模式。IRQ 模式:也称为普通中断模式,:当一个低优先级中断产生时将会进入这种模 式。在这模式下按中断的处理器方式又分为向量中断和非向量中断两种。通常的中 断处理都在IRQ 模式下进行。SVC 模式:称之为管理模式,它是一种操作系统保护模式。当复位或软中断指 令执行时处理器将进入这种模式。中止模式:当存取异常时将会进入这种模式,用来处理存储器故障、实现虚拟 存储或存储保护。未定义指令异
4、常模式:当执行未定义指令时会进入这种模式,主要是用来处理 未定义的指令陷阱,支持硬件协处理器的软件仿真,因为未定义指令多发生在对协 处理器的操作上。系统模式:使用和User 模式相同寄存器组的特权模式,用来运行特权级的操作 2/10 系统任务。在这7 种工作模式中,除了用户模式以外,其他6 种处理器模式可以称为特权 模式,在这些模式下,程序可以访问所有的系统资源,也可以任意地进行处理 器模式的切换。在这 6 种特权模式中,除了系统模式外的其他 5 种特权模式又 称为异常模式 4分析程序状态寄存器(PSR)各位的功能描述,并说明C、Z、N、V 在什 么情况下进行置位和清零。答:PSR 的具体格式
5、为 V溢出标志位 对于加/减法运算指令,当操作数和运算结果为二进制补码表示的带符号数时,V1 表示符号位溢出,其他的指令通常不影响 V 位。C进位或借位标志位 对于加法指令(包括比较指令CMN),结果产生进位,则C1,表示无符号 数运算发生上溢出,其他情况下C0;在减法指令中(包括比较指令CMP),结果产生借位,则C0,表示无符号数 运算发生下溢出,其他情况下C1;对于包含移位操作的非加/减法运算指令,C 中包含最后一次溢出位的数值;对于其他非加/减法运算指令,C 位的值通常不受影响。Z结果为0 标志位 Z1 表示运算结果是0,Z0 表示运算结果不是零;对于CMP 指令,Z1 表示进行比较的两
6、个数大小相等。N符号标志位 本位设置成当前指令运算结果的bit31的值。当两个补码表示有符号整数运算 时,N1 表示运算的结果为负数,N0 表示结果为正数或零。5简述ARM 处理器异常处理和程序返回的过程。答:ARM 在异常产生时会进行以下操作:(1)将引起异常指令的下一条指令地址保存到新的异常模式的LR 中,使异 常处理程序执行完后能根据LR 中的值正确返回;(2)将CPSR 的内容复制到新的异常模式下的SPSR 中;(3)根据异常类型将CPSR 模式控制位强制设定为发生异常所对应的模式 值;(4)强制PC 指向相应的异常向量地址。ARM 在异常返回时(1)从 SPSR_恢复CPSR;(2)
7、从 LR_恢复 PC。3/10 6ARM 处理器字数据的存储格式有哪两种?并指出这两种格式的区别。答:(1)小端存储格式(Little-Endian)在小端存储格式中,对于地址为A 的字单元,其中字节单元由低位到高位字节地 址顺序为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。第 3 章 ARM 指令集寻
8、址方式 3在ARM 指令中,什么是合法的立即数?判断下面各立即数是否合法,如果合 法则写出在指令中的编码格式(也就是 8 位常数和 4 位的移位数)。0 x5430 0 x108 0 x304 0 x501 0 xFB10000 0 x334000 0 x3FC000 0 x1FE0000 0 x5580000 0 x7F800 0 x39C000 0 x1FE80000 答:计算步骤:(1)十六进制立即数两端 0 去掉(2)展成二进制(3)连续偶数个 0 去掉,数字中间 0 不去掉(4)剩下数字位数小于等于 8 可以,反之,不可以。5ARM 数据处理指令具体的寻址方式有哪些,如果程序计数器
9、PC 作为目标寄存器,会产生什么结果?答:ARM 数据处理指令寻址方式有 5 种 1)第二操作数为立即数 2)第二操作数为寄存器 3)第二操作数为寄存器移位方式,且移位的位数为一个 5 位的立即数 4)第二操作数为寄存器移位方式,且移位数值放在寄存器中 5)第二操作数为寄存器进行 RRX 移位得到 如果程序计数器 PC 作为目标寄存器,会发生程序跳转。6在Load/Store 指令寻址中,字、无符号字节的Load/Store 指令寻址和半字、有 符号字节寻址,试分析它们之间的差别。答:字、无符号字节寻址:1)Addressing_mode 中的偏移量为立即数 2)Addressing_mode
10、 中的偏移量为寄存器的值 3)Addressing_mode 中的偏移量通过寄存器移位得到 半字、有符号字节寻址:1)Addressing_mode 中的偏移量为立即数 4/10 2)Addressing_mode 中的偏移量为寄存器的值 从以上分析看出:差别就在于后者没有第三项寻址方式。7块拷贝Load/Store 指令在实现寄存器组和连续的内存单元中数据传递时,地址 的变化方式有哪几种类型,并分析它们的地址变化情况。答:批量Load/Store 指令在实现寄存器组和连续的内存单元中数据传递时,地址的 变化方式(addr_mode)有以下4 种类型:后增IA(Increment After)
11、:每次数据传送后地址加4;先增IB(Increment Before):每次数据传送前地址加4;后减DA(Decrement After):每次数据传送后地址减4;先减 DB(Decrement Before):每次数据传送前地址减 4。8栈操作指令地址的变化方式有哪几种类型,并分析它们的地址变化情况,从而 得出栈操作指令寻址和块拷贝 Load/Store 指令之间的对应关系。答:(1)四种类型的堆栈工作方式,即:满递增堆栈FA(Empty Ascending):堆栈指针指向最后压入的数据,且由低地址 向高地址生成。满递减堆栈FD(Full Descending):堆栈指针指向最后压入的数据,
12、且由高地址 向低地址生成。空递增堆栈EA(Full Ascending):堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。空递减堆栈ED(Empty Descending):堆栈指针指向下一个将要放入数据的空位 置,且由高地址向低地址生成。(2)栈操作指令寻址和块拷贝 Load/Store 指令之间的对应关系见表 3-10。第 4 章 ARM 指令集系统 4.分析下列每条语句的功能,并确定程序段所实现的操作。CMP R0,#0 MOVEQ R1,#0 MOVGT R1,#1 答:分析:当R0 等于0 时,MOVEQ 执行,则R1 等于0;当R0 等于正数时,MOVGT 执行,则
13、R1 等于1;此功能码段可以判别R0 中的值为正数还是0。5.请使用多种方法实现将字数据0 xFFFFFFFF 送入寄存器R0。答:例如,MVN R0,#0 或者:MOV R0,#0 SUB R0,R0,#1 还可以用其它运算指令来实现,读者自行写出。5/10 9.写出下列ARM 指令所实现操作:LDR R2,R3,-4!LDR R0,R0,R2 LDR R1,R3,R2,LSL2!;LDRSB R0,R2,#-2!STRB R1,R2,#0 xA0 LDMIA R0,R1,R2,R8 STMDB R0!,R1-R5,R10,R11 解答:LDR R2,R3,#-4!将存储器地址为R3-4 的
14、字数据读入R2,并将地址R3-4 写入R3 LDR R0,R0,R2 将存储器地址为R0 的字数据读入R0,并将地址R0+R2 写入R0 LDR R1,R3,R2,LSL#2!将存储器地址为R3+R2*4 的字数据读入R1,并将地址R3+R2*4 写入R3 LDRSB R0,R2,#-2!将存储器地址为R2-2 的字节数据读入R0 的低8 位,将R0 的高24 位用符号 位扩展,并将地址R2-2 写入R2 STRB R1,R2,#0 xA0 将R0 的低8 位存入存储器地址为R2+0 xA0 字节中 LDMIA R0,R1,R2,R8 将内存单元R0 所指向的地址单元以字为单位递减方式读取到R
15、1,R2,R8 中,低地址编号的字数据内存单元对应低编号寄存器 STMDB R0!R1-R5,R10,R11 将 R1-R5,R10,R11 存储到以 R0 为起始地址的递减内存中,最终 R0 指向存放 R11 的地址单元 10.SWP 指令的优势是什么?答:ARM 指令支持原子操作,主要是用来对信号量的操作,因为信号量操作的要求 是作原子操作,即在一条指令中完成信号量的读取和修改操作。SWP 数据交换指令 就能完成此功能,能在一条指令中实现存储器和寄存器之间交换数据。11.如何用带 PSR 操作的批量字数据加载指令实现 IRQ 中断的返回?答:在进入 IRQ 中断处理子程序时,首先计算返回的
16、地址,并保存相关的寄存器 SUB R14,R14,#4 STMFD R13!,R0-R3,R12,LR 如果 IRQ 中断处理程序返回到被中断的进程则执行下面的指令。该指令从数据栈中恢复R0-R3 及 R12 的值,将返回地址传送到 PC 中,并将 SPSR_irq 值复制到 CPSR 中 LDMFD R13!,R0-R3,R12,PC 12.用ARM 汇编语言编写代码,实现将ARM 处理器切换到用户模式,并关闭中断。.equ User_Mode,0 x10.equ Mode_Mask 0 x1F.equ NOINT,0 xC0 MRS R0,CPSR 读CPSR 6/10 BIC R0,R0
17、,#Mode_Mask ORR R1,R0,#User_Mode|NOINT 修改 MSR CPSR_cxsf,R1 进入用户模式 第6章 ARM 汇编伪指令与伪操作 1.在 ARM 汇编语言程序设计中,伪操作与伪指令的区别是什么?答:伪指令是 ARM 处理器支持的汇编语言程序里的特殊助记符,它不在处理器运行期间由机器执行,只是在汇编时被合适的机器指令代替成 ARM 或 Thumb 指令,从而实现真正的指令操作。伪操作是 ARM 汇编语言程序里的一些特殊的指令助记符,其作用主要是为完成汇编程序做各种准备工作,对源程序进行汇编程序处理,而不是在计算机运行期间由处理器执行。也就是说,这些伪操作只是
18、在汇编过程中起作用,一旦汇编结束,伪操作也就随之消失。2.分析 ARM 汇编语言伪指令 LDR、ADRL、ADR 的汇编结果,说明它们之间的区别。答:LDR 是大范围地址读取伪指令。LDR 将一个 32 位的常数或者一个地址值读取到寄存器中,可以看作是加载寄存器的内容。ADRL 是中等范围地址读取伪指令。它将基于 PC 相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。ADR 是小范围地址读取伪指令,它将基于 PC 相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。从以上分析可以看出:LDR 不依赖于 PC 值,加载的数据是绝对值。ADRL 和 ADR 依赖于 PC 值,加
19、载的数据是基于 PC 相对偏移值 第 7 章 汇编语言程序设计 4.在GNU环境下用ARM汇编语言编写程序初始化各ARM处理器各模式下的堆栈指针SP_mode(R13),各模式的堆栈地址如下:.equ _ISR_STARTADDRESS,0 xcFFF000.equ UserStack,_ISR_STARTADDRESS .equ SVCStack,_ISR_STARTADDRESS+64.equ UndefStack,_ISR_STARTADDRESS+64*2 .equ AbortStack,_ISR_STARTADDRESS+64*3.equ IRQStack,_ISR_STARTADD
20、RESS+64*4.equ FIQStack,_ISR_STARTADDRESS+64*5 /-示例程序-代码为平常自己写的,上机调试成功!与题目有点不一样,变量名和数值得改一改 /-7/10.equ ISR_STARTADDRESS,0 x40008000.equ svc_stack_top,ISR_STARTADDRESS /*0 x40008000*/.equ user_stack_top,ISR_STARTADDRESS-512 /*0 x40007E00*/.equ undefstack_top,ISR_STARTADDRESS-512*2/*0 x40007C00*/.equ ab
21、ortstack_top,ISR_STARTADDRESS-512*3/*0 x40007A00*/.equ isrstack_top,ISR_STARTADDRESS-512*4/*0 x40007800*/.equ fiqstack_top,ISR_STARTADDRESS-512*5/*0 x40007600*/.equ user_mode,0 x10.equ fiq_mode,0 x11.equ irq_mode,0 x12.equ svc_mode,0 x13.equ abt_mode,0 x17.equ udf_mode,0 x1c.equ sys_mode,0 x1f .glob
22、al _start.text _start:b reset_handler b undifned_handler b svc_handler b prefetch_handler b abort_handler b.b irq_handler b fiq_handler reset_handler:ldr sp,=svc_stack_top/*svc_stack*/mrs r0,cpsr bic r0,r0,#0 x1f orr r0,r0,#udf_mode msr cpsr_c,r0 ldr sp,=undefstack_top /*undefstack*/mrs r0,cpsr bic
23、r0,r0,#0 x1f orr r0,r0,#abt_mode msr cpsr_c,r0 ldr sp,=abortstack_top /*abortstack*/mrs r0,cpsr bic r0,r0,#0 x1f orr r0,r0,#irq_mode msr cpsr_c,r0 ldr sp,=isrstack_top /*isrstack*/mrs r0,cpsr 8/10 bic r0,r0,#0 x1f orr r0,r0,#fiq_mode msr cpsr_c,r0 ldr sp,=fiqstack_top /*fiqstack*/mrs r0,cpsr bic r0,
24、r0,#0 x1f orr r0,r0,#user_mode msr cpsr_c,r0 ldr sp,=user_stack_top /*user_stack*/stop:b .undifned_handler:b .svc_handler:stmfd sp!,r0-r12,lr ldr r0,lr,#-4 bic r0,r0,#0 xff000000 ldmfd sp!,r0-r12,pc prefetch_handler:b.abort_handler:b .irq_handler:b .fiq_handler:b .end /另外有第 5 题和第 7 题,没时间写,可是老师也划题了。第
25、 8 章 嵌入式 C 编程规范 3.volatile 限制符在程序中起到什么作用,请举例说明。答:volatile 限制符起到抑制编译器优化的作用。例如:中断服务程序中修改的供其他程序检测的变量的问题。Static char flg=0;main(void)While(1)if(flg)程序代码 A else 9/10 程序代码 B /中断服务程序 Void ISR_INT(void)flg=1;在这个程序中,由于在程序执行的大部分时间内,flg 的值并没有变化,编译器会优化程序,flg=0。优化后的程序为:Static char flg=0;main(void)while(1)程序代码 B
26、解决问题的方法:将声明语句 static char flg=0;改为 volatile static char flg=0 3.请分析下列程序代码的执行结果#include main()int value=0 xff1;int*p1,*p2,*p3,*p4;p1=&value;p2=&p1;p3=&p2;p4=&p3;printf(“*p4=%xn”,*p4);程序执行结果:*p4=oxff1;5.分析宏定义#define POWER(x)x*x 是否合理,举例说明。如果不合理,应如何更改?答:不合理。x=i+j;POWER(x)=i+j*i+j;而不是(i+j)*(i+j)10/10 更改:
27、#define POWER(x)(x)*(x)7.何为可重入函数?如果使程序具有可重入性,在程序设计中应注意哪些问题?答:如果某个函数可以被多个任务并发使用,而不会造成数据错误,我们就说这个函数具有可重入性,相应的这个函数就可以成为可重入函数。可重入函数可以使用局部变量,也可以使用全局变量。如果使用全局变量,则应通过关中断、信号量(P、V 操作)等手段对其加以保护,若不加以保护,则此函数就不具有可重入性,即当多个进程调用此函数时,很有可能使得此全局变量变为不可知状态。9.ATPCS 与 AAPCS 的全称是什么,它们有什么差别?掌握子程序调用过程中寄存器的使用规则、数据栈的使用规则及参数的传递
28、规则,在具体的函数中能够熟练应用。答:过程调用标准 ATPCS(ARM-Thumb Produce Call Standard)规定了子程序间相互调用的基本规则,ATPCS 规定子程序调用过程中寄存器的使用规则、数据栈的使用规则及参数的传递规则。这些规则为嵌入式 C 语言程序和汇编程序之间相互调用提供了依据。2007 年,ARM 公司推出了新的过程调用标准 AAPCS(ARM Architecture Produce Call Standard),它只是改进了原有的 ATPCS 的二进制代码的兼容性。目前,这两个标准都在被使用。第 9 章 S3C2410 硬件结构与关键技术分析 第 10 章 S3C2410 通信与 LCD 接口技术/S3C2410 的启动初始化程序这个一定要会的!-嵌入式 linux 标准开发教程-/这应该是考点吧!第 1 章 linux 快速入门 1.3 linux 文件及文件系统 文件类型、文件属性、文件系统、linux 目录结构 第 2 章 linux 基础指令 /基本指令太多了,考哪些不好说啊,会的越多越好吧!2.2linux 启动过程详解 第 3 章 linux 下 C 编程基础 33 GCC 编译器的使用 3.5 Make 工程管理器/答案有的来自 pdf 有的为自己所写,仅供参考.