最近在研究一些关于S3和S4的东西,里面出现了WFI的东西,我以前只知道WIFI,哈哈哈。

然后发现了一篇前辈写的文章不错。

大家记得点击原文阅读观感更加。

https://blog.csdn.net/luolaihua2018/article/details/126773265#comments_23655201

1、WFI是什么?

WFI(Wait For Interrupt)指令是ARM中的一个Hint 指令,内核执行hint指令的时候不需要依赖额外的处理操作。

WFI指令可以让CPU进入standby 模式,即低功耗模式,此时内核会暂停其他活动,一直等待中断事件的发生,检测到中断发生后,WFI指令执行完成,CPU退出standby模式。

本文将从ARM hint指令、WFI的用途以及WFI的唤醒事件等三个角度解释WFI指令。

2、ARM Hint 指令

HINT 指令可以合法地被视为 NOP指令,但它们可以具有特定于实现的效果,常见的HINT指令有:

  • NOP // No operation,无操作, 不保证CPU会花时间去执行
  • YIELD // 提示当前线程正在执行可以换出的任务
  • WFE // Wait for Event,进入low power状态,直到等待的事件发生
  • WFI // Wait for interrupt,进入low power状态,直到等待的中断或与中断类似的操作发生
  • SEV // Send Event,发送事件,与WFE对应
  • SEVL // Send Event Local,发送本地事件,与WFE对应

ARM 汇编语言中包含可用于让core进入低功耗状态(low-power state)的指令:WFI或WFE。ARM架构将这些指令定义为hint指令,这意味着core在执行它们时不需要采取任何特定操作。然而,在 Cortex-A 处理器系列中,这些指令的实现方式是关闭几乎所有内核部分的时钟。这意味着内核的功耗显着降低,仅消耗静态漏电流,没有动态功耗。
(这个时钟真的很重要,我得好好看一下这个时钟到底对这个一个硬件意味着什么?)

3、WFI指令的用途

WFI指令的主要目的就是使core进入standby模式,直到中断或者类似中断的事件发送,才退出,core继续工作。

standby 模式- 待机模式

在待机模式下,core保持上电状态,但其大部分时钟停止或者进入时钟门限。这意味着core的绝大部分都处于static state,唯一消耗的功率是用于寻找中断唤醒条件的泄漏电流和少量逻辑时钟。

使用 WFI(等待中断)或 WFE(等待事件)指令可以进入此模式。 ARM 建议在 WFI 或 WFE 之前使用数据同步屏障 (Data Synchronization Barrier ,DSB) 指令,以确保待处理的内存事务在更改状态之前完成。

core进入待机状态后,会停止执行,直到检测到唤醒事件。唤醒条件取决于进入指令。对于 WFI,需要中断事件或外部调试请求来唤醒core。对于 WFE,存在许多指定的事件,包括cluster中执行 SEV 指令的另一个core。

WFI 指令广泛用于电池供电的系统。例如,手机可以每秒多次将core置于待机模式,同时等待用户按下按钮才唤醒core,从而可以节省功耗。

WFE 类似于 WFI。core暂停执行,直到发生事件。这可以是列出的事件条件之一,也可以是cluster中另一个core发出的事件信号。其他core可以通过执行 SEV 指令来发出事件信号。 SEV 向所有core发送一个事件信号。还可以对generic timer通用定时器进行编程,以触发将core从 WFE 唤醒的周期性事件。

总而言之,WFI 指令可以提示hint core在接收到中断或类似的exception之前无需执行任何操作,具体来说有两部分:

  • 1、强制暂停core的运行以及所有相关的总线活动。
  • 2、暂停处理器执行指令。

4、WFI指令的唤醒事件

WFI可以使core进入待机状态,而将core从待机状态中唤醒,则需要中断事件或者类似中断事件的exception(debug事件):

  • 物理的IRQ中断,但是忽略 CPSR寄存器的 I 位.
  • 物理的FIQ中断,但是忽略 CPSR寄存器的 F 位.
  • 物理的异步abort,但是忽略 CPSR寄存器的 A 位.
  • 异步的调试事件(debug event),当启用侵入式调试(invasive debug)并允许调试事件时,比如Trace 32中的 break 操作,也会将core唤醒。
  • 包括其他实现定义的硬件机制来生成 WFI 唤醒事件.

