暂时禁用ARM上的中断

g

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章