ARM与嵌入式技术培训课件第6章.ppt

上传人:小飞机 文档编号:6501664 上传时间:2023-11-07 格式:PPT 页数:23 大小:321.99KB
返回 下载 相关 举报
ARM与嵌入式技术培训课件第6章.ppt_第1页
第1页 / 共23页
ARM与嵌入式技术培训课件第6章.ppt_第2页
第2页 / 共23页
ARM与嵌入式技术培训课件第6章.ppt_第3页
第3页 / 共23页
ARM与嵌入式技术培训课件第6章.ppt_第4页
第4页 / 共23页
ARM与嵌入式技术培训课件第6章.ppt_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《ARM与嵌入式技术培训课件第6章.ppt》由会员分享,可在线阅读,更多相关《ARM与嵌入式技术培训课件第6章.ppt(23页珍藏版)》请在三一办公上搜索。

1、第6章 ARM-Thumb交互工作,6.1 交互工作原理,T版本的ARM体系结构支持ARM程序和THUMB程序混合编程,所谓交互工作就是程序执行过程中,可以根据需要进行ARM状态和THUMB状态的切换。交互工作的必要性 为一个Thumb兼容的ARM处理器编写代码时,ARM指令的程序和THUMB指令的程序各有自己的优势,对于8位和16位的存储系统来说,Thumb指令可以提供更好的代码密度和性能,对于32位的存储系统来说,ARM指令则占有速度和性能上的优势。除此之外,在许多场合,也使得arm和thumb之间的切换变得必要。例如:,6.1 交互工作原理,(1)速度:某些强调速度的场合下,应考虑在系统

2、中包含一个32位的存储器,从而利用arm代码提供更好的性能,满足设计要求。,(2)功能:Thumb指令没有ARM灵活,另外某些操作,例如直接读取PSR的值、使无效或有效中断以及改变工作模式、对协处理器的操作等等,只能通过ARM指令实现。,(3)异常处理:当进入异常中断处理程序时,处理器会自动进入ARM状态,这就意味着异常处理程序的起始部分必须用ARM指令编写,若中断处理程序需要Thumb指令来完成,则需要在中断处理程序中切换到Thumb指令状态,在处理结束时,还必须切换回ARM状态来完成程序的返回。,(4)单独的Thumb程序:Thumb兼容的ARM处理器总是从ARM状态开始执行指令的,因此即

3、使对于简单的Thumb汇编语言程序,也必须在程序的开头添加一个ARM指令的程序头,使其从ARM状态切换到Thumb状态执行。,6.1 交互工作原理,交互工作的切换指令,使用分支跳转指令BX即可完成处理器Thumb状态和ARM状态的切换。语法格式如下:Thumb状态下的切换指令:BX RnARM状态下的切换指令:BX Rn其中,Rn可以为R0R15中的任何一个寄存器,其值为分支地址。由于ARM指令都是字对齐的,在执行过程中,地址的最低两位忽略。Thumb指令是半字对齐的,在执行过程中,地址的最低位忽略。因此,可以根据BX指令分支到的地址的最低位确定处理器的状态是ARM状态还是Thumb状态:当最

4、低位为0时,表示切换到ARM状态;为1时,表示切换到Thumb状态。Cond为条件码,只有ARM状态下的BX指令才允许条件执行。,6.1 交互工作原理,交互工作的切换指令,ARM/Thumb之间的状态切换是通过一条专用的转移交换指令BX来实现的.,BX Rn,当前状态是Thumb时,BXcond Rn,当前状态是ARM时,Rn,31,0,ARM/Thumb选择位0-ARM1-Thumb,PC,BX,6.1 交互工作原理,交互工作的切换指令,绝对地址在4GB空间内的Thumb或ARM程序都可以通过这条指令完成跳转和状态的切换。注意:当不需要状态切换时也可以使用BX作为分支指令,尤其是当B和BL指

5、令不能使用的情况下,因为BX指令可以寻址32位的存储空间,而B和BL指令则有如下限制:ARM状态下,B和BL指令的寻址空间为32 MB;Thumb状态下,无条件B和BL指令的寻址空间为4 MB;Thumb状态下,有条件B指令的寻址空间为-128到+127个指令。,6.1 交互工作原理,与状态切换有关的伪指令,与状态切换有关的伪指令的有下面两条。指令形式:CODE16CODE32注意:CODE16和CODE32只是告知汇编器后面指令的形式是Thumb指令还是ARM指令,本身并不能进行程序状态的切换。当T版本的ARM处理器程序通过BX指令切换到Thumb状态时,同时需要在Thumb指令编写的代码段

