2009-10-12 55 views
4

当发生异常时,ARM控制器为什么应该从THUMB状态返回到ARM状态?在ARM/THUMB状态之间切换

+0

这取决于您拥有哪个CPU,因为有两个拇指指令集。原始的拇指指令集(用于armv4t,armv5te)缺乏指令来处理中断; ....你知道armv4t或armv5te缺乏处理中断的指令吗? 感谢您的回复。 – 2010-05-04 08:49:50

回答

6

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

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

在另一方面,this page说,这约在Cortex-M3 ARM实现的中断向量:

的LSB的每个异常矢量指示该异常是否是 拇指状态下执行。

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

+0

关于LSB的事情基本上是正确的。如果LSB清零,则分支以ARM模式结束;如果设置了分支,则分支结束。这也是Thumb函数指针看起来“不一致”的原因。我应该知道 - 今天我在IDA度过了美好时光。 – Kawa 2009-10-12 17:30:32

+0

只有在启用互通的情况下才会如此;注意你没有正确设置编译器标志的错误! – 2009-10-12 23:13:11

+0

Cortex M3只有Thumb2模式,ARM模式在那里不可用。异常模型与传统的ARM模型非常不同。 – 2011-09-22 17:39:27

2

也许是因为中断向量表是一个真正的ARM指令和处理它需要在ARM模式之中。这样可以减少程序员的工作,因为您不必编写两个处理程序,一个用于手臂模式,另一个用于拇指模式。你怎么知道有一个异常入口点,你只能有一个指令类型来处理它。一旦进入与拇指模式切换不同的重置异常,您当然可以切换到拇指模式。

皮质-M3已经重新定义的中断向量表是更传统的(一个地址,而不是一个指令)。根据需要,我会假设,cortex-m3是一个仅适用于处理器的处理器,因此要么重新定义向量表以保存拇指指令,要么重新定义地址表,或者它们只有足够的臂芯处理通常在向量表条目中看到的加载或跳转。

基本上你要么需要每个例外两个项目,一个是基于ARM处理器和一个用于基于拇指处理,或者需要用户编写自己的处理程序与入口点是一个模式明确。

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

1

这取决于您拥有哪个CPU,因为有两个拇指指令集。原始的拇指指令集(用于armv4t,armv5te)缺乏指令来处理中断;较新的thumb2集(在cortex系列中)有额外的指令,因此您可以保持在thumb2模式以维护中断程序。

0

传统ARM系统启动进入ARM模式并在复位后跳转到复位异常向量。这意味着所有异常向量都必须用ARM程序集编写。如果您的异常是ARM指令,那么在异常处理之前,CPU必须将其模式更改为ARM模式;如果这没有发生,它将导致一个未定义的异常,这将导致另一个等等,并在一个无限循环。

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