【发布时间】:2013-09-20 10:24:07
【问题描述】:
WFE 指令如何工作? 我读到的是它使处理器等待 IRQ /FIQ/event/....
但是当你得到一个 IRQ 时会发生什么,irq_fault_handler 向量是在得到一个中断时执行还是在 WFE 执行之后执行指令?
【问题讨论】:
标签: arm
WFE 指令如何工作? 我读到的是它使处理器等待 IRQ /FIQ/event/....
但是当你得到一个 IRQ 时会发生什么,irq_fault_handler 向量是在得到一个中断时执行还是在 WFE 执行之后执行指令?
【问题讨论】:
标签: arm
还应该强调的是,WFE“只是”一个提示指令,即:兼容的实现可以将其视为 NOP 而不是进入休眠状态。
因此,您几乎总是需要用一个循环来包围它。
以下答案提供了一个最小的裸机组装示例,说明 WFE 通常如何用于等待来自另一个 CPU 的事件:What does multicore assembly language look like?
【讨论】:
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)