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

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

概述ARM的Linux内核基本上在循环中执行CPU_idle:while (1) { disalbe_irq wfi enable_irq } 我可以理解这个逻辑是有效的,因为“wfi”会唤醒ARM而不管IRQ / FIQ状态如何.但是,为什么“wfi”必须首先被disable_irq和eanble_irq括起来?源代码/arch/arm

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所需的任何任务之前进入休眠状态.

总结

以上是内存溢出为你收集整理的为什么我们需要在ARM Linux cpu_idle中的WFI之前禁用中断全部内容,希望文章能够帮你解决为什么我们需要在ARM Linux cpu_idle中的WFI之前禁用中断所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1047863.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存