6、前用CODE16伪指令告知汇编器处理的是Thumb代码。由此可知,ARM和Thumb间的交互工作必须:(1)通过BX指令切换处理器的状态;(2)通过伪指令CODE32和CODE16指示汇编器根据处理器的状态生成合适的代码。,6.2 交互程序,下例为一个从ARM代码段跳转到Thumb代码段,又回到ARM代码段的简单的交互程序设计的示例.,CODE 32;指示下面的指令为ARM指令 ADR R0,Into_thumb+1;产生目标地址,并且设置目标地址的状;态为Thumb状态BX R0.CODE 16;指示下面的指令为Thumb指令Into_thumb.ADR R5,Back_to_arm;产生目

7、标地址,并且设置目标地址的状;态为ARM状态BX R5.CODE 32;指示下面的指令为ARM指令Back_to_ arm,6.2 交互程序,ARM指令头的例子,由于ARM处理器及汇编器总是从ARM状态开始执行和汇编指令的,因此对于单独的Thumb指令程序也必须添加一个ARM指令头。ARM指令的程序头主要完成如下两步操作:(1)通过ADR指令装载分支地址,并且设置地址最低位为1;(2)通过BX指令完成分支跳转并切换到Thumb状态。,AREA ThumbSub,CODE,READONLY;定义一个代码段 ENTRY;程序入口 CODE32;下面的指令为arm指令header ADR R0,st

8、art+1;处理器处于ARM状态 BX R0;ARM指令头后,调用Thumb主程序 CODE16;下面指令为Thumb指令start MOV R0,#10;设置参数 MOV R1,#3 BL doadd;调用子程序stop MOV R0,#0 x18;执行中止 LDR R1,=0 x20026 SWI 0 xabdoadd ADD R0,R0,R1;子程序代码 MOV PC,LR;子程序返回 END;程序结束,程序主体以CODE16伪指令开始,通过ARM指令头中start+1,将分支目标地址的最低位置为1,然后通过BX指令切换处理器状态,start处的指令为Thumb指令。,6.2 交互程序,

9、交互子程序调用,执行一个简单的汇编语言程序的调用,通常需要做两个工作:(1)存储返回地址到连接寄存器;(2)分支跳转到被调用的子程序。,对于非交互的子程序调用,可以通过一条BL指令完成。交互工作的子程序调用则应使用BX指令,跳转的同时进行状态切换,同时注意返回时需要将状态切换回来。与BL指令不同,BX指令不能将返回地址存入连接寄存器中,因此在使用BX指令之前,必须先将返回地址写入连接寄存器。如果调用是从Thumb状态到ARM状态,还必须将连接寄存器的最低位置1,以保证从调用程序返回时工作在Thumb状态下。,6.2 交互程序,从ARM状态调用Thumb子程序,当执行ARM到Thumb的调用时,

10、由于返回时的状态为ARM状态,所以不需要设置连接寄存器的最低位,因此可以简单的在BX指令前通过MOV lr,pc保存返回地址。,AREA ThumbAdd,CODE,READONLY;定义一个代码段ENTRYstart MOV r0,#2;寄存器赋值 MOV r1,#3 ADR r4,ThumbSub+1;生成分支地址并置最低位为1 MOV lr,pc;存储返回地址 BX r4;分支并切换到ThumbSubStop MOV r0,#0 x18 LDR r1,=0 x20026 SWI 0 x123456 CODE16;后面代码为Thumb代码ThumbSub ADD r0,r0,r1;r0r0

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

12、模式start;ARM指令头 ADR R2,ThumbProg+1 BX R2 CODE16;下面指令为Thumb指令ThumbProg MOV R0,#2;寄存器赋值 MOV R1,#3 ADR R4,ARMSubroutine;分支目的地址放入R4中,且bit0为0 BL _call_via_R4;间接调用的代码段,保存返回地址到;LR寄存器,且目的地址的最低位为1Stop;执行中止 MOV r0,#0 x18 LDR r1,=0 x20026 SWI 0 xAB _call_via_R4;Thumb代码段 BX R4;分支并切换 CODE32;下面指令为ARM指令ARMSubroutin

13、e ADD R0,R0,R1;R0R0r1 BX LR;返回到Thumb调用程序处;LR的bit0已经被Thumb状态下的BL指令置为1了END,6.2 交互程序,Thumb代码段中的数据,在Thumb代码段中定义数据时必须使用DATA伪指令,原因如下:当连接器定位Thumb指令程序中的标号时,它会假设标号为Thumb代码段的地址,因此会将标号的最低位置1,这样当使用BX指令进行程序调用时,处理器就会切换到Thumb状态,并寻址到正确的地址,但连接器区分不了数据和指令,若标号为数据区标号,连接器就会错误的将标号处的数据加1。DATA伪指令就是告知连接器此标号为数据标号,此时连接器不会将其增1。

