Joe*_*oey 6 linux kernel interrupt
ARM的Linux内核基本上在循环中执行CPU_idle:
while (1) {
disalbe_irq
wfi
enable_irq
}
Run Code Online (Sandbox Code Playgroud)
我可以理解这个逻辑是有效的,因为"wfi"会唤醒ARM而不管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.
Run Code Online (Sandbox Code Playgroud)
但我无法理解它.有人可以告诉我在哪种情况下我们会错过一个唤醒电话?
小智 5
主循环中的整个“进入睡眠”序列分为两个步骤:
如果仍然设置了一些中断标志,则 WFI 指令将充当 NOP,这允许主循环返回运行所需的任务。到目前为止,一切都很好。
但是,如果在步骤 1 之后和步骤 2 之前发生中断,则会出现问题。如果发生这种情况,那么中断标志将在退出 ISR 时被清除,并且当控制返回到主循环时,它将使用所有中断命中 WFI 指令标志被清除,导致 CPU 在主循环有机会执行 ISR 所需的任何任务之前进入睡眠状态。