嵌入式系统设计与开发马文华课后答案_第1页
嵌入式系统设计与开发马文华课后答案_第2页
嵌入式系统设计与开发马文华课后答案_第3页
嵌入式系统设计与开发马文华课后答案_第4页
嵌入式系统设计与开发马文华课后答案_第5页
已阅读5页,还剩8页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第二章 一.ARM处理器有什么特点? ARM处理器的三大特点是:耗电少功能强、16位/32位双指令集和合作伙伴众多。 1、体积小、低功耗、低成本、高性能; 2、支持Thumb(16位)/ARM(32位)双指令集,能很好的兼容8位/16位器件; 3、大量使用寄存器,指令执行速度更快; 4、大多数数据操作都在寄存器中完成; 5、寻址方式灵活简单,执行效率高; 6、指令长度固定。 二.ARM的那个寄存器作为PC使用?哪个作为LR使用 ARM的寄存器,全部共有37个32位长的寄存器。但ARM核心同时最多只可以有18个同时执行的寄存器:包含了16个通用寄存器和2个状态寄存器,16个通用寄存器中包含了3个

2、专用寄存器,R13、R14和R15。 R13 用作堆栈指针 SP R15用做程序计数器PC, R14用做子程序链接寄存器LR。 三.ARM有几种运行模式?那些具有特权?如何改变处理器的模式? ARM有7中工作模式:用户模式、快速中断模式、外部中断模式、管理模式、数据访问中止模式、未定义指令中止模式、系统模式。 除了用户模式以外,其余所有6种模式称之为特权模式,权限比用户模式高,其中特权模式中除去系统模式外的5种模式称之为异常模式,常用于处理中断或异常,以及需要访问受保护的系统资源等情况。 处理器模式可以通过控制进行切换,也可以通过外部中断或异常处理过程进行切换。大多数的用户程序运行在用户模式下

3、,这时,应用程序不能访问一些受操作系统保护的系统,应用程序也不能直接进行处理器模式切换。当需要进行处理器模式切换时,应用程序可以产生异常处理,在异常处理中进行处理器模式的切换。 四.ARM有几种异常?其异常处理方式和x86有什么不同? 1)复位(Reset)异常(管理模式); 2)未定义指令(undefined instruction)异常(未定义模式); 3)软件中断(SWI)异常(管理模式); 4)指令预取中止(Prefech Abort)异常(中止模式); 5)数据访问中止(Data Abort)(中止模式); 6)快速中断请求(FIQ)(FIQ模式); 7)外部中断请求(IRQ)(IR

4、Q模式)。 机制一样:申请中断、相应中断、中断处理、中断返回 由于硬件不一样,细节上有很大区别,比如ARM的中断向量表: ARM: Vectors LDR PC, Reset_Addr ;0x00000000复位 LDR PC, Undef_Addr ;0x00000004未定义异常 LDR PC, SWI_Addr ;0x00000008软件中断 LDR PC, PAbt_Addr ;0x0000000C预取指中止 LDR PC, DAbt_Addr ;0x00000010数据中止 NOP ;0x00000014保留 ; LDR PC, IRQ_Addr LDR PC, PC, #-0x0F

5、F0 ;0x00000018中断 LDR PC, FIQ_Addr ;0x0000001C快速中断 X86:偏移量与段地址结合的方式 五.试比较ARM和x86的I/O寻址方式有什么不同? ARM: 立即数寻址:操作数本身直接在指令中给出,取出指令也就获得了操作数,这个操作数也是称为立即数。 寄存器的值为操作数。ARM指令普遍采用此种寻址方式。 寄存器偏移寻址:寄存器偏移寻址是ARM指令集特有的寻址方式。当第二作数是寄存器偏移方式时,第二寄存器操作数在与第一操作数结合之前,选择进行移位操作。 寄存器寻址:第二操作数的移位位数可以用立即数方式或者寄存器方式给出。 寄存器间接寻址:寄存器中的值为操作

6、数的物理地址,而实际的操作数存放在存储器中。 基址加偏址寻址:将寄存器的值与指令中给出的偏移地址址量相加,所得结果作为操作数的物理地址。 堆栈寻址:堆栈寻址用于数据栈与寄存器组之间批量数据传输。当数据写好和读出内存的顺序不同时,使用堆栈寻址可以很好的解决这个问题。 X86: 立即数寻址:操作数包含在指令中,它作为指令的一部分,跟在操作码后存放在代码段。 寄存器寻址:操作数存放在CUP的内部寄存器中。 直接寻址方式:操作数的存储器中,指令中直接包含有操作数的有效地址,默认的段地址在DS段寄存器。 寄存器间接寻址:操作数在存储器中,操作数的有效地址在基址寄存器BX、BP或变址 寄存器SI、DI中。

