在Cortex M3上,一段代码如何判断中断是否使能,即Program Status Register中I
位的状态(由cpsid操作)
和 cpsie
)?在较旧的 ARM 上,我能够读取 cpsr
寄存器,但这似乎不再可能了。
我需要这些信息,因为我有一个函数,它同时从主函数和中断中调用,它需要以原子方式执行特定操作,同时禁用中断。本质上:
bool interrupts_enabled = InterruptsEnabled();
if (interrupts_enabled) {
__disable_irq();
}
Critical Code;
if (interrupts_enabled) {
__enable_irq();
}
此外,我想知道 I
标志在执行中断时的行为方式。中断的执行是否会设置 I
标志,以防止嵌套?默认情况下是否启用中断嵌套,如何防止嵌套?
最佳答案
M3 的异常架构有点不同。使用 PRIMASK、FAULTMASK 和 BASEPRI 寄存器控制中断。这些可以使用 MRS 和 MSR 指令访问,它们不是 CPSR 的一部分,就像您在较旧的 ARM 架构上可能会发现的那样。在最简单的情况下,通过向 PRIMASK 写入 1 来屏蔽中断,通过向 PRIMASK 写入 0 来取消屏蔽中断。可以读取 PRIMASK 以确定其状态。如果您需要控制 NMI 或硬故障,则可以使用 FAULTMASK。如果您想要使用优先级进行更精细的控制,则使用 BASEPRI。您将需要做一些阅读以确定您的用法以及优先级在是否允许嵌套中断执行中的作用。
关于assembly - 如何检查 Cortex M3 是否启用了中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20081929/