【问题标题】:Why do we need to disable interrupt before WFI in ARM Linux cpu_idle为什么我们需要在 ARM Linux cpu_idle 中在 WFI 之前禁用中断
【发布时间】:2014-06-11 22:12:48
【问题描述】:

ARM 的 Linux 内核基本上是循环处理 CPU_idle:

while (1) {
    disalbe_irq
    wfi
    enable_irq
}

我可以理解这个逻辑是有效的,因为“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.

但我无法理解它。有人能告诉我在哪种情况下我们会错过叫醒电话吗?

【问题讨论】:

    标签: linux kernel interrupt


    【解决方案1】:

    主循环中的整个“进入睡眠”序列分为两个步骤:

    1. 意识到你没有工作要做;
    2. 尝试睡觉(即 WFI)

    如果仍然设置了一些中断标志,WFI 指令将充当 NOP,这允许主循环返回运行所需的任务。到目前为止一切顺利。

    如果在步骤 1 之后和步骤 2 之前发生中断,则会出现问题。如果发生这种情况,则中断标志将在退出 ISR 时被清除,当控制返回主循环时,它将触发 WFI 指令清除所有中断标志,导致 CPU 在主循环有机会执行 ISR 所需的任何任务之前进入睡眠状态。

    【讨论】:

      【解决方案2】:

      >:

      ARM 建议使用数据同步屏障 (DSB) 指令 在 WFI 或 WFE 之前,以确保待处理的内存事务在更改状态之前完成。

      如果启用中断,我们可能会看到:

      DSB
      interrupt handler
      WFI
      

      但我们不能假设在中断处理程序之后我们不需要 DSB。所以,我们需要禁用中断。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-15
        • 2016-03-15
        • 1970-01-01
        • 1970-01-01
        • 2010-10-02
        • 1970-01-01
        • 2012-11-16
        相关资源
        最近更新 更多