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

这篇具有很好参考价值的文章主要介绍了ARM hint instruction-WFI(Wait For Interrupt)指令详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

WFI(Wait For Interrupt)指令是ARM中的一个Hint 指令,内核执行hint指令的时候不需要依赖额外的处理操作。WFI指令可以让CPU进入standby 模式,即低功耗模式,此时内核会暂停其他活动,一直等待中断事件的发生,检测到中断发生后,WFI指令执行完成,CPU退出standby模式。

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

目录

一,ARM Hint 指令

二,WFI指令的用途

standby 模式- 待机模式

三,WFI指令的唤醒事件

四,WFI使用注意事项


一,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 处理器系列中,这些指令的实现方式是关闭几乎所有内核部分的时钟。这意味着内核的功耗显着降低,仅消耗静态漏电流,没有动态功耗。
 

二,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. 暂停处理器执行指令。

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

三,WFI指令的唤醒事件

WFI可以使core进入待机状态,而将core从待机状态中唤醒,则需要中断事件或者类似中断事件的exception(debug事件):文章来源地址https://www.toymoban.com/news/detail-474399.html

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

四,WFI使用注意事项

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

到了这里,关于ARM hint instruction-WFI(Wait For Interrupt)指令详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • IAR For ARM 安装教程

    1、官网下载 ①搜索 IAR ②切换产品,选择Arm ③选择IAR Embedded Workbench for Arm ④免费试用 2、网盘下载 EWARM-CD-8202-14838.exe(访问密码: 1666) https://url48.ctfile.com/f/33868548-961057458-611638?p=1666 1、点击安装 选择V8.202版本 2、选择 Install IAR Embedded Workbench for Arm 3、默认安装流程 4、建议安装到

    2024年02月08日
    浏览(44)
  • ARM 编译器 Arm Compiler for Embedded 6 相关工具链简介

    目录 1, Introduction to Arm® Compiler 6 1.1 armclang 1.2 armasm 1.3 armlink 1.4 armar 1.5 fromelf 1.6 Arm C++ libraries 1.7 Arm C libraries 1,8 Application development ,ARM程序开发流程 2,ARM 编译器 5和ARM 编译器 6的兼容性 3,ARM编译器相关链接 Arm Compiler 6 是 Arm 中用于 Arm Cortex® 和 Arm Neoverse™ 处理器的最先

    2023年04月12日
    浏览(32)
  • IAR for ARM、MSP430、8051 保姆式安装教程 (附IAR for ARM、MSP430、8051安装包和工程源码)

    IAR for ARM、Msp430、8051安装包和工程源码都一并放置文章底部(永久有效),有需要 自提即可。 IAR Embedded Workbench 是瑞典IAR Systems公司为 微处理器开发的一个集成开发环境,支持ARM,AVR,MSP430等芯片内核平台。 IAR Systems 是全球领先的嵌入式系统开发工具和服务的供应商。公司成立

    2023年04月08日
    浏览(42)
  • ESXi for ARM 最新下载地址

    由于VMware决定关闭 flings.vmware.com 网站,内容被迁移到不同的地方,网站跳转到 Code Samples and PowerCLI Example Scripts | VMware - VMware {code} ESXi for ARM的下载地址迁移到了 https://customerconnect.vmware.com/downloads/get-download?downloadGroup=ESXI-ARM,需要使用VMware Customer Connect账号登录。 相关文档迁

    2024年02月05日
    浏览(37)
  • 【STM32笔记】低功耗模式、WFI命令等进入不了休眠的可能原因(系统定时器SysTick一直产生中断)

    【STM32】低功耗模式、WFI命令等进入不了休眠的可能原因(系统定时器SysTick一直产生中断) 【STM32笔记】低功耗模式配置及避坑汇总 前文: blog.csdn.net/weixin_53403301/article/details/128216064 【STM32笔记】HAL库低功耗模式配置(ADC唤醒无法使用、低功耗模式无法烧录解决方案) __WFI

    2024年02月10日
    浏览(36)
  • Machine Interrupt Registers

    bit [15:0]记录interrupt的原因; bit[max:16]时user自定义的,默认不使用; 一个中断,trap to M-mode的条件如下: 当前是M-mode, mstatus.MIE==1,或者当前的权限等级低于M-mode, 此时不管当前的xIE是否为1,M-mode的中断总是有效的; 满足上面的条件后,还需要mip/mie对应bit的值都设置为1; 如

    2024年02月02日
    浏览(32)
  • Undefined symbols for architecture arm64

    解决问题之前,先了解清晰涉及到的知识点: iOS支持的指令集包含:armv6、armv7、armv7s、arm64,在项目TARGETS----Build Settings---Architecturs 可以修改对应的指令集,目前Standard Architectures(arm64, armv7)  XCode中可设置: 1、Architectures将制定项目将支持哪些指令集 2、Build Active Architecture

    2024年02月08日
    浏览(40)
  • Orange Pi5安装esxi for arm

    本文用到的所有文件: 链接:https://pan.baidu.com/s/16ZjpustvlI7rUdjIpIXGjg?pwd=u4nu  提取码:u4nu 首先下载orangepi5的uefi固件,github地址: Releases · edk2-porting/edk2-rk3588 (github.com) 也可以用上面度盘链接里的 用RKDevTool或在板子上用 SD 卡启动后将uefi刷入板子的SPINOR 然后用自己喜欢的方式把

    2024年04月08日
    浏览(31)
  • Java并发(九)----线程join、interrupt

    1.1 为什么需要 join? 下面的代码执行,打印 r 是什么? 分析 因为主线程和线程 t1 是并行执行的,t1 线程需要 1 秒之后才能算出 r=10 而主线程一开始就要打印 r 的结果,所以只能打印出 r=0 解决方法 用 主线程sleep 行不行?为什么? 这种方式不推荐,因为不清楚t1线程执行具

    2024年02月07日
    浏览(66)
  • Xcode14 解决 Building for iOS Simulator, but ... , file for architecture arm64

    为了适配iOS16, 迫不得已更新了mac到13.3.1,然后下载了xcode14.3。 然后迫不及待的打开咱们的工程,窝~豁~。。。报错 苹果还是尼玛一如既往的坑,一更新就莫名的需要去填坑。google了好几个,没有一个是准确的。于是自己去摸索。最后找到了下面的方法,顺利解决. 1. Build

    2024年02月15日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包