7、可使用段超越前缀改变 。 寄存器相对寻址:操作数在存储器中,操作数有效地址是一个基址寄存器BX、BP或变址寄存器SI、DI的内容加上指令中给出的位置量之和。 相对基址变址寻址:操作数在存储器中,操作数的有效地址由基址寄存器的内容与变址寄存器的内容及指令中位置量相加得到,可用段超越前缀改变。 六.若允许FIQ和IRQ中断,CPSR应该如何处置? 当允许IRQ中断时,CPSR【7】=0即CPSR的I位置为0.当允许FIQ中断时,CPSR【6】=0即CPSR的F位为0。 如果2个中断同时发生时,由于FIQ拥有最高中断优先级,而IRQ只有中等中断优先级,所以先执行FIQ中断(CPSR【7】=0),当中

8、断结束后再执行IRQ中断(CPSR【6】=0) FIQ: CPSR4:0=0B10001 /进入FIQ模式 IRQ: CPSR4:0=0B10010 /进入IRQ模式 CPSR5=0 /在ARM状态执行 CPSR6=0 / 允许FIQ中断 CPSR7=0 /允许IRQ中断 七.什么是ARM的E变种? E变种增加一些附加指令用于增强处理器对一些典型的DSP算法的处理性能,主要包括以下指令。 ·几条新的实现16位数据乘法和乘加操作的指令 ·实现饱和的带符号数的加减法操作的指令。 ·进行双字数据操作的指令,包括双字读取指令LDRD,双字写入指令STRD和协处理器的寄存器

9、传输指令MCRR/MRRC。 ·cache予取指令PLD。 E变种首先在ARM体系结构版本5T中使用,用字符E表示。在ARM体系结构版本5以前的版本中,以及在非M变种和非T变种的版本中,E是无效的。 八.ARM的哪一种(或几种)模式使用的寄存器最少,使用的是哪些寄存器? 由上图可知用户模式和系统模式使用的寄存器最少,使用的有31个通用寄存器和一个状态寄存器,分别是:未分组寄存器R0R7;分组寄存器R8R14;程序计数器R15;状态寄存器CPSR 九.R13通常用来存储什么? 通常用来作为堆栈指针 第三章 1.举例说明ARM的各种寻址方式(P61) 答:1、立即寻址: 2、寄存器寻址:

10、 ADD R0,R0,#3 ADD R0,R1,R2 LER R0,R1 ADD R3,R2,R1,LSL #2 3、寄存器间接寻址: 4、寄存器移位寻址: 5、基址变址寻址: 6、多寄存器寻址: 7、堆栈寻址: LDR R0,R1,#-8 LDMIA R0,R1,R2,R3 LDMFD R13!,R0,R4-R12,PC 8、拷贝寻址: 9、相对寻址: LDMIA R0!,R2-R9 BL NEXT ? NEXT: ? MOV PC,LR 2.R0和R1中有两个32位数,若R0>R1,则R0=R0-R1;若R0<R1,则R1=R1-R0;若R0=R1,则R1、R0保持不变。 (1

11、)请用CMP、B和SUB指令完成上述操作。 答: CMP R0,R1 BLT LESS BRT MORE LESS: SUB R1,R1,R0 B EQ MORE: SUB R0,R0,R1 EQ: 或 AREA StrCopy,CODE, READONLY ;程序起始定义 ENTRY ;第一条指令的标识符 start MOV R0,#5 MOV R1,#4 CMP R0,R1 BLT Less BGT More END B EQ B stop Less SUB R1,R1,R0 B stop More SUB R0,R0,R1 stop (2)请用条件SUB指令完成上述操作。 答: CMP

12、R0,R1 SUBGT R0,R0,R1 SUBLT R1,R1,R0 或 AREA StrCopy, CODE, READONLY ENTRY start MOV R0,#5 MOV R1,#4 CMP R0,R1 SUBLT R1,R1,R0 SUBGT R0,R0,R1 stop END 3、用指令实现以下功能 答:(1)R0=16 MOV R0,#16 (2)R1=R0 X 4 MUL R1,R0,#4 (3)R0=R1/16 END LSR R0,R1,#4 或MOV R0,R1,LSR#4 (4)R1=R2 X 7 MUL R1,R2,#7 4、说明以下指令功能 答:(1)、ADD

