ARM与THumb基于ARM的嵌入式系统程序开发要点(五)

本文详细介绍了在嵌入式系统中,由于Thumb指令集的特定优势,ARM与Thumb指令集之间的交互不可避免。文章讨论了状态切换的实现,包括通过BX指令的使用以及状态寄存器CPSR的T-bit管理。此外,还阐述了在不同状态间函数调用的处理,包括BL和BX指令的应用。最后提到了V5架构的扩展和Thumb-2指令集,它们旨在优化代码长度和性能,并简化开发过程。

1  需要交互的原因

  前面提到过,Thumb指令在某些特殊情况下具有比ARM指令更为出色的表现,主要是在代码长度和窄带宽存储器系统性能两方面。正是因为Thumb指令在特定环境下的优势,它在很多方面得到了广泛应用。但是因为下面一些原因,Thumb又不可能独立地组成一个应用系统。

  ◇ Thumb指令集在功能上只是ARM指令集的一个子 集,某些功能只能在ARM状态下执行,如CPSR和 协处理器的访问。
  ◇ 进行异常响应时,处理器会自动进入ARM状态。
  ◇ 从系统优化考虑,在宽带存储器上不应该放置 Thumb代码,很多窄带系统具有宽带的内部存储器。
  ◇ 即使是一个单纯的Thumb应用系统,也必须加一 个汇编的交互头程序,因为系统总是自动从ARM 开始启动。

  所以,不可避免地会产生ARM与Thumb之间交互的问题。

2  状态切换的实现

  处理器在ARM/Thumb之间的状态切换是通过一条专用的跳转交换指令BX来实现的。BX指令以通用寄存器(R0~R15)为操作数,通过拷贝Rn到PC来实现4GB空间范围内的一个绝对跳转。BX利用Rn寄存器中存储的目标地址值的最后一位来判断跳转后的状态。如图1所示,是用BX指令实现状态切换。

图1  BX指令实现状态切换

  无论ARM还是Thumb,其指令存储在存储器中都是边界对齐的(4字节或2字节对齐)。因此,在执行跳转过程中,PC寄存器中的最低位肯定被舍弃,不起作用。在BX指令的执行过程中,最低位正好被用作状态判断的标识,不会造成存储器访问不对齐的错误。

  下面是一段直接进行状态切换的例程。

;从ARM状态开始
  CODE32 ;汇编关键字
  ADR R0, Into_Thumb+1 ;得到目标地址,末位置1, ;转向Thumb
  BX R0 ;执行 ? ;其它代码
  CODE16 ;汇编关键字
Into_Thumb ;Thumb代码段起始地址
  … ;Thumb代码
  A

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值