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指令【转】

    本文转载至:http://www.wowotech.net/armv8a_arch/wfe_wfi.html 1. 前言 蜗蜗很早以前就知道有WFI和WFE这两个指令存在,但一直似懂非懂.最近准备研究 ...

  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. linux joe复制一行,Linux joe命令
  2. 非此即彼的逻辑错误_MBA逻辑攻略逻辑知识大全,快来收藏吧!
  3. 一次针对EduSrc的挖掘
  4. 【C语言】C语言结构解析
  5. 【FPGA】——UART串口通信
  6. C#中List的排序(Sort)
  7. LA 3027 并查集
  8. docker安装mysql5.7_docker安装mysql5.7
  9. python cmd窗口 title_解决python在windows上运行弹出cmd窗口(dos窗口)
  10. 办公技巧:腾讯文档怎么固定表头?
  11. 注册表修复工具+强制卸载工具
  12. 计算机网络复习-第六章应用层
  13. 基本乐理知识——和弦
  14. 《零售时代4.0》读后感
  15. 斜杠‘/‘ 和反斜杠‘\‘
  16. ATTCK v10版本战术介绍—资源开发
  17. rqt_publisher报错/publisher_widget.py“, line 105, in _update_thread_run
  18. 南阳师范学院计算机科学与技术在哪个校区,2021年南阳师范学院有几个校区,大一新生在哪个校区...
  19. 嵌套div里子元素div使用margin可能遇到的问题
  20. ERP系统是一种服务器吗,erp系统可以用云服务器吗

热门文章

  1. Android Studio2.0 教程从入门到精通Windows版
  2. nginx和apache 配置
  3. bzoj3589 动态树
  4. javascript笔记——cookie解析
  5. Flash学习笔记(01)
  6. iOS开发里的Bundle是个啥玩意?!
  7. 如何杀死进程及子进程
  8. 0.2 控制系统的状态空间表示法
  9. 9. 混合模型和EM(3)
  10. 【控制】《多无人机协同控制技术》周伟老师-第9章-单无人机目标跟踪飞行控制策略