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

tan*_*grs 6 arm

这个问题简短而甜蜜.

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

mov r0, r1
                 < interrupt can happen here
ldm r0, {r1-r4}  < can an interrupt happen **during** a load multiple instruction?
Run Code Online (Sandbox Code Playgroud)

Jac*_*ues 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.