我开始使用ARM平台(特别是TI TMS570系列)。
我有一些关键区域的代码,我不希望发生异常。所以我想在进入区域时保存IRQ和FIR启用的标志,并在退出时恢复它们。
我该怎么做?
答案 0 :(得分: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
有些编译器提供了一组可用于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
答案 1 :(得分:0)
您可以使用_disable_interrupt _(); _ enable_interrupt_();来自Halcogen生成的代码(sys_core.h)