在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 回答
M3的异常架构略有不同 . 使用PRIMASK,FAULTMASK和BASEPRI寄存器控制中断 . 这些可以使用MRS和MSR指令访问,并且不像旧版ARM体系结构中那样是CPSR的一部分 . 在最简单的情况下,通过将1写入PRIMASK来屏蔽中断,并通过将0写入PRIMASK来屏蔽中断 . 可以读取PRIMASK以确定其状态 . 如果您需要控制NMI或硬故障,那么FAULTMASK就会发挥作用 . 如果您希望使用优先级进行更精细的控制,则使用BASEPRI . 您将不得不进行一些读取以确定您的使用需求以及优先级在是否允许嵌套中断执行中的作用 .