13、S R0,R1,R1,LSL#2 将R1加上4倍的R1赋值给R0。 或R0=R1+R1*4; 并根据运算结果更新标志位 (2)、RSB R2,R1,#0 R2=0-R1,即将R1求反赋值给R2 5、下列指令序列完成什么功能? 答:(1)ADD R0,R1,R1,LSL #1 将R1加上左移一位后的R1并将结果赋值给R0。 (R0=R1+R1*2) (2)SUB R0,R0,R1,LSL #4 将R0减去左移一位后的R1并将结果赋值给R0。 (R0=R0 -R1x*16) (3)ADD R0,R0,R1,LSL #7 将R0加上左移7位后的R1并将结果赋值给R0。 (R0=R0+R1*128)

14、第四章 1、在ARM汇编语言程序设计中,语句一般是由指令,伪操作、宏指令和伪指令组成的。什么是伪操作、宏指令和伪指令呢?它们与指令由什么不同呢?各有什么优点? 答:1)定义: A.指令:每一条指令都对应一种CPU操作。 B.伪操作又称为伪指令,它是在对源程序汇编期间由汇编程序处理的操作,它们可以完 成如处理器选择、定义程序模式、定义数据、分配存储区、指示程序结束等功能。 C.宏指令是由用户按照宏定义格式编写的一段程序,其中语句可以是指令、伪指令,甚至是已定义的宏指令。 2)区别: a.每一条指令必须生成机器代码,然后在程序运行期间由CPU来执行其操作;而伪指令是在汇编期间由汇编程序执行的操作命

15、令,除了数据定义及存储器分配伪指令分配存储器空间外,其它伪指令不生成目标码。 b.宏指令的作用是把一个复杂的或者是不直观的语句或是组合用一个简单的、易记的形式表示,当编译器遇到源程序中的宏时,就把它定义的内容原封不动的copy过来。如果程序中使用100次宏,这段代码就被复制100次。 3)特点: 伪操作-成如数据定义、分配存储区、指示程序结束等功能; 宏指令-简化程序代码的编写和提高程序的可读性。 2、对比说明ADR、ADRL与LDR的区别与联系。(P353) 答:1)定义: 1)ADR:为小范围的地址读取伪指令,将基于PC相对偏移的地址值读取到寄存器中。 2)ADRL:为中等范围的地址读取伪

16、指令,将基于PC相对偏移的地址值读取到寄存器中。 3)LDR:大范围的地址读取伪指令,用于加载32位的立即数或一个地址值到指定寄存器,在汇编编译源程序时,LDR伪指令被替换成一条合适的指令。如加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该伪指令,否则汇编器将使用文字池。 2)区别: 1)ADR:指令格式: ADR cond register, expr 其中 register 加载的目标寄存器 expr 为地址表达式,当地址值是非字对齐时,取值范围-255255字节之间;当地址是字对齐是,取值范围-10201020字节之间。 2) ADRL:指令格式 ADRL cond

17、register,expr 其中 register 加载的目标寄存器 expr 地址表达式,当地址值是非字对齐时,取值范围-64K64K字节之间;当地址是字对齐时,取值范围-256K256K字节之间。 3) LDR:指令格式 LDRcond register,=expr/label_expr 其中 register 加载的目标寄存器 expr 为32位的立即数;label_expr基于PC的地址表达式或外部表达式。 3)联系: ADR、ADRL和LDR均为地址读取伪指令。 3、编写一个汇编程序,在ARM程序代码中调用Thumb子程序,并返回ARM程序完成其功能。 答: CODE32 BLX T

18、SUB1 CODE16 TSUB1 BX R14 或 ;转向ARM ;表明以下是Thumb指令 ;表明以下是ARM指令 AREA EXAMPLE,CODE,READONLY ENTRY ;程序入口处 CODE16 ;thumb 代码 Thumb ADD R1,R1,R0 ;R1=R1+R0 BX LR ;返回到arm状态 CODE32 ;ARM 代码 Start MOV R0,#1 ;及时数1赋值给R0 MOV R1,#5 ;及时数5赋值给R1 ADR R3,Thumb + 1 ;获取目标地址,末位1, MOV LR,PC ; 保存返回地址 BX R3 ; 切换到thumb状态 END 4、编

19、一段C语言与汇编语言的混合代码,在C语言程序中调用汇编语言代码,完成字符STR1,STR2内容的转换。 答: unsigned char str1='A' unsigned char str2='B' printf(%c,str1); printf(%c,str2); _asm /嵌入汇编代码 mov al,str1 /将str1的值赋给a1 xchg al,str2 /交换al和str2的值,现 str2=str1 mov str1,al /将a1的值赋给str1 printf(%c,str1); /输出 printf(%c,str2); /输出 getcha

20、r(); 或 #include stdio.h void main() unsigned char str1='A'/定义字符串str1的内容为A unsigned char str2='B'/定义字符串str2的内容为B printf(str1和str2的初始值n); printf(%c ,str1); /输出str1的值 printf(%cn,str2); /输出str2的值 _asm /汇编交换子程序 mov al,str1 /将str1的值赋给a1 xchg al,str2 /将a1的值与str2交换 mov str1,al /将a1的值赋给str1 p

