为什么 ARM 中有 2 个寄存器用于 enabling/disabling 中断而不是 1 个?

Why are there 2 registers in ARM for enabling/disabling interrupts instead of 1?

最近有人问我这个问题。我正在研究ARM架构,我也尝试研究过,但感觉没有得到正确的答案。

我的想法是,关键原因是为了避免打乱正在进行的中断,我们使用设置启用寄存器来启用所有中断,并使用清除启用寄存器来禁用所有中断。

这是正确的原因吗?背后有更深层次的解释吗?是否有解释此设计决策的文档?

编辑:抱歉,我正在使用的芯片是 Cortex M4

虽然我不能说出最初设计中的想法,但我的观察是这更容易确保线程安全。

假设只有一个寄存器可用于启用和禁用中断;在寄存器中设置一个位将启用相应的中断,而清除该位将禁用它。

这将是一个读取-修改-写入操作,容易发生 race conditions 除非软件仔细防范它(例如,通过在访问之前禁用 所有 中断寄存器,或使用同步原语)。

将此与单独的 set/clear 寄存器进行对比,后者根本不需要软件同步。任何线程都可以在不干扰其他线程的情况下设置或清除各个位。

单独的 set/clear 寄存器也常用于例如GPIO,允许多个线程自由修改I/O状态。