在ARM / THUMB状态之间切换

时间:2009-10-12 13:13:01

标签: arm

为什么ARM控制器会在发生异常时从THUMB状态返回到ARM状态?

4 个答案:

答案 0 :(得分:6)

一种解释可能是ARM模式是CPU的“本机”操作模式,并且在该模式下可以比在有限的Thumb模式下执行更多操作。据我所知,Thumb模式针对代码大小进行了优化,这可能意味着它缺少在异常处理中可能需要的某些指令。

This page提到异常处理总是在ARM模式下完成。它没有提供任何理由,所以也许它只是它的设计方式。它确实讨论了从异常处理退出到正确(ARM或Thumb)模式的方法,因此只要您不自己编写异常处理程序,您就可以忽略此问题。当然,这假设您的系统设置了一个“默认”异常处理程序,它确实保留了执行模式。

另一方面,this page说明了这一点,关于Cortex-M3 ARM实现的中断向量:

  

每个异常向量的LSB指示异常是否为   在Thumb状态下执行。

所以它似乎并不普遍,也许你可以在Thumb模式下运行你的特殊异常。

答案 1 :(得分:2)

也许是因为中断向量表实际上是ARM指令并且处理它需要处于ARM模式。这减少了程序员的工作量,因为您不必为臂模式编写两个处理程序,而为拇指模式编写一个处理程序。你怎么知道异常有一个入口点,你只能有一种指令类型来处理它。输入后,您可以切换到拇指模式,与重置异常后切换到拇指模式无关。

cortex-m3重新定义了中断向量表更传统(地址而不是指令)。根据我的需要,我认为,cortex-m3只是一个拇指(2)处理器,所以要么他们重新定义向量表以保持拇指指令,要么他们用地址重新定义表,或者他们只有足够的臂核心处理通常在向量表条目中看到的加载或跳转。

基本上,每个异常需要两个条目,一个用于基于arm的处理程序,一个用于基于拇指的处理程序,或者您需要用户使用一个特定模式的入口点编写其处理程序。

即使将一个模式入口点放入处理程序,您仍然必须知道处理器在发生异常时所处的模式,以了解要返回的地址以及如何检查导致异常的相关指令

答案 2 :(得分:1)

这取决于你有哪个CPU,因为有两个拇指指令集。原始的拇指指令集(在armv4t,armv5te中使用)缺少能够处理中断的指令;较新的thumb2套装(在皮质系列中)有额外的指令,所以你可以保持在thumb2模式下为中断程序服务。

答案 3 :(得分:0)

传统的ARM系统启动进入ARM模式,并在复位后跳转到重置异常向量。这意味着必须在ARM程序集中编写所有异常向量。如果您的例外情况是ARM指令,则自然会强制CPU在异常处理之前将其模式更改为ARM模式;如果没有发生这种情况,将导致一个未定义的异常,这将导致另一个异常,依此类推,无限循环。

初始ARM系统只有ARM指令,后来添加了THUMB指令;这可能是另一种解释。