本文转载至: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指令【转】相关推荐

  1. arm指令和C语言指令一样吗,ARM WFI和WFE指令

    ARM WFI和WFE指令 作者:wowo 发布于:2014-12-10 22:43 分类:ARMv8A Arch 1. 前言 蜗蜗很早以前就知道有WFI和WFE这两个指令存在,但一直似懂非懂.最近准 ...

  2. ARM WFI和WFE指令

    1. 前言 蜗蜗很早以前就知道有WFI和WFE这两个指令存在,但一直似懂非懂.最近准备研究CPU idle framework,由于WFI是让CPU进入idle状态的一种方法,就下决心把它们弄清楚. ...

  3. ARM WFI和WFE

    1. 前言 WFI(Wait for interrupt)和WFE(Wait for event)是两个让ARM核进入low-power standby模式的指令,由ARM architecture定 ...

  4. STM32中的WFI和WFE指令的意思

    https://blog.csdn.net/changyourmind/article/details/54973357 进入低功耗模式的两个指令,这是ARM里CMSIS内核中的指令.详情请参考链接里 ...

  5. arm汇编指令WFI和WFE

    1. 前言 很早以前就知道有WFI和WFE这两个指令存在,但一直似懂非懂.最近准备研究CPU idle framework,由于WFI是让CPU进入idle状态的一种方法,就下决心把它们弄清楚. WF ...

  6. STM32汇编指令(一)WFI 和 WFE

    ARM汇编的调用 嵌入式开发,尤其是编写BSP的时候,非常接近底层,这个时候有可能用一些汇编指令来保证程序的简洁和高效,但是平常编写代码用到的都是C/C++,那么如何使用汇编指令呢? 其实这个问题也很 ...

  7. 2020-12-4((ARM汇编)mov指令,LDR指令,LDR伪指令)

    首先说明一下 ARM是RISC("reduced instruction set computer",即"精简指令集计算机")结构 x86是CISC(" ...

  8. ARM中的ldr指令与adr、ldr伪指令之间的区别

    ARM汇编语言中有ldr指令和ldr.adr伪指令,他们都可以将标号表达式作为操作数.区别如下: ldr指令和adr.ldr伪指令的区别:ldr指令属于load-store指令,用于读取标号地址中的值 ...

  9. ARM中的---汇编指令

    ARM中的---汇编指令 一. 带点的(一般都是ARM GNU伪汇编指令) 1. ".text".".data".".bss" 依次表示的是 ...

最新文章

  1. 河北省往届高考成绩查询2021,2021河北高考成绩查询时间 高考成绩查询入口
  2. Python3.x的mysqlclient的安装、Python操作mysql,python连接MySQL数据库,python创建数据库表,带有事务的操作,CRUD
  3. 前端学习(1168):构造函数方法(转换为真正数组)
  4. 【报告分享】疫情期间抖音、快手带货趋势分析报告.pdf(附下载链接)
  5. python海龟绘图代码大全-编程入门06:Python海龟绘图
  6. Oracle 创建和操作表
  7. Photoshop - 新建纯色图层
  8. hive: Error in acquiring locks
  9. JSP报错 At least one JAR was scanned for TLDs yet contained no TLDs
  10. 关于VMware workstation Player的虚拟网络编辑器没有的情况
  11. 第六章 Cesium学习入门之添加Geojson数据(dataSource)
  12. 客户开发篇 | 外贸业务员怎么打电话开发跟进客户呢?
  13. nginx禁止外网访问
  14. 【Uinty3d】常用API
  15. 其中的各种居中(水平居中,垂直居中,水平垂直居中)
  16. 美国食品药品监督管理局将部署人工智能来协助食品监管
  17. mac 远程计算机,Mac系统如何远程桌面到Windows系统
  18. 无需括号的xss payload
  19. 港科夜闻|香港科大与腾讯金融学院(香港)携手培育金融科技人才
  20. python中5种简单的数据类型,Python小白零基础入门 —— 变量及简单的数据类型

热门文章

  1. you have new email in /var/spool/mail/root/
  2. Logback学习笔记1
  3. 百万级访问量网站的技术准备工作[转帖]
  4. 第一篇文章,做个纪念
  5. 菜鸟Vue学习笔记(三)
  6. Zend Framework Mail通过网易免费邮箱发送邮件
  7. 资本主义社会是不存在人道的
  8. JavaScript--练习1--99乘法表
  9. Enda 的 2015 下半年读书计划
  10. ABS是啥,为什么区块链可以与它完美结合?