ARM中断能在mid指令中发生吗?

ARM中断能在mid指令中发生吗?,arm,Arm,这个问题将简短而甜蜜 我知道指令可以发生在指令之间,但指令执行期间会发生中断吗?在将所有值加载到寄存器之前,是否可以中断加载多个指令 mov r0, r1 < interrupt can happen here ldm r0, {r1-r4} < can an interrupt happen **during** a load multiple instruction? mov r0,r1

这个问题将简短而甜蜜

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

mov r0, r1
                 < interrupt can happen here
ldm r0, {r1-r4}  < can an interrupt happen **during** a load multiple instruction?
mov r0,r1
<这里可能发生中断
ldm r0,{r1-r4}<在**加载多条指令期间**是否会发生中断**?

加载多条指令显然不是原子指令。请参阅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节)。它的实现定义了指令是从加载/存储列表的开头重新启动,还是从停止的地方重新启动。正如手臂所说:

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

换句话说,如果您试图编写可移植代码,不要依赖LDM或STM是原子的。

此外,在v5(可能在所有>=v4?)上,实现定义了带基寄存器写回的指令是否在数据中止时已更新基寄存器。