我开始使用 ARM 平台(特别是 TI TMS570 系列)。
我有一些关键区域的代码,我不希望发生异常。所以我想在进入区域时保存启用 IRQ 和 FIR 的标志,并在退出时恢复它们。
我怎么做?
要在 CPU 上临时屏蔽 IRQ 和 FIQ,ARMv7 最好的选择是使用cps
:
// assembly code assuming interrupts unmasked on entry
cpsid if // mask IRQ and FIQ
... // do critical stuff
cpsie if // unmask
一些编译器提供了一组__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
您可以使用 _disable_interrupt_();_enable_interrupt_(); 来自 Halcogen 生成的代码 (sys_core.h)