ARM WFI和WFE指令【转】
本文转载至:http://www.wowotech.net/armv8a_arch/wfe_wfi.html
1. 前言
蜗蜗很早以前就知道有WFI和WFE这两个指令存在,但一直似懂非懂。最近准备研究CPU idle framework,由于WFI是让CPU进入idle状态的一种方法,就下决心把它们弄清楚。
WFI(Wait for interrupt)和WFE(Wait for event)是两个让ARM核进入low-power standby模式的指令,由ARM architecture定义,由ARM core实现。听着挺简单,但怎么会有两个指令?它们的区别是什么?使用场景是什么?深究起来,还挺有意思,例如:能想象WFE和spinlock的关系吗?
2. WFI和WFE
1)共同点
WFI和WFE的功能非常类似,以ARMv8-A为例(参考DDI0487A_d_armv8_arm.pdf的描述),主要是“将ARMv8-A PE(Processing Element, 处理单元)设置为low-power standby state”。
需要说明的是,ARM architecture并没有规定“low-power standby state”的具体形式,因而可以由ARM core自行发挥,根据ARM的建议,一般可以实现为standby(关闭clock、保持供电)、dormant、shutdown等等。但有个原则,不能造成内存一致性的问题。以Cortex-A57 ARM core为例,它把WFI和WFE实现为“put the core in a low-power state by disabling the clocks in the core while keeping the core powered up”,即我们通常所说的standby模式,保持供电,关闭clock。
2)不同点
那它们的区别体现在哪呢?主要体现进入和退出的方式上。
对WFI来说,执行WFI指令后,ARM core会立即进入low-power standby state,直到有WFI Wakeup events发生。
而WFE则稍微不同,执行WFE指令后,根据Event Register(一个单bit的寄存器,每个PE一个)的状态,有两种情况:如果Event Register为1,该指令会把它清零,然后执行完成(不会standby);如果Event Register为0,和WFI类似,进入low-power standby state,直到有WFE Wakeup events发生。
WFI wakeup event和WFE wakeup event可以分别让Core从WFI和WFE状态唤醒,这两类Event大部分相同,如任何的IRQ中断、FIQ中断等等,一些细微的差别,可以参考“DDI0487A_d_armv8_arm.pdf“的描述。而最大的不同是,WFE可以被任何PE上执行的SEV指令唤醒。
所谓的SEV指令,就是一个用来改变Event Register的指令,有两个:SEV会修改所有PE上的寄存器;SEVL,只修改本PE的寄存器值。下面让我们看看WFE这种特殊设计的使用场景。
3. 使用场景
1)WFI
WFI一般用于cpuidle。
2)WFE
WFE的一个典型使用场景,是用在spinlock中(可参考arch_spin_lock,对arm64来说,位于arm64/include/asm/spinlock.h中)。spinlock的功能,是在不同CPU core之间,保护共享资源。使用WFE的流程是:
a)资源空闲
b)Core1访问资源,acquire lock,获得资源
c)Core2访问资源,此时资源不空闲,执行WFE指令,让core进入low-power state
d)Core1释放资源,release lock,释放资源,同时执行SEV指令,唤醒Core2
e)Core2获得资源
以往的spinlock,在获得不到资源时,让Core进入busy loop,而通过插入WFE指令,可以节省功耗,也算是因祸(损失了性能)得福(降低了功耗)吧。
原创文章,转发请注明出处。蜗窝科技,www.wowotech.net。
ARM WFI和WFE指令【转】相关推荐
- arm指令和C语言指令一样吗,ARM WFI和WFE指令
ARM WFI和WFE指令 作者:wowo 发布于:2014-12-10 22:43 分类:ARMv8A Arch 1. 前言 蜗蜗很早以前就知道有WFI和WFE这两个指令存在,但一直似懂非懂.最近准 ...
- ARM WFI和WFE指令
1. 前言 蜗蜗很早以前就知道有WFI和WFE这两个指令存在,但一直似懂非懂.最近准备研究CPU idle framework,由于WFI是让CPU进入idle状态的一种方法,就下决心把它们弄清楚. ...
- ARM WFI和WFE
1. 前言 WFI(Wait for interrupt)和WFE(Wait for event)是两个让ARM核进入low-power standby模式的指令,由ARM architecture定 ...
- STM32中的WFI和WFE指令的意思
https://blog.csdn.net/changyourmind/article/details/54973357 进入低功耗模式的两个指令,这是ARM里CMSIS内核中的指令.详情请参考链接里 ...
- arm汇编指令WFI和WFE
1. 前言 很早以前就知道有WFI和WFE这两个指令存在,但一直似懂非懂.最近准备研究CPU idle framework,由于WFI是让CPU进入idle状态的一种方法,就下决心把它们弄清楚. WF ...
- STM32汇编指令(一)WFI 和 WFE
ARM汇编的调用 嵌入式开发,尤其是编写BSP的时候,非常接近底层,这个时候有可能用一些汇编指令来保证程序的简洁和高效,但是平常编写代码用到的都是C/C++,那么如何使用汇编指令呢? 其实这个问题也很 ...
- 2020-12-4((ARM汇编)mov指令,LDR指令,LDR伪指令)
首先说明一下 ARM是RISC("reduced instruction set computer",即"精简指令集计算机")结构 x86是CISC(" ...
- ARM中的ldr指令与adr、ldr伪指令之间的区别
ARM汇编语言中有ldr指令和ldr.adr伪指令,他们都可以将标号表达式作为操作数.区别如下: ldr指令和adr.ldr伪指令的区别:ldr指令属于load-store指令,用于读取标号地址中的值 ...
- ARM中的---汇编指令
ARM中的---汇编指令 一. 带点的(一般都是ARM GNU伪汇编指令) 1. ".text".".data".".bss" 依次表示的是 ...
最新文章
- 河北省往届高考成绩查询2021,2021河北高考成绩查询时间 高考成绩查询入口
- Python3.x的mysqlclient的安装、Python操作mysql,python连接MySQL数据库,python创建数据库表,带有事务的操作,CRUD
- 前端学习(1168):构造函数方法(转换为真正数组)
- 【报告分享】疫情期间抖音、快手带货趋势分析报告.pdf(附下载链接)
- python海龟绘图代码大全-编程入门06:Python海龟绘图
- Oracle 创建和操作表
- Photoshop - 新建纯色图层
- hive: Error in acquiring locks
- JSP报错 At least one JAR was scanned for TLDs yet contained no TLDs
- 关于VMware workstation Player的虚拟网络编辑器没有的情况
- 第六章 Cesium学习入门之添加Geojson数据(dataSource)
- 客户开发篇 | 外贸业务员怎么打电话开发跟进客户呢?
- nginx禁止外网访问
- 【Uinty3d】常用API
- 其中的各种居中(水平居中,垂直居中,水平垂直居中)
- 美国食品药品监督管理局将部署人工智能来协助食品监管
- mac 远程计算机,Mac系统如何远程桌面到Windows系统
- 无需括号的xss payload
- 港科夜闻|香港科大与腾讯金融学院(香港)携手培育金融科技人才
- python中5种简单的数据类型,Python小白零基础入门 —— 变量及简单的数据类型