ARM和嵌入式技术培训_第1页
ARM和嵌入式技术培训_第2页
ARM和嵌入式技术培训_第3页
ARM和嵌入式技术培训_第4页
ARM和嵌入式技术培训_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

会计学1ARM和嵌入式技术培训6.1交互工作原理T版本的ARM体系结构支持ARM程序和THUMB程序混合编程,所谓交互工作就是程序执行过程中,可以根据需要进行ARM状态和THUMB状态的切换。交互工作的必要性

为一个Thumb兼容的ARM处理器编写代码时,ARM指令的程序和THUMB指令的程序各有自己的优势,对于8位和16位的存储系统来说,Thumb指令可以提供更好的代码密度和性能,对于32位的存储系统来说,ARM指令则占有速度和性能上的优势。除此之外,在许多场合,也使得arm和thumb之间的切换变得必要。例如:第1页/共23页6.1交互工作原理(1)速度:某些强调速度的场合下,应考虑在系统中包含一个32位的存储器,从而利用arm代码提供更好的性能,满足设计要求。(2)功能:Thumb指令没有ARM灵活,另外某些操作,例如直接读取PSR的值、使无效或有效中断以及改变工作模式、对协处理器的操作等等,只能通过ARM指令实现。(3)异常处理:当进入异常中断处理程序时,处理器会自动进入ARM状态,这就意味着异常处理程序的起始部分必须用ARM指令编写,若中断处理程序需要Thumb指令来完成,则需要在中断处理程序中切换到Thumb指令状态,在处理结束时,还必须切换回ARM状态来完成程序的返回。(4)单独的Thumb程序:Thumb兼容的ARM处理器总是从ARM状态开始执行指令的,因此即使对于简单的Thumb汇编语言程序,也必须在程序的开头添加一个ARM指令的程序头,使其从ARM状态切换到Thumb状态执行。第2页/共23页6.1交互工作原理交互工作的切换指令使用分支跳转指令BX即可完成处理器Thumb状态和ARM状态的切换。语法格式如下:Thumb状态下的切换指令: BXRnARM状态下的切换指令: BX{<cond>}Rn其中,Rn可以为R0~R15中的任何一个寄存器,其值为分支地址。由于ARM指令都是字对齐的,在执行过程中,地址的最低两位忽略。Thumb指令是半字对齐的,在执行过程中,地址的最低位忽略。因此,可以根据BX指令分支到的地址的最低位确定处理器的状态是ARM状态还是Thumb状态:当最低位为0时,表示切换到ARM状态;为1时,表示切换到Thumb状态。Cond为条件码,只有ARM状态下的BX指令才允许条件执行。第3页/共23页6.1交互工作原理交互工作的切换指令

ARM/Thumb之间的状态切换是通过一条专用的转移交换指令BX来实现的.BXRn当前状态是Thumb时BX{cond}Rn当前状态是ARM时Rn310ARM/Thumb选择位0----ARM1-----ThumbPCBX第4页/共23页6.1交互工作原理交互工作的切换指令绝对地址在4GB空间内的Thumb或ARM程序都可以通过这条指令完成跳转和状态的切换。注意:当不需要状态切换时也可以使用BX作为分支指令,尤其是当B和BL指令不能使用的情况下,因为BX指令可以寻址32位的存储空间,而B和BL指令则有如下限制:•ARM状态下,B和BL指令的寻址空间为32MB;•Thumb状态下,无条件B和BL指令的寻址空间为4MB;•Thumb状态下,有条件B指令的寻址空间为-128到+127个指令。第5页/共23页6.1交互工作原理

与状态切换有关的伪指令

与状态切换有关的伪指令的有下面两条。指令形式: CODE16 CODE32注意:CODE16和CODE32只是告知汇编器后面指令的形式是Thumb指令还是ARM指令,本身并不能进行程序状态的切换。当T版本的ARM处理器程序通过BX指令切换到Thumb状态时,同时需要在Thumb指令编写的代码段前用CODE16伪指令告知汇编器处理的是Thumb代码。由此可知,ARM和Thumb间的交互工作必须:(1)通过BX指令切换处理器的状态;(2)通过伪指令CODE32和CODE16指示汇编器根据处理器的状态生成合适的代码。第6页/共23页6.2交互程序

下例为一个从ARM代码段跳转到Thumb代码段,又回到ARM代码段的简单的交互程序设计的示例.CODE32 ;指示下面的指令为ARM指令

ADRR0,Into_thumb+1 ;产生目标地址,并且设置目标地址的状;态为Thumb状态

