嵌入式 > 嵌入式开发 > 详情

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

发布时间:2024-06-20 发布时间:
|
引言

在前面的文章中提到过,很多情况下应用程序需要在ARM跟Thumb状态之间相互切换,这部分就讨论交互工作的实现方法和一些注意问题。

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指令实现状态切换。




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

图 2 中是一段直接进行状态切换的例程:



下面是一段直接进行状态切换的例程。
;从ARM状态开始
CODE32 ;汇编关键字
ADR R0, Into_Thumb+1 ;得到目标地址,末位置1, ;转向Thumb
BX R0 ;执行 ? ;其它代码
CODE16 ;汇编关键字
Into_Thumb ;Thumb代码段起始地址
… ;Thumb代码
ADR R5, Back_to_ARM ;得到目标地址,末位缺 ;省为0,转向ARM
BX R5 ;执行
… ;其它代码
CODE32 ;汇编关键字
Back_to_ARM ;ARM代码段起始地址

我们知道,在ARM的状态寄存器CPSR 中,bit-5是状态控制位T-bit,决定当前处理器的运行状态。如果直接修改CPSR的状态位,也能够达到改变处理器运行状态的目的。但是这样会带来一个问题,因为ARM采用多级流水线的结构,所以在程序执行过程中,指令流水线上会存在几条预取指令(具体数目视流水线级数而不同)。当修改CPSR的 T-bit后,状态的转变会造成流水线上预取指令的执行错误。而如果用BX指令,则执行后会进行流水线的刷新动作,清除流水线上的残余指令,在新的状态下重新开始指令预取,从而保证状态转变时指令流的正确衔接。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
我拆解了一款过气的电视盒子.想为国产芯片再鼓把劲