为什么我们需要在ARM Linux CPU_IDLE

问题描述 投票:0回答:2
手臂的Linux内核基本上在循环中进行CPU_IDLE:

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.

但是我无法理解它。有人可以在哪种情况下启发我,我们会错过一个唤醒电话?
    

主循环中的整个“进入睡眠”序列分为两个步骤:
linux kernel interrupt
2个回答
6
投票

实际,您没有工作要做;

try睡觉(即WFI)
  1. 如果仍然设置了一些中断标志,则WFI指令将充当NOP,这允许主循环返回运行所需的任务。 到目前为止一切都很好。
  2. 如果在步骤1之后和步骤2之前发生中断。

>:


0
投票

ARM建议使用数据同步屏障(DSB)指令 在WFI或WFE之前,以确保在更改状态之前完成待处理的内存交易。 << Cortex-A Series Programmers Guide >

如果启用了中断,我们可能会看到这一点:

DSB interrupt handler WFI

但我们不能假设中断处理程序后不需要DSB。因此,我们需要禁用中断。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.