21、rintf(str1和str2交换后的值n); printf(%c ,str1); /输出str1的值 printf(%c,str2); /输出str2的值 getchar(); 或 Cfile.c #include <stdio.h> extern void strcopy(char *d, const char *s); int main() const char *srcstr = abcde; char dststr32; printf(Before copying:n); printf( '%s'n '%s'n,srcstr,dststr)

22、; strcopy(dststr,srcstr); printf(After copying:n); printf( '%s'n '%s'n,srcstr,dststr); return 0; Asmfile.s AREA SCopy, CODE, READONLY EXPORT strcopy strcopy ; r0 points to destination string ; r1 points to source string LDRB r2, r1,#1 ; load byte and update address STRB r2, r0,#1 ; s

23、tore byte and update address; CMP r2, #0 ; check for zero terminator BNE strcopy ; keep going if not MOV pc,lr ; Return END 这是一个c语言调用汇编的例子,功能是为了实现字符串的拷贝,其中汇编文件 为字符串拷贝的功能子函数。 5、下列语句中,那些是无效的汇编语言指令?并指出无效指令中的错误。 1)ABC: MOV R1,R3 1)错“ABC:”不能用“:”号 2) Count: LDR R0,#0X80 2)错Count 大小写必需一致 3)LDMIA R5,R1,R3,R

24、4 3)错Equ 大小写必需一致 4)START LDR R0,=0x123456H 4)对 5)START LDR R0,=0x123456 5)对 6)对 或答:(1)、(2)(3)是错误的。(4)(5)(6)是正确的。 其中(1)中的冒号应去掉;(2)中的“Count”与(3)中 的“Equ”大小写应统一。 注意: symbol必须顶格书写。(ARM汇编其后不加“:”)(GUN汇 编要加“:”) symbol命名规则:由字母,数字,下划线组成;除局部标号外,不能以数字开头。 指令不能顶格书写。 ARM指令,伪指令,伪操作,寄存器名可以全部为大写字母,也可全部为小写字母;不可大小写混用。

25、如果语句太长,可以将一条语句分几行来书写,在行末用“”表示换行(即下一行与本行为同一语句)。“”后不能有任何字符,包含空格和制表符(Tab)。 6、试编写程序,实现计算2468?+2N的值。 答: MOV R5,#0 MOV R3,#0 MOV R4,#0 LABLE EQU #0X2300000 MOV LABLE,#300 LKM ADD R3,R3,#2 ADD R4,R4,R3 ADD R5,R5,#1 CMP R5,#LABLE BLNE LKM END 或 AREA Example,CODE,READONLY ENTRY ;程序入口处 CODE32 ;ARM 代码 START MO

26、V R0,#0 ;设定寄存器R0,R1,R2的值为0 MOV R1,#0 ;其中RO代表每次加的值 MOV R2,#0 ;R1代表每次计算的结果 cs EQU 100 ;设定累加次数为100 LJ ADD R0,R0,#2 ;R0=R0+2 ADD R1,R1,R0 ;R1=R1+R0 ADD R2,R2,#1 ;R2=R2+1 CMP R2,#cs ;比较R2和cs的值,达到一百时停止程序,否则跳转到LJ继续执行 BLNE LJ END 或 MOV R0,#0 LDR R1,=2N MOV R2,#0 LOOP ADD R0,R0,#2 ADD R2,R2,R0 CMP R1,R0 BNE

27、LOOP 第五章 1、简述S3C44B0X最小系统应包含哪些部分? (书P130) 答:一个最小嵌入式系统包括如下部分:供电系统(电源)、时钟系统、调试测试接口、复位电路和存储器系统及嵌入式控制器。 2、S3C44B0X可使用的外部晶振频率范围是多少?(使用/不使用PLL功能时) 答:20MHZ66MHZ 若不使用PLL功能,则晶振频率范围为20-66MHz都能工作,在使用PLL或ISP功能的时候,则须为30-55MHz才能工作,太低或太高都不能工作。 3、设一个基于S3C44B0X的系统使用的晶振为11.0592MHZ石英晶振,请计算出最大的系统时钟频率为多少MHZ?此时PLL的M值和P值为多少? 答:锁相环输出Fpllo与锁相环输入Fin的关系 S3C44B0X的PLL模块的输出时钟频率Fpllo和输入参考时钟频率Fin的关系由下式决定: Fpllo=(m x Fin)/(p x 2s) m=M+8,也就是分频器M的分配值+8 p=P+2,也就是分频器P的分频值+2 规定:Fpllo大于20MHz

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论