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)