在Cortex M3上,一段代码如何确定是否启用中断,即程序状态寄存器中I
位的状态(由cpsid
和cpsie
操作)?在较旧的ARM上,我能够读取cpsr
寄存器,但这似乎不再可能。
我需要这些信息,因为我有一个函数,它同时从main和中断调用,并且它需要在中断被禁用时以原子方式执行某个操作。基本上:
bool interrupts_enabled = InterruptsEnabled();
if (interrupts_enabled) {
__disable_irq();
}
Critical Code;
if (interrupts_enabled) {
__enable_irq();
}
字符串
另外,我想知道在执行中断时I
标志的行为。中断的执行是否会设置I
标志,如中所示,以防止嵌套?默认情况下是否启用中断嵌套,如何防止嵌套?
1条答案
按热度按时间3qpi33ja1#
M3的异常架构有点不同。中断由PRIMASK、FAULTMASK和BASEPRI寄存器控制。这些可以使用MRS和MSR指令访问,并且不是CPSR的一部分,因为您可能会在旧的ARM架构上找到。在最简单的情况下,通过将1写入PRIMASK来屏蔽中断,并通过将0写入PRIMASK来解除屏蔽。可以读取PRIMASK以确定其状态。如果您需要控制NMI或硬故障,则可以使用FAULTMASK。如果您希望使用优先级进行更精细的控制,则使用BASEPRI。您将不得不做一些阅读,以确定您的用法需要是什么,以及优先级在是否允许嵌套中断执行中的作用。