欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

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

    • 资源ID:6501664       资源大小:321.99KB        全文页数:23页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    第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)速度:某些强调速度的场合下,应考虑在系统中包含一个32位的存储器,从而利用arm代码提供更好的性能,满足设计要求。,(2)功能:Thumb指令没有ARM灵活,另外某些操作,例如直接读取PSR的值、使无效或有效中断以及改变工作模式、对协处理器的操作等等,只能通过ARM指令实现。,(3)异常处理:当进入异常中断处理程序时,处理器会自动进入ARM状态,这就意味着异常处理程序的起始部分必须用ARM指令编写,若中断处理程序需要Thumb指令来完成,则需要在中断处理程序中切换到Thumb指令状态,在处理结束时,还必须切换回ARM状态来完成程序的返回。,(4)单独的Thumb程序:Thumb兼容的ARM处理器总是从ARM状态开始执行指令的,因此即使对于简单的Thumb汇编语言程序,也必须在程序的开头添加一个ARM指令的程序头,使其从ARM状态切换到Thumb状态执行。,6.1 交互工作原理,交互工作的切换指令,使用分支跳转指令BX即可完成处理器Thumb状态和ARM状态的切换。语法格式如下:Thumb状态下的切换指令:BX RnARM状态下的切换指令:BX Rn其中,Rn可以为R0R15中的任何一个寄存器,其值为分支地址。由于ARM指令都是字对齐的,在执行过程中,地址的最低两位忽略。Thumb指令是半字对齐的,在执行过程中,地址的最低位忽略。因此,可以根据BX指令分支到的地址的最低位确定处理器的状态是ARM状态还是Thumb状态:当最低位为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指令不能使用的情况下,因为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指令编写的代码段前用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;产生目标地址,并且设置目标地址的状;态为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,start+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 交互程序,交互子程序调用,执行一个简单的汇编语言程序的调用,通常需要做两个工作:(1)存储返回地址到连接寄存器;(2)分支跳转到被调用的子程序。,对于非交互的子程序调用,可以通过一条BL指令完成。交互工作的子程序调用则应使用BX指令,跳转的同时进行状态切换,同时注意返回时需要将状态切换回来。与BL指令不同,BX指令不能将返回地址存入连接寄存器中,因此在使用BX指令之前,必须先将返回地址写入连接寄存器。如果调用是从Thumb状态到ARM状态,还必须将连接寄存器的最低位置1,以保证从调用程序返回时工作在Thumb状态下。,6.2 交互程序,从ARM状态调用Thumb子程序,当执行ARM到Thumb的调用时,由于返回时的状态为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;r0r0r1 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模式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指令ARMSubroutine 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。例如: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相比,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寄存器的最低位bit0,由此决定目标地址处程序的状态.,6.4 交互子程序和Veneer,前面介绍的交互工作中,调用者程序和被调用程序均在一个源程序中,如若两种状态下的程序位于不同的文件中,能否进行交互工作呢?答案是肯定的,只要程序编写过程中遵守ARM和Thumb过程调用标准ATPCS(ARM and Thumb Proccdure Call Standards),程序间就可以进行交互工作.此时需要设置相应的编译选项,使编译器按照ATPCS规则编译程序,ARM连接器在检测到ARM和Thumb混和编程的时候,会自动产生并插入一个称为伪装(veneer)的小代码段,用来根据程序需要完成ARM-Thumb状态的切换。,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 CODE16THUMBSub 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/interwork在interwork选项下编译的代码模块会比原Thumb或ARM代码模块大一些,例如对Thumb程序,典型的会增加约2%的容量。因此没有必要对所有的程序进行交互编译,只对那些包含交互子程序调用的程序进行交互编译即可。,6.4 交互子程序和Veneer,Veneer 所谓Veneer是由连接器自动生成并插入到汇编程序的一小段代码。通常在下面两种情况下,连接器会生成Veneer:(1)被调用程序包含状态切换;(2)被调用程序的地址超出了调用指令的寻址范围。连接时,连接器先找到veneer,再连接需调用的程序。根据被调用程序的状态,以及其与调用者间距离的远近,Veneer包含三种状态:长、短以及内嵌。由此可见,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”即可。,

    注意事项

    本文(ARM与嵌入式技术培训课件第6章.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开