暂时禁用ARM上的中断

glg*_*lgl 6 arm interrupt armv7 tms570

我开始使用ARM平台(特别是TI TMS570系列).

我有一些关键区域的代码,我不希望发生异常.所以我想在进入区域时保存IRQ和FIR启用的标志,并在退出时恢复它们.

我怎么做?

Not*_*hat 11

要临时屏蔽CPU上的IRQ和FIQ,ARMv7最好的选项是使用cps:

// assembly code assuming interrupts unmasked on entry

cpsid if  // mask IRQ and FIQ
...       // do critical stuff
cpsie if  // unmask
Run Code Online (Sandbox Code Playgroud)

有些编译器提供了一组__disable_irq()可以从C代码中使用的内在函数,但对于其他编译器(如GCC),它将是一个下降到汇编的情况.

如果你想让关键部分嵌套,重入,接受中断处理程序或其他任何需要恢复先前状态的东西,而不是在最后进行非临时取消屏蔽,那么你需要在屏蔽任何东西之前将该状态复制出CPSR ,然后在退出时恢复它.此时,取消屏蔽可能最终会更简单地处理CPSR的直接读取 - 修改 - 写入的传统方式.这是我头脑中的一个想法:

// int enter_critical_section(void);
enter_critical_section:
mrs r0, cpsr
cpsid if
and r0, r0, #0xc0  // leave just the I and F flags
bx lr

// void leave_critical_section(int flags);
leave_critical_section:
mrs r1, cpsr
bic r1, r1, r0
msr cpsr_c, r1
bx lr
Run Code Online (Sandbox Code Playgroud)