5、WFI使用注意事项

  • 在WFI指令之前使用 DSB 、DMB等内存屏障指令,使得core在进入待机模式之前,完成内存交互。
  • 当硬件检测到WFI唤醒事件后,WFI指令才算执行完成。
  • WFI唤醒事件不能被CPSR中的相关掩码(I F A)等bit 位屏蔽,即忽略CPSR中的IFA相关bit 位。
  • ARM架构并未定义低功耗状态的确切性质,但 WFI 指令的执行不得导致内存一致性遭受破坏。
  • 如果是为了测试中断事件而使用WFI,注意在中断发生和WFI之间不应有耗时事件(如大量的printf打印),否则有可能导致中断丢失,即中断已经处理完成了才执行WFI指令,此时中断已经消失了,但是WFI还在一直等中断。use case如下:

当检测到中断时,WFI指令才算完成,才会唤醒处理器,假设有这样一个use case:

Timer(10); // 假设这是个timer,10秒后将发起中断,中断handler在其他地方定义
WFI();   //如果处理器没有接收到中断,WFI指令将没有完成,一直处于休眠状态,下一条printf也不会被执行
printf("中断发生,WFI检测到中断");

正常情况下是可以看到打印的,但是,在timer和WFI之间加入一个耗时事件:

Timer(10); // 10秒后将发起中断
WasteTime(20); // 执行这个函数需要20秒
WFI();   //从中断发生,到处理完成中断用不了10秒,执行到WFI时,中断已经消失了,所以CPU会一直处于休眠状态,下面的printf也不会被执行
printf("中断发生,WFI检测到中断");

额外的知识关于时钟

在群里请教了前辈们的知识,感觉讲的很清晰。又长知识了,向前辈致敬。

问:不怎么了解硬件,想请教一下前辈们芯片的时钟有多重要。为什么休眠的时候说时钟停了,然后core就休眠了

答:一般的硬件都有个基础的时钟作为所有逻辑部分的"心跳"来源, 通常的做法是: 晶体振荡器稳定在一个固定的频率, 然后由一个压控振荡器以晶振作为参考进行倍频, 然后在经过分频逻辑给到芯片上的各个逻辑部分. 所以各个控制器的时钟都是可控的, 这有利于降低芯片的功耗。
换句话说, 芯片真正费电的部分: 逻辑翻转(受时钟驱动的同步/异步逻辑)和电路之间的漏电流(工艺问题), 现在的工艺牛逼了, 逻辑部分翻转的损耗低, 功耗就低. 而且这里还有个有点: 就是工艺的nm越小, 就翻转的电压越小, 频率响应越高, 频率就可以做的更高. 但是硅这个东西的频率总是有个上限, 就是超10GHz, 全人类感谢你的那个上限. 硅基的芯片貌似上10GHz这辈子不太可能了。core的时钟如果没了, core就不能"动"了。
时钟倍频后靠PLL锁的, PLL就是那个压控的倍频器件, 温度太高的时候, 芯片容易跑飞也大多数是PLL锁不住了, 偏移得太厉害, 就直接飞了

