我开始使用ARM平台(特别是TI TMS570系列)。
我有一些关键区域的代码,我不希望发生异常。因此,我希望在进入区域时保存IRQ和FIR使能标志,并在退出时恢复它们。
我该怎么做?
发布于 2016-10-13 20:59:42
要在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发布于 2016-10-27 02:09:24
你可以使用_disable_interrupt_(),;_enable_interrupt_();,从高生成代码(sys_core.h)
https://stackoverflow.com/questions/40019929
复制相似问题