加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

为什么我们需要在ARM Linux cpu_idle中的WFI之前禁用中断

发布时间:2020-12-13 19:23:13 所属栏目:Linux 来源:网络整理
导读:ARM的Linux内核基本上在循环中执行CPU_idle: while (1) { disalbe_irq wfi enable_irq} 我可以理解这个逻辑是有效的,因为“wfi”会唤醒ARM而不管IRQ / FIQ状态如何.但是,为什么“wfi”必须首先被disable_irq和eanble_irq括起来? 源代码/arch/arm/process.c

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.

但我无法理解它.有人可以告诉我在哪种情况下我们会错过一个唤醒电话?

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

>意识到你没有工作要做;
>试着睡觉(即WFI)

如果仍然设置了某些中断标志,则WFI指令将充当NOP,这允许主循环返回运行所需的任务.到现在为止还挺好.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读