ARM hint instruction-WFI(Wait For Interrupt)指令的一些笔记相关推荐

  1. ARM hint instruction-WFI(Wait For Interrupt)指令详解

    WFI(Wait For Interrupt)指令是ARM中的一个Hint 指令,内核执行hint指令的时候不需要依赖额外的处理操作.WFI指令可以让CPU进入standby 模式,即低功耗模式,此时 ...

  2. _WFI/WFE指令Wait For Interrupt is a hint instruction that suspends execution暂停执行,在此挂起等待 until中断或者事件发生

    由下文总结:所以睡眠和停机模式下唤醒,执行完中断返回到此指令的下一程序指令地址开始执行.待机模式唤醒(参考手册明确提到)后相当于单片机复位 进入低功耗模式的两个指令,这是ARM里CMSIS内核中的指令 ...

  3. ARM assembly instruction set 汇总(一)

    ARM Core指令现在越来越强大,同时又因此能耗低,现在越来越广泛地应用于移动设备中.随着3G时代的到来,各种移动终端设备中都有多媒体功能,而且是功能越多且性能越优.很多smartphone上都能播 ...

  4. 【Android 逆向】函数拦截 ( GOT 表拦截 与 插桩拦截 | 插桩拦截简介 | 插桩拦截涉及的 ARM 和 x86 中的跳转指令 )

    文章目录 一.GOT 表拦截与插桩拦截 二.插桩拦截简介 三.插桩拦截涉及的 ARM 和 x86 中的跳转指令 一.GOT 表拦截与插桩拦截 函数拦截有 222 种方式 : 使用 GOT 表进行函数拦 ...

  5. Vue学习(入门实例、常用指令)-学习笔记

    文章目录 Vue学习(入门实例.常用指令)-学习笔记 实例 常用指令 v-on v-bind v-for v-html v-if event v-model 双向数据绑定实现 - defineProp ...

  6. Vue -- 指令【学习笔记】(持续更新)

    Vue – 指令[学习笔记](持续更新) 记录了Vue第三天的学习笔记 v-show 注意,v-show 不支持 <template> 元素,也不支持 v-else. 带有 v-show ...

  7. ARM V8 base instruction -- WFI

    WFI 等待中断(Wait For Interrupt)指令. 执行WFI指令后,当前CPU核会立即进入低功耗状态. 如果当前CPU核通过WFI指令进入了低功耗模式,那么只有在如下情况下才可能被重新唤 ...

  8. Purpose of cmove instruction in x86 assembly? | cmove 指令如何避免错误的分支预测带来的开销?

    cmove 指令是用来做什么的?(Purpose of cmove instruction in x86 assembly?) The purpose of cmov is to allow soft ...

  9. ARM 原子操作里的两个汇编指令

    今天一个读者朋友给我留言,问了这个问题,ARM原子操作的汇编代码,还给我截图了两个不同的解释,让我说哪个是正确的. 原子操作的起因是为了内核同步,保证数据在正确性,之前已经吹过一波,可以看这几篇文章. ...

最新文章

  1. 国家标准油类计算机,食用油新国标正式实施 产品配方将不再是“机密”
  2. 面试题05-UI控件
  3. 有奖话题讨论:你的互联网从业故事
  4. Voice LAB-1 CUBE Cisco Unified Border Element
  5. CentOS 6.5 PYPI本地源制作
  6. 面对百亿用户数据,日均亿次请求,携程应用架构如何涅槃?
  7. crypto-js RC4和hash_hmac运用
  8. Google MapReduce架构设计
  9. javascript(js)获取访客通过搜索引擎进入页面的搜索关键词的简洁有效代码
  10. 老男孩博客园杨海潮MySQL--MySQL机构逻辑2
  11. leetcode1300. 转变数组后最接近目标值的数组和
  12. iphone闪退修复工具_支持iOS13~13.3越狱工具发布(附下载地址)
  13. python计算两字符串中的位置_从Python中的字符串中获取两个字符
  14. linux复制文件中内容吗,Linux中实现对文件内容的复制。。。
  15. jpeglib的jpeg_finish_compress函数疑似越界
  16. 配置RADIUS服务器
  17. 基于51单片机的智能路灯照明控制系统proteus仿真原理图程序设计
  18. 6、Latex学习笔记之参考文献篇
  19. matlab中用if语句,matlab if语句如何使用
  20. mybatis 级联查询

热门文章

  1. sqlserver2008R2在配置复制分发时报错:在执行xp_cmdshell的过程中出错
  2. matplotlib绘制直方图之基本配置——万能模板案例
  3. 文件夹打包成pkg_linux如何解压tar.gz到指定文件夹或目录
  4. Android4.0.x 安全模式的分析
  5. Vue ElementUI 表单设计器 代码生成器
  6. Ubuntu 安装jdk17
  7. docker 制作镜像并push至私有仓库
  8. Oracle之数据库升级——升级补丁修复概述
  9. 树莓派+电子纸+respbian 自制电子书阅读器(1)
  10. 无线网络***(-)