14、例如:Thumb_Data DATADCB 1,3,4,.注意:DATA伪指令必须和标号位于同一行内。,6.3 ARM v5T扩展,ARM的体系结构大致可以分为5个主要的版本:ARM v1T、ARM v2T、ARM v3T、ARM v4T、ARM v5T.前面介绍的ARM7TDMI-S处理器内核使用的是ARM v4T 版本.ARM v5T版本的ARM体系结构中增加了额外的对交互工作的支持,除BX指令外,增加了BLX指令,另外LDR,LDM及POP指令也可以进行程序状态的切换.,BLX指令指令形式:BLX Rn;只能从ARM状态切换到Thumb状态,通过Rn的最低位决定目标地址的状态.与BX相比

15、,BLX指令在进行跳转和状态切换的同时,还将PC寄存器的内容复制到了LR寄存器中.,6.3 ARM v5T扩展,ARM的体系结构大致可以分为5个主要的版本:ARM v1T、ARM v2T、ARM v3T、ARM v4T、ARM v5T.前面介绍的ARM7TDMI-S处理器内核使用的是ARM v4T 版本.ARM v5T版本的ARM体系结构中增加了额外的对交互工作的支持,除BX指令外,增加了BLX指令,另外LDR,LDM及POP指令也可以进行程序状态的切换.,2.LDR,LDM,POP通过LDR,LDM及POP指令向PC寄存器赋值,完成程序的跳转,同时寄存器CPSR中的Thumb位被设置成PC寄

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

17、mb状态的切换。,6.4 交互子程序和Veneer,交互编译选项这个编译选项就是-apcs/interwork。通过使用-apcs/interwork编译项,可以强制在子程序返回时使用BX LR指令而非MOV PC,LR指令。例:两个处于不同状态的汇编程序间的交互工作。,arm.s源文件:AREA ARM,CODE,READONLYIMPORT THUMBSubENTRYCODE32ARMPROGMOV R0,#1BL THUMBSubADD R1,R1,R0END,thumb.s源文件:AREA THUMB,CODE,READONLYEXPORT THUMBSubENTRY CODE16TH

18、UMBSub MOV R1,#2BX LREND,6.4 交互子程序和Veneer,我们可以通过下面的操作完成两文件间的交互工作:armasm arm.sarmasm thumb.s apcs/interworkarmlink arm.o thumb.o 通常在编译程序时,我们应尽量选用-apcs/interwork选项。-apcs/interwork编译器选项可以保证所有的ARM和Thumb、C或C+编译器编译的模块能够在各种处理器状态间相互调用:tcc-apcs/interworkarmcc-apcs/interworktcpp-apcs/interworkarmcpp-apcs/inte

19、rwork在interwork选项下编译的代码模块会比原Thumb或ARM代码模块大一些,例如对Thumb程序,典型的会增加约2%的容量。因此没有必要对所有的程序进行交互编译,只对那些包含交互子程序调用的程序进行交互编译即可。,6.4 交互子程序和Veneer,Veneer 所谓Veneer是由连接器自动生成并插入到汇编程序的一小段代码。通常在下面两种情况下,连接器会生成Veneer:(1)被调用程序包含状态切换;(2)被调用程序的地址超出了调用指令的寻址范围。连接时,连接器先找到veneer,再连接需调用的程序。根据被调用程序的状态,以及其与调用者间距离的远近,Veneer包含三种状态:长、

20、短以及内嵌。由此可见,Veneer的使用会增加代码的长度。如果调用者在距离相距不远的空间内多次调用相同的程序,则连接器会尽量使用相同的Veneer,而非生成新的Veneer,从而在一定程度上减小了代码量。为了使Veneer尽量的减少占用空间,我们可以采取以下两种措施:(1)尽量使关联的程序的存储空间靠近;(2)较少状态切换。,6.4 交互子程序和Veneer,利用Veneer,在满足下列规则的条件下,可以方便的进行C和C+以及汇编语言程序间的交互工作:1)调用者程序的编写可不考虑交互工作的问题,对于汇编语言编写的程序使用BL指令进行程序调用。2)若被调用程序为C语言程序,使用-apcs/interwork选项进行编译;若被调用程序为汇编语言程序,设置其INTERWORK属性并用BX lr返回。在Embest IDE集成开发环境中,对于交互工作的编译设置起来更为简单,只需根据情况,在属性设置界面的assembler对话框中选中“make the assembled code as supporting interworking”或在complier对话框中选中“ARM interworking”或“Thumb interworking”即可。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号