【问题标题】:WFE instruction handling in ARMARM 中的 WFE 指令处理
【发布时间】:2013-09-20 10:24:07
【问题描述】:

WFE 指令如何工作? 我读到的是它使处理器等待 IRQ /FIQ/event/....

但是当你得到一个 IRQ 时会发生什么,irq_fault_handler 向量是在得到一个中断时执行还是在 WFE 执行之后执行指令?

【问题讨论】:

    标签: arm


    【解决方案1】:

    还应该强调的是,WFE“只是”一个提示指令,即:兼容的实现可以将其视为 NOP 而不是进入休眠状态。

    因此,您几乎总是需要用一个循环来包围它。

    以下答案提供了一个最小的裸机组装示例,说明 WFE 通常如何用于等待来自另一个 CPU 的事件:What does multicore assembly language look like?

    【讨论】:

      【解决方案2】:

      WFE 在概念上等同于

      while (!event_has_occurred) /*do nothing*/;
      

      除了它关闭 CPU 而不是运行一个紧密的循环。

      interrupt a WFE 可以处理的几件事,不仅包括中断,还包括来自另一个 CPU(在多核处理器中)的显式唤醒事件。

      如果在 WFE 期间发生中断,则通常情况会发生。处理器切换到 IRQ 或 FIQ 模式,跳转到 IRQ 或 FIQ 处理程序,WFE 指令的地址(加上通常的偏移量 8)放在lr 中。

      如果 CPU 被显式唤醒事件唤醒,则执行 WFE 之后的下一条指令。

      将 WFE 视为一个很长的 NOP,只有在某些外部事件发生时才会完成。

      【讨论】:

      • 您也可以在执行WFE 之前屏蔽中断,在这种情况下您的下一条指令将执行。这通常是 sleep 代码所需要的。 WFE 不会从外部 SDRAM 等中获取,并且会节省电力;许多设计使用此功能进入不同的睡眠状态。许多程序员会关心功耗;但这方面取决于SOC。从执行的角度来看,WFE 就像一个扩展的NOP。 (+1)
      • 好的。如果 IRQ 处理程序被定义为 _irq: .word _irq 会怎样。 git.denx.de/?p=u-boot.git;a=blob;f=arch/arm/cpu/armv7/… 见下 SPL BUILD
      • @user970251 我不知道你的评论在问什么。 WFE 的行为不依赖于源代码中如何定义 IRQ 处理程序。您是否试图了解该 IRQ 处理程序的作用?这是一个完全不同的问题,与 WFE 无关。
      • 我在这里要问的是我引用的代码没有定义 irq 处理程序,在这种情况下会发生什么
      • @user970251 该行不是将使用的 IRQ 处理程序,它是一个占位符,直到将 IRQ 处理程序的地址放入中断向量中。如果在此期间发生 IRQ 并且中断被解除阻塞,则将调用临时处理程序,这是一个紧密的循环(即它什么都不做,永远或直到电池耗尽)。如果还是不明白,ask another question;这与 WFE 无关。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-02
      • 2015-01-27
      • 1970-01-01
      • 1970-01-01
      • 2019-04-30
      相关资源
      最近更新 更多