暂时禁用ARM上的中断

时间:2016-10-13 11:38:40

标签: arm interrupt armv7 tms570

我开始使用ARM平台(特别是TI TMS570系列)。

我有一些关键区域的代码,我不希望发生异常。所以我想在进入区域时保存IRQ和FIR启用的标志,并在退出时恢复它们。

我该怎么做?

2 个答案:

答案 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)