BXR0 ... CODE16 ;指示下面的指令为Thumb指令Into_thumb ... ADRR5,Back_to_arm ;产生目标地址,并且设置目标地址的状;态为ARM状态

BXR5 ... CODE32 ;指示下面的指令为ARM指令Back_to_arm第7页/共23页6.2交互程序

ARM指令头的例子

由于ARM处理器及汇编器总是从ARM状态开始执行和汇编指令的,因此对于单独的Thumb指令程序也必须添加一个ARM指令头。ARM指令的程序头主要完成如下两步操作:(1)通过ADR指令装载分支地址,并且设置地址最低位为1;(2)通过BX指令完成分支跳转并切换到Thumb状态。第8页/共23页AREAThumbSub,CODE,READONLY ;定义一个代码段

ENTRY ;程序入口

CODE32 ;下面的指令为arm指令headerADRR0,start+1 ;处理器处于ARM状态

BXR0 ;ARM指令头后,调用Thumb主程序

CODE16 ;下面指令为Thumb指令startMOVR0,#10 ;设置参数

MOVR1,#3BLdoadd ;调用子程序stopMOVR0,#0x18 ;执行中止

LDRR1,=0x20026 SWI0xab doaddADDR0,R0,R1 ;子程序代码

MOVPC,LR ;子程序返回

END ;程序结束程序主体以CODE16伪指令开始,通过ARM指令头中start+1,将分支目标地址的最低位置为1,然后通过BX指令切换处理器状态,start处的指令为Thumb指令。第9页/共23页6.2交互程序

交互子程序调用执行一个简单的汇编语言程序的调用,通常需要做两个工作:(1)存储返回地址到连接寄存器;(2)分支跳转到被调用的子程序。

对于非交互的子程序调用,可以通过一条BL指令完成。交互工作的子程序调用则应使用BX指令,跳转的同时进行状态切换,同时注意返回时需要将状态切换回来。与BL指令不同,BX指令不能将返回地址存入连接寄存器中,因此在使用BX指令之前,必须先将返回地址写入连接寄存器。如果调用是从Thumb状态到ARM状态,还必须将连接寄存器的最低位置1,以保证从调用程序返回时工作在Thumb状态下。第10页/共23页6.2交互程序

从ARM状态调用Thumb子程序

当执行ARM到Thumb的调用时,由于返回时的状态为ARM状态,所以不需要设置连接寄存器的最低位,因此可以简单的在BX指令前通过MOVlr,pc保存返回地址。第11页/共23页AREAThumbAdd,CODE,READONLY ;定义一个代码段ENTRYstartMOVr0,#2 ;寄存器赋值

MOVr1,#3ADRr4,ThumbSub+1 ;生成分支地址并置最低位为1MOVlr,pc ;存储返回地址

BXr4 ;分支并切换到ThumbSubStopMOVr0,#0x18 LDRr1,=0x20026 SWI0x123456 CODE16 ;后面代码为Thumb代码ThumbSubADDr0,r0,r1 ;r0=r0+r1BXLR ;返回到ARM调用程序

END

第12页/共23页6.2交互程序

从Thumb状态调用ARM子程序

最简单的执行Thumb到ARM程序调用的方法是采用一个间接调用的方式,先通过BL调用一个Thumb代码段,此段完成BX分支并切换的工作。这样,在BX指令执行之前,BL就把返回地址装入连接寄存器中了,另外Thumb下的BL指令同时保证了返回地址的最低位为1。这样当执行BXlr指令时,就可以正确地返回并进行状态切换。如果始终使用同一个寄存器存储ARM子程序的地址,则此间接调用的代码段可以通用. 第13页/共23页AREAArmAdd,CODE,READONLY;定义一个代码段ENTRY ;程序入口,汇编器处于ARM模式start ;ARM指令头

ADRR2,ThumbProg+1 BXR2 CODE16 ;下面指令为Thumb指令ThumbProgMOVR0,#2 ;寄存器赋值

MOVR1,#3ADRR4,ARMSubroutine;分支目的地址放入R4中,且bit0为0BL__call_via_R4 ;间接调用的代码段,保存返回地址到

;LR寄存器,且目的地址的最低位为1Stop ;执行中止

MOVr0,#0x18 LDRr1,=0x20026 SWI0xAB __call_via_R4 ;Thumb代码段

BXR4 ;分支并切换

