ARM中断是否可以在中指令中发生?

时间:2012-03-25 03:41:02

标签: arm

这个问题简短而又甜蜜。

我知道在指令之间可能会发生指令,但在指令期间是否会发生中断?加载多条指令在将所有值加载到寄存器之前是否可以中断?

mov r0, r1
                 < interrupt can happen here
ldm r0, {r1-r4}  < can an interrupt happen **during** a load multiple instruction?

1 个答案:

答案 0 :(得分:7)

加载多个指令显然不是原子的。请参见ARM V7C架构参考手册的A3.5.3节。

  

LDM,LDC,LDC2,LDRD,STM,STC,STC2,STRD,PUSH,POP,RFE,SRS,VLDM,   VLDR,VSTM和VSTR指令按顺序执行   单词对齐的单词访问。保证每个32位字访问   是单拷贝原子。该体系结构不需要子序列   从序列中进行两次或多次单词访问是单拷贝的   原子。

如果您继续阅读,您将发现LDM / STM指令可以被中断中止(并在中断返回时从头开始重新启动)。 LDM和STM指令总是可以被数据中止中断,因此它们在这个意义上是非原子的。否则,ARMv7-A架构会尽力帮助您。对于中断,只有在启用低中断延迟时才会中断它们,并且正在访问正常内存。所以至少,你不会重复访问设备内存。您不希望做任何需要正常内存的原子读/写的事情。

在v7-M上,LDM和STM可以随时中断(参见“ARMv7-M体系结构参考手册”的B1.5.10节)。它的实现定义了指令是从加载/存储列表的开头重新启动,还是从它停止的位置重新启动。正如ARM所说:

  

ARMv7-M架构支持继续或重新启动   一开始,废弃的LDM或STM指令如下所述。   放弃并重新启动LDM或STM的地方(ICI位不是   支持),指令不应与易失性存储器一起使用。

换句话说,如果您正在尝试编写可移植代码,请不要依赖LDM或STM。