我开始使用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

10-08 07:11