CODE32 ;下面指令为ARM指令ARMSubroutineADDR0,R0,R1 ;R0=R0+r1BXLR ;返回到Thumb调用程序处

;LR的bit0已经被Thumb状态下的BL指令置为1了END 第14页/共23页6.2交互程序

Thumb代码段中的数据

在Thumb代码段中定义数据时必须使用DATA伪指令,原因如下:当连接器定位Thumb指令程序中的标号时,它会假设标号为Thumb代码段的地址,因此会将标号的最低位置1,这样当使用BX指令进行程序调用时,处理器就会切换到Thumb状态,并寻址到正确的地址,但连接器区分不了数据和指令,若标号为数据区标号,连接器就会错误的将标号处的数据加1。DATA伪指令就是告知连接器此标号为数据标号,此时连接器不会将其增1。例如:Thumb_DataDATADCB1,3,4,...注意:DATA伪指令必须和标号位于同一行内。第15页/共23页6.3ARMv5T扩展ARM的体系结构大致可以分为5个主要的版本:ARMv1T、ARMv2T、ARMv3T、ARMv4T、ARMv5T.前面介绍的ARM7TDMI-S处理器内核使用的是ARMv4T版本.ARMv5T版本的ARM体系结构中增加了额外的对交互工作的支持,除BX指令外,增加了BLX指令,另外LDR,LDM及POP指令也可以进行程序状态的切换.BLX指令指令形式:BLXRn;只能从ARM状态切换到Thumb状态,通过Rn的最低位决定目标地址的状态.与BX相比,BLX指令在进行跳转和状态切换的同时,还将PC寄存器的内容复制到了LR寄存器中.第16页/共23页6.3ARMv5T扩展ARM的体系结构大致可以分为5个主要的版本:ARMv1T、ARMv2T、ARMv3T、ARMv4T、ARMv5T.前面介绍的ARM7TDMI-S处理器内核使用的是ARMv4T版本.ARMv5T版本的ARM体系结构中增加了额外的对交互工作的支持,除BX指令外,增加了BLX指令,另外LDR,LDM及POP指令也可以进行程序状态的切换.2.LDR,LDM,POP通过LDR,LDM及POP指令向PC寄存器赋值,完成程序的跳转,同时寄存器CPSR中的Thumb位被设置成PC寄存器的最低位bit0,由此决定目标地址处程序的状态.第17页/共23页6.4

交互子程序和Veneer

前面介绍的交互工作中,调用者程序和被调用程序均在一个源程序中,如若两种状态下的程序位于不同的文件中,能否进行交互工作呢?答案是肯定的,只要程序编写过程中遵守ARM和Thumb过程调用标准ATPCS(ARMandThumbProccdureCallStandards),程序间就可以进行交互工作.此时需要设置相应的编译选项,使编译器按照ATPCS规则编译程序,ARM连接器在检测到ARM和Thumb混和编程的时候,会自动产生并插入一个称为伪装(veneer)的小代码段,用来根据程序需要完成ARM-Thumb状态的切换。

第18页/共23页6.4

交互子程序和Veneer交互编译选项这个编译选项就是-apcs/interwork。通过使用-apcs/interwork编译项,可以强制在子程序返回时使用BXLR指令而非MOVPC,LR指令。例:两个处于不同状态的汇编程序间的交互工作。arm.s源文件:

AREAARM,CODE,READONLY IMPORTTHUMBSub ENTRY CODE32ARMPROG MOVR0,#1 BLTHUMBSub ADDR1,R1,R0 ENDthumb.s源文件:

AREATHUMB,CODE,READONLY EXPORTTHUMBSub ENTRY CODE16THUMBSub MOVR1,#2 BXLR END第19页/共23页6.4

交互子程序和Veneer我们可以通过下面的操作完成两文件间的交互工作:armasmarm.sarmasmthumb.s–apcs/interworkarmlinkarm.othumb.o通常在编译程序时,我们应尽量选用-apcs/interwork选项。-apcs/interwork编译器选项可以保证所有的ARM和Thumb、C或C++编译器编译的模块能够在各种处理器状态间相互调用:tcc-apcs/interworkarmcc-apcs/interworktcpp-apcs/interworkarmcpp-apcs/interwork在interwork选项下编译的代码模块会比原Thumb或ARM代码模块大一些,例如对Thumb程序,典型的会增加约2%的容量。因此没有必要对所有的程序进行交互编译,只对那些包含交互子程序调用的程序进行交互编译即可。第20页/共23页6.4

交互子程序和Ve

温馨提示

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

评论

0/150

提交评论