这个问题简短而又甜蜜。
我知道在指令之间可能会发生指令,但在指令期间是否会发生中断?加载多条指令在将所有值加载到寄存器之前是否可以中断?
mov r0, r1
< interrupt can happen here
ldm r0, {r1-r4} < can an interrupt happen **during** a load multiple instruction?
答案 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。