当前位置: 首页 > news >正文

【ARMv8/v9 异常模型入门及渐进 10 -- WFI 与 WFE 使用详细介绍 1】


请阅读【ARMv8/v9 ARM64 System Exception】


文章目录

    • WFI 与 WFE
      • 等待事件(WFE)
      • 发送事件(SEV)
      • 本地发送事件(SEVL)
      • WFE 唤醒事件
    • WFE 使用场景举例与代码实现
      • wfe睡眠函数
      • sev 事件唤醒函数
      • 全局监视器和自旋锁

WFI 与 WFE

ARMv8架构提供了几个与事件相关的指令,包括等待事件(WFE)、发送事件(SEV)和本地发送事件(SEVL),这些指令有助于减少因处理器元素(PE,Processor Element)反复尝试获取自旋锁(spin-lock)而导致的功耗和总线竞争。这些指令在应用层面上是可用的,但要完全理解它们的行为,需要系统级别的异常处理知识。下面详细介绍这三个指令的功能及其对系统性能优化的影响。

等待事件(WFE)

WFE指令使得一个处理器元素可以进入低功耗状态,直到发生以下情况之一:

  • 发生了一个异常。
  • 接收到一个事件信号。
  • 如果存在外部中断,处理器也可能被唤醒,即使这个中断最终被处理器的状态所屏蔽。

WFE指令通常用于自旋锁等待循环中,允许处理器在等待锁释放的时候降低功耗。

发送事件(SEV)

SEV指令用于在同一系统中的一个或多个处理器元素之间发送事件信号。当一个处理器执行SEV指令时,它将触发系统中所有正在执行WFE指令等待事件的处理器元素退出等待状态。 在自旋锁释放后使用SEV指令可以唤醒等待该锁的其他处理器元素,这有助于减少等待时间和功耗。

关于spin_lock与独占访问的关系推荐阅读
【ARM AMBA AXI 入门 7 - AXI 协议中的独占访问 使用背景介绍】
【ARM AMBA AXI 入门 6 - AXI3 协议中的锁定访问之AxLOCK信号】

本地发送事件(SEVL)

SEVL指令与SEV类似,但它只确保发出事件信号的处理器元素本身在下一次执行WFE指令时立即返回,而不进入等待状态。这有助于优化特定的同步模式,其中处理器元素可能需要在检查某个条件后立即继续执行,而不是等待。

WFE 唤醒事件

WFE(Wait For Event)指令让处理器进入等待状态,直到发生特定的唤醒事件(Wake-up Events)。这些事件可以来自多种不同的源,以下介绍了在AArch64状态下可以触发WFE指令唤醒处理器的事件:

  1. 执行SEV指令:在多处理器系统中,任何处理器元素(PE)执行SEV(Send Event)指令都可以作为一个唤醒事件。SEV指令用于在PE之间发送全局事件信号。
  2. 物理SError中断、IRQ中断或FIQ中断:如果PE收到物理SError中断、IRQ(Interrupt Request)中断或FIQ(Fast Interrupt Request)中断,并且该中断没有被EDSCR.INTDIS(一个调试寄存器的一部分,用于禁用中断)禁用,那么这个中断会作为一个唤醒事件。
  3. 异步外部调试请求:如果允许暂停执行(Halting),那么一个异步外部调试请求也可以作为一个唤醒事件。这种情况通常与调试过程有关。
  4. 由处理器元素的定时器事件流发送的事件:处理器元素的定时器可以配置为在特定时间点发送事件,这些事件也能唤醒处于WFE等待状态的PE。
  5. 全局监视器清除造成的事件:当PE的全局监视器从独占访问状态变为开放访问状态时,会生成一个事件,这也可以唤醒等待的PE。
  6. 由某些实现定义机制发送的事件:特定的硬件实现可能提供了其他机制来生成唤醒事件,这些机制依赖于具体的硬件设计和配置。
  7. 实现FEAT_WFXT特性时的本地超时事件:当实现了FEAT_WFXT特性,并且使用WFET指令时,如果虚拟计数器阈值(在CNTVCT_EL0寄存器中表示)被等于或超过,就会产生本地超时事件作为唤醒事件。

WFE 使用场景举例与代码实现

这里以 多核系统中主核 core0 启动后去唤醒处于睡眠状态的从核 core1 为例 并测试。

首先使用汇编代码实现 sevwfe 的调用函数:

