ARM中WFE指令的处理方式

4

WFE指令是如何工作的? 据我所知,它会使处理器等待IRQ / FIQ / 事件等...

但当你收到一个IRQ时,irq_fault_handler向量是否会执行中断或在WFE指令后执行?

2个回答

9

WFE的概念与

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

除了关闭CPU而非运行紧密循环之外,它与其他操作相同。

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

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

如果CPU被明确唤醒事件唤醒,则执行将在WFE之后的下一条指令进行。

将WFE视为仅在发生某些外部事件时才完成的非常长的NOP。


在执行“WFE”之前,您还可以屏蔽中断,这样您的下一条指令将会被执行。这通常需要用于睡眠代码。WFE不会从外部SDRAM等处获取信息,并且可以节省电力;许多设计都使用此功能进入不同的睡眠状态。许多程序员关心功耗;但是这方面取决于SOC。从执行角度来看,“WFE”就像是一个扩展的“NOP”。 (+1) - artless noise
好的。如果IRQ处理程序定义为_irq:.word _irq。请参见SPL BUILD下面的http://git.denx.de/?p=u-boot.git;a=blob;f=arch/arm/cpu/armv7/start.S;h=ef62fc83270a327bc7df970f598540f1d7ce0fe2;hb=HEAD。 - user970251
@user970251,我不知道你的评论在问什么。WFE的行为不取决于IRQ处理程序在源代码中如何定义。你是想了解那个IRQ处理程序的作用吗?那是一个完全不同的问题,与WFE无关。 - Gilles 'SO- stop being evil'
我在这里询问的是,我参考的代码将IRQ处理程序定义为“nothing”,在这种情况下会发生什么。 - user970251
1
@user970251 那行代码不是实际使用的 IRQ 处理程序,它只是一个占位符,直到 IRQ 处理程序的地址被放入中断向量表中。如果在此期间发生 IRQ 并且中断未被阻塞,则将调用临时处理程序,它是一个紧密的循环(即什么也不做,直到电池耗尽)。如果您仍然不理解,请提出另一个问题;这与 WFE 无关。 - Gilles 'SO- stop being evil'

1
应该强调WFE只是一个提示指令,即:符合规范的实现可以将其视为NOP而不是进入睡眠状态。
因此,您几乎总是需要将其包围在循环中。
下面的答案提供了一个最小的裸机汇编示例,说明了如何使用WFE等待来自另一个CPU的事件:多核汇编语言是什么样子的?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接