assembly 如何检查Cortex M3中是否启用了中断?

to94eoyn  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(92)

在Cortex M3上,一段代码如何确定是否启用中断,即程序状态寄存器中I位的状态(由cpsidcpsie操作)?在较旧的ARM上,我能够读取cpsr寄存器,但这似乎不再可能。
我需要这些信息,因为我有一个函数,它同时从main和中断调用,并且它需要在中断被禁用时以原子方式执行某个操作。基本上:

bool interrupts_enabled = InterruptsEnabled();
if (interrupts_enabled) {
    __disable_irq();
}
Critical Code;
if (interrupts_enabled) {
    __enable_irq();
}

字符串
另外,我想知道在执行中断时I标志的行为。中断的执行是否会设置I标志,如中所示,以防止嵌套?默认情况下是否启用中断嵌套,如何防止嵌套?

3qpi33ja

3qpi33ja1#

M3的异常架构有点不同。中断由PRIMASK、FAULTMASK和BASEPRI寄存器控制。这些可以使用MRS和MSR指令访问,并且不是CPSR的一部分,因为您可能会在旧的ARM架构上找到。在最简单的情况下,通过将1写入PRIMASK来屏蔽中断,并通过将0写入PRIMASK来解除屏蔽。可以读取PRIMASK以确定其状态。如果您需要控制NMI或硬故障,则可以使用FAULTMASK。如果您希望使用优先级进行更精细的控制,则使用BASEPRI。您将不得不做一些阅读,以确定您的用法需要是什么,以及优先级在是否允许嵌套中断执行中的作用。

相关问题