wfe睡眠函数

func enter_wfewferet
endfunc enter_wfe

sev 事件唤醒函数

func arm_sevsevret
endfunc arm_sev

从核启动函数(截取部分)

    ...log_debug("\rcore%d run wfe then goto sleep\n", coreid_get());enter_wfe ();log_debug("\rcore%d wakeup from wfe\n", coreid_get());enter_wfe ();
  • 场景是主核core0先启动,然后使用命令手动去启动从核core1, core1 启动后后面执行到 enter_wfe 之后就会睡眠,
  • 然后主核执行 sev 指令来唤醒从核,然后从核醒后执行一句打印,然后再去执行 enter_wfe 继续睡眠。
    在这里插入图片描述

全局监视器和自旋锁

ARMv8架构中引入了全局监视器的概念,当处理器元素(PE)的全局监视器从独占访问状态变为开放访问状态时,会自动生成一个事件。这相当于在PE上执行了SEVL指令。因此,当一个PE释放自旋锁时,不再需要在代码中显式包含SEV指令来唤醒等待锁的其他PE,系统会自动生成相应的事件,

这简化了编程模型并有助于提高效率。 这种机制特别适用于多核处理器环境中的同步问题,可以减少因PE反复尝试获取自旋锁而导致的功耗和总线竞争,进而提升系统性能和能效。

相关文章:

【ARMv8/v9 异常模型入门及渐进 10 -- WFI 与 WFE 使用详细介绍 1】

请阅读【ARMv8/v9 ARM64 System Exception】 文章目录 WFI 与 WFE等待事件(WFE)发送事件(SEV)本地发送事件(SEVL)WFE 唤醒事件 WFE 使用场景举例与代码实现wfe睡眠函数sev 事件唤醒函数全局监视器和自旋锁 …...

@DateTimeFormat 和 @JsonFormat 的区别和使用方式

