我开始使用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
一些编译器提供了一组可从C代码中使用的__disable_irq()
等内嵌函数,但对于其他编译器(如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
您可以在Halcogen生成的代码(sys_core.h)中使用_disable_interrupt_(); _enable_interrupt_();