while (1) {
disable_irq
wfi
enable_irq
}
我可以理解,这种逻辑有效,因为“ WFI”醒来了手臂,无论IRQ/FIQ状态如何。但是,为什么必须首先将“ wfi”由disable_irq和eanble_irq括起来?
源代码/arch/arm/process.c有以下赞誉:
* We need to disable interrupts here
* to ensure we don't miss a wakeup call.
但是我无法理解它。有人可以在哪种情况下启发我,我们会错过一个唤醒电话?
主循环中的整个“进入睡眠”序列分为两个步骤:
实际,您没有工作要做;
try睡觉(即WFI)
>:
ARM建议使用数据同步屏障(DSB)指令 在WFI或WFE之前,以确保在更改状态之前完成待处理的内存交易。 << Cortex-A Series Programmers Guide >
如果启用了中断,我们可能会看到这一点:
DSB
interrupt handler
WFI
但我们不能假设中断处理程序后不需要DSB。因此,我们需要禁用中断。