一. DateTimeFormat 详细用例 DateTimeFormat 是 Spring Framework 的一部分,它用于绑定 Web 请求中的字符串到 Java 的日期和时间类型。这种转换常常在 Spring MVC 控制器中处理 HTTP 请求参数或路径变量时使用。 使用场景: 将 HTTP 请求中的日期(也就是网络传输…...

C++—结构体

结构体(struct),是一种用户自定义复合数据类型,可以包含不同类型的不同成员。 结构体的声明定义和使用的基本语法: // 声明结构体struct 结构体类型 { 成员1类型 成员1名称; ...成员N类型 成员N名称; };除声明…...

指针与引用

指针与引用 一:指针与引用场景二级目录三级目录 一:指针与引用场景 二级目录 三级目录...

使用 mysql-binlog-connector 监听处理 MySQLBinlog 文件

1. 需求概述 业务开发中经常需要根据一些数据变更实现相对应的操作。例如,一些用户注销自己的账户,系统可以给用户自动发短信确认,这时有两种解决方案,一种是耦合到业务系统中,当用户执行注销操作的时候,执…...

CF Div2 729 Plus and Multiply

原题链接:Problem - 1542B - Codeforces 题目大意:初始集合里面只有1,给a和b,可以对集合里面的数x进行二种操作,x*a,xb,并放入集合,给数n,问集合里面会不会产生n,会就输…...

Joomla 3.7.0 (CVE-2017-8917) SQL注入漏洞环境

1 漏洞概述 Joomla是一个基于PHP的内容管理系统(CMS),广泛应用于各类网站。2017年,Joomla 3.7.0版本被发现存在SQL注入漏洞(CVE-2017-8917),攻击者可以利用该漏洞对数据库进行未授权查询或操作…...

Python高克勒-曼宁-斯特里克勒公式计算一维流量

📜曼宁公式-用例 📜Python流体数据统计模型和浅水渗流平流模型模拟 | 📜Python蒸发散物理问题(微积分-线性代数-拉普拉斯和傅立叶变换) ✒️Python计算一维流量 高克勒-曼宁-斯特里克勒公式公式基于一维(横截面平均&#xff09…...

【GD32系列--基本定时器Timer + 定时1ms 灯光间隔1s闪烁例程】

这里写目录标题 一、定时器的作用二、定时器简介1、定时器类型2、时钟树3、定时器功能配置框图 三、定时器寄存器分析1、控制寄存器(TIMERx_CTL0))2、DMA 和中断使能寄存器 (TIMERx_DMAINTEN)3、预分频寄存器 (TIMERx_PSC)4、计数器自动重载寄存器 (TIME…...

第11章 集合与迭代器

目录 目录 目录 11.1 Collection集合 11.1.1 集合的概念 11.1.2 Collection接口 1、添加元素 2、删除元素 3、查询与获取元素 11.2 List 有序集合 11.2.1 新增方法 11.2.2 ArrayList 11.2.3 LinkedList 1、单向链表 2、双向链表 3、删除元素 11.3 Set 无序集合 …...

探索Linux中的神奇工具:探秘tail命令的妙用

探索Linux中的神奇工具:探秘tail命令的妙用 在Linux系统中,tail命令是一个强大的工具,用于查看文件的末尾内容。本文将详细介绍tail命令的基本用法和一些实用技巧,帮助读者更好地理解和运用这个命令。 了解tail命令 tail命令用…...

1688商品API接口:电商数据自动化的新引擎

1688作为中国领先的B2B电子商务平台,为广大商家和制造商提供了一个展示和交易商品的广阔市场。随着1688商品API接口的推出,开发者和商家现在能够通过编程方式自动化获取和管理商品数据,极大地提高了工作效率和数据处理的灵活性。 一、1688商…...

路由器不能端口映射什么原因?如何设置内网映射?

近期有小伙伴发来求助信息,他以前开游戏服务器和别人一起玩,那个时候端口映射还好,不知道哪一天开始突然不行了,已经是公网了,光猫是桥接的状态,连路由器都换了,就是不能端口映射开服务器&#…...

开源RAG,本地mac启动 dify源码服务

一、Dify文档 参考官方文档来操作,基本没太大的问题。一些细节,我在本篇文章中补充了出来。 这篇文章主要讲以源码的方式启动后端服务,前端服务使用容器启动。 dify 文档地址 欢迎使用 Dify | 中文 | Dify Dify 本地源码部署文档&#xff…...

【Linux取经路】基于信号量和环形队列的生产消费者模型

文章目录 一、POSIX 信号量二、POSIX 信号量的接口2.1 sem_init——初始化信号量2.2 sem_destroy——销毁信号量2.3 sem_wait——等待信号量2.4 sem_post——发布信号量 三、基于环形队列的生产消费者模型3.1 单生产单消费模型3.2 多生产多消费模型3.3 基于任务的多生产多消费模…...

计算机SCI期刊,中科院2区,收稿范围非常广泛!

一、期刊名称 Journal of Web Semantics 二、期刊简介概况 期刊类型:SCI 学科领域:计算机科学 影响因子:2.5 中科院分区:2区 出版方式:开放出版 版面费:$1600 三、期刊征稿范围 《网络语义学杂志》…...

JDK、JRE、编译指令和垃圾回收机制详解

JDK 全称 Java SE Development Kit (Java 开发工具包) JVM虚拟机:Java运行的地方 核心类库:Java提前编好的东西 开发工具: javac,java,jdb,jhat javac:Java编译器,用于将Java源代码编译成Java字节码文件(.class)。 java: java…...

【ARM 嵌入式 C 入门及渐进 6.2 -- ARMv8 C 内嵌汇编读系统寄存器的函数实现】

请阅读【嵌入式开发学习必备专栏】 文章目录 ARMv8 C 内嵌汇编读系统寄存器 ARMv8 C 内嵌汇编读系统寄存器 要在ARMv8架构中通过C代码和内嵌汇编来读取系统寄存器s3_0_c15_c5_5的值,并将其返回,可以按照以下方式实现system_read_reg函数: #…...

使用 LlamaParse 进行 PDF 解析并创建知识图谱

此 Python 笔记本提供了有关利用 LlamaParse 从 PDF 文档中提取信息并随后将提取的内容存储到 Neo4j 图形数据库中的综合指南。本教程在设计时考虑到了实用性,适合对文档处理、信息提取和图形数据库技术感兴趣的开发人员、数据科学家和技术爱好者。 该笔记本电脑的主…...

Oracle行迁移解析

行迁移(Row Migration)是Oracle数据库中的另一个现象,它与行链接类似,都是由于数据行大小的变化导致的存储问题,但其本质和影响有所不同。 触发条件:行迁移发生在当一个已存在的、原先能够完全存储在一个数…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...