ARM64平台下WFE和SEV相关指令解析

发布者:Ampoule最新更新时间:2021-11-03 来源: eefocus关键字:WFE  SEV 手机看文章 扫描二维码
随时随地手机看文章

WFE

等待事件(Wait For Event)指令。


ARM架构下,有一个全局的事件寄存器(Event Register),系统中的每一个CPU核在这个寄存器上都有对应的位。


当当前CPU执行WFE指令的时候,如果事件寄存器对应当前CPU的位没有被设置(也就是0),则当前CPU核会进入低功耗模式,会被挂起,不会再执行其它操作;而如果事件寄存器对应当前CPU的位被设置了(也就是1),则会将事件寄存器对应当前CPU的位清空(设置成0),然后立即返回,继续执行下面的指令,不会进入低功耗模式。


如果当前CPU核通过WFE指令进入了低功耗模式,那么只有在如下情况下才可能被重新唤醒:


发生了IRQ中断(前提是没有被屏蔽);

发生了FIQ中断(前提是没有被屏蔽);

发生了SError中断(前提是没有被屏蔽);

事件寄存器对应当前CPU核的位被置位(设置成1),如果是通过这种方式唤醒的,唤醒后会立即将事件寄存器对应当前CPU核的位清0。

注意,WFE指令到底让CPU核干什么,其实是没有具体定义的,只要不让内存丢失数据就行。所以,其可以只是一条空(NOP)指令,或者像绝大多数Arm核心设计的那样,可以进入低功耗状态。但是,如果实现了WFE指令将当前CPU核切换到低功耗模式,那就一定要实现后面说的SEV指令,否则该CPU核有可能会一直不被唤醒。


在Arm架构下,Linux内核的自旋锁就使用到了WFE指令。


WFI

等待中断(Wait For Interrupt)指令。


和前面说的WFE指令不同,执行WFI指令后,当前CPU核会立即进入低功耗状态。


如果当前CPU核通过WFI指令进入了低功耗模式,那么只有在如下情况下才可能被重新唤醒:


发生了IRQ中断(不管有没有被屏蔽);

发生了FIQ中断(不管有没有被屏蔽);

发生了SError中断(不管有没有被屏蔽)。

SEV

发送事件(Send Event)指令。


这条指令将想系统中的所有CPU核发送事件。对应系统中的每个CPU核,设置事件寄存器(Event Register)相应的位。如果某个CPU核正在等待事件(WFE),那么该CPU核会被立即唤醒,并清除掉表示该CPU的事件寄存器相应的位。


SEVL

发送本地事件(Send Event Locally)指令。


不同于前面说的SEV指令,这条指令只会向当前CPU核心发送。如果是多核CPU那也只向当前核心,不会向CPU内的其它核心发送。


值得注意的是,这条指令只有在支持ARMv8指令集之后的处理器中才有效。


其它

从前面的分析可以看出来,可以通过SEVL指令来设置事件寄存器对应当前CPU核的位,可以通过SEV指令来设置事件寄存器对应所有CPU核的位,可以通过WFE指令来清空事件寄存器对应当前CPU核的位。


在ARMv8指令集中,还添加了一种情况,用来发送事件。当全局监视器标记的对某段内存的独占访问被清空后,将向所有标记了对该段内存独占访问的CPU核都发送事件。也就是说,当系统在多个CPU核上,通过LDREX或者LDXR指令读取某段内存后,系统全局监视器会将该段内存标记为独占(Exclusive),这之后又调用了WFE指令进入低功耗模式了。当系统中又有一个CPU,通过STREX或者STXR指令对该段内存进行了写入,这将清空全局监视器对该段内存的独占标记为,那么系统会自动给前面那些CPU核发送事件,将它们唤醒。

关键字:WFE  SEV 引用地址:ARM64平台下WFE和SEV相关指令解析

上一篇:ARM微处理器的工作状态
下一篇:mini2440裸机编程------IIS

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved