【RH850芯片】RH850U2A芯片平台Spinlock的底层实现

news2024/12/26 11:16:05

目录

前言

正文

1.RH850U2A上的原子操作

1.2 Link generation

1.3 Success in storing

1.4 Failure in storing

1.5 Condition for successful storing

1.7 示例代码

2.Spinlock代码分析

2.1 尝试获取Spinlock

2.2 释放Spinlock

3.总结


前言

通过<<【OS】AUTOSAR架构下多核通信>>一文中我们知道Spinlock自旋锁用于多核通信间的数据一致性保护。那么,Spinlock到底是什么了,“自旋”的含义又是啥了? 本文就来分析RH850U2A芯片平台下Spinlock的底层实现

问题:如何理解Spinlok自旋锁中的”自旋“的含义?

缩略词

简写

全称

PSW

Program State Word

正文

1.RH850U2A上的Spinlock实现

LDL和STC指令可用于获取原子读-写操作,用于多核系统对内存更新进行精确处理。LDL和STC指令的操作方式如下。

每个CPU只能创建一个Link(LLbit)。该链接包含关于创建它的地址的信息,并根据STC指令在该地址是否成功或失败以及该链接是否丢失来进行接下来的控制。该链接还包括创建链接时的数据大小信息,因此,数据大小与创建链接的LDL指令不同的任何STC指令总是会失败,STC指令失败则该链接被删除。

1.2 Link generation

每个CPU都能够生成一个到Local RAM和cluster RAM的链接。

在目标RAM上执行LDL指令导致链接地址被注册,同时设置链接标志,并响应该指令读取生成链接。

(a)每个CPU的Local RAM

(b)Cluster RAM

每个CPU都能够生成一个到(a)或(b)的链接。

1.3 Success in storing

在生成Link之后,存储将只响应执行与生成的链路对应的STC指令而进行,也就说说该存储地址只能通过STC指令写入。

1.4 Failure in storing

如果链路丢失,即使处理相应地址的STC指令,存储也不会继续。当处理与链接不对应的STC指令时,也不会继续存储。

个人理解:Link是一个抽象概念,通过LDL指令能够创建一个link,且每个CPU只能创建一个Link,通过STC指令能

1.5 Condition for successful storing

如果满足以下条件,则判定STC指令为与该链路对应的地址:

生成链接的LDL指令的地址和大小与STC指令的地址和大小相匹配。

当满足某些事件或地址条件时,链接将丢失。表1显示了Link loss情况。如果满足此表中所示的任何条件,则一个链接就会丢失。

Table 1 Link Loss Conditions

Note: 在Local RAM中,如果执行了除STC/CAXI指令以外的存储指令,则链接并不总是丢失。因此,触使Link Loss的指令程序流是可以不需要的。例如,在接下来的示例代码中,在使用LDL指令读取锁变量后,只有在没有锁的情况下才执行STC指令,如果锁已经存在(Link已经建立)则通过Lock Release对应的Link Loss程序流就是不需要的。也就是说,LDL指令Link成功,STC指令存储成功(创建一个Lock),之后的ST等存储指令用于Link Loss才是有意义的。也就是只有GetSpinlock成功之后才能ReleaseSpinlock.

1.7 示例代码

通过使用LDL.W和STC.W指令执行的自旋锁的示例代码如下所示。

一行一行的来分析这段汇编代码:

MOV lock_adr, r20 //lock_adr这个地址值赋值给r20寄存器,lock_adr可以理解为一个存在于RAM的全局变量的地址。

LDL.W [r20], r21 //以原子操作的方式加载r20寄存器保存的地址所在的值给r21寄存器。这个指令执行完后,r20存储lock_adr地址值(全局变量的地址),r21保存了lock_adr地址指向的具体变量值(全局变量的值)。Link Generation

CMP r0, r21 //r0寄存器中值与r21寄存器中的值进行比较。

Note 1: r0是Zero寄存器,其值永远为0.

Note 2: CMP指令的结果在程序状态字寄存器的PSW.Z bit上体现,比较的两个值如果相等则PSW.Z =1;反之,比较的两个值不相等,则PSW.Z = 0.

BNZ lock_wait //如果上一次的cmp结果不为0,则跳转到lock_wait标识符地址处往下执行。

MOV 1, r21 //将1赋值给r21寄存器。r21寄存器中保存的值为1.

STC.W r21, [r20] //将r21寄存器保存的值(1)赋值给r20保存的地址指向的变量。Success in storing.

CMP r0, r21 //比较r0(always retains 0)和r21寄存器中保存的值(也就是比较0和1)。

BNZ lock_success //如果上一次的cmp结果不为0,则跳转到lock_success标识符地址处往下执行。

Lock_wait: SNOOZE

Note: SNOOZE指令是一种在自旋锁期间减少总线带宽使用的指令。该指令完成后,CPU核心进入临时停止状态,以限制后续指令的执行。程序员可以通过将此指令插入到一个自旋锁循环中,从而避免由于短期重复锁定过程而导致的不必要的总线带宽的使用。

BR Lock //无条件跳转到Lock标识符处

Lock_success: //一个标识符,运行到这里表明get spinlock成功,继续往下执行。

ST.W r0, 0[r21] //王r21寄存器保存的地址值指向的变量写入0值。Release spinlock.

2.Spinlock代码分析

2.1 尝试获取Spinlock

准备获取Spinlock的时候,外部就是一个While循环,直到成功获取到Spinlock,否则就会“自旋”。

2.2 释放Spinlock

释放Spinlock对应的C代码,只需将标识Spinlock的全局变量赋值为0即可(对应ST.W r0, 0[r21]的汇编代码)。

3.总结

本文详细分析了Spinlock在RH850U2A芯片平台上的底层实现,着重需要理解RH850U2A芯片架构中的Link概念。Spinlock对应的底层两个特殊的汇编指令:LDL.W和STC.W. 在C语言环境下调用GetSpinlock()的具体实现也就是调用OS_LDLW()和STC_STCW()。值得注意的是,Spinlock的底层实现和具体芯片特性相关,其他芯片平台(比如Tricore芯片)的底层具体实现可能就不一样了,需要具体分析。

问题:如何理解Spinlok自旋锁中的”自旋“的含义?

:“自旋”对应底层的SNOOZE指令。当前CPU(Core x)执行LDL.W没有建立Link后,CPU执行SNOOZE指令暂停一个机器周期,随后再次尝试去执行LDL.W指令,直到建立Link成功(其他CPU释放Spinlock),这个过程对应“自旋”的含义。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1224414.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一款带数字传输信号的OVP芯片

基本概述 今天给大家介绍的一款芯片是OVP&#xff0c;相比于传统的OVP芯片来说&#xff0c;这款芯片新增了数字信号控制&#xff0c;可以进行10Mbps的一个通信&#xff0c;通过外部的GPIO口进行控制&#xff0c;达到输入与输出信号的产生。 YHM2009这款OVP芯片具有较低的导通…

深度学习数据集—细胞、微生物、显微图像数据集大合集

最近收集了一大波关于细胞、微生物、显微图像数据集&#xff0c;有细胞、微生物&#xff0c;细菌等。 接下来是每个数据的详细介绍&#xff01;&#xff01; 1、12500张血细胞增强图像&#xff08;JPEG&#xff09;数据集 该数据集包含12500张血细胞增强图像&#xff08;JPE…

freetype将字符串制作成位图并显示过程详解

在流媒体项目中字幕显示是不可或缺的一环&#xff0c;一般会有字幕流在视频播放过程中进行显示&#xff1b;不过还有很多情况是从头到尾只在视频的某个区域显示某些文字&#xff0c;例如某个电视台的log&#xff1b;这种也称为字幕&#xff0c;如果想要将这些字符串显示到视频&…

OpenGL_Learn13(材质)

1. 材质 cube.vs #version 330 core layout (location 0) in vec3 aPos; layout (location 0 ) in vec3 aNormal;out vec3 FragPos; out vec3 Normal;uniform mat4 model; uniform mat4 view; uniform mat4 projection;void main() {FragPosvec3(model*vec4(aPos,1.0));Norma…

各类软件docker安装

docker Docker 要求 CentOS 系统的内核版本高于 3.10 &#xff0c;通过 uname -r 命令查看你当前的内核版本&#xff1a; uname -r 3.10.0-1062.1.2.el7.x86_64 安装 Docker&#xff1a; 安装 Docker&#xff1a;yum -y install dockerkafka和zookeeper docker pull wurstmei…

基于springboot实现私人健身与教练预约管理系统项目【项目源码+论文说明】

基于springboot实现私人健身与教练预约管理系统演示 摘要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应…

基于libcurl+libopenssl开源库编译出curl下载工具及代码集成curl功能

准备素材&#xff1a; 1. openssl的版本&#xff1a; openssl-1.1.1w.tar.gz 2.curl的版本&#xff1a;curl-8.4.0.tar.gz 目标&#xff1a; 1.编译出openssl库&#xff1b; 2.编译出curl可执行文件及库&#xff1b; 步骤一&#xff1a;先解压压缩包 tar -zxvf openssl-1…

【Linux从入门到放弃】环境变量

&#x1f9d1;‍&#x1f4bb;作者&#xff1a; 情话0.0 &#x1f4dd;专栏&#xff1a;《Linux从入门到放弃》 &#x1f466;个人简介&#xff1a;一名双非编程菜鸟&#xff0c;在这里分享自己的编程学习笔记&#xff0c;欢迎大家的指正与点赞&#xff0c;谢谢&#xff01; 文…

mongodb使用简单文档

1、mongodb安装与卸载 1.1、安装 python -m pip install pymongo 或 pip install pymongo如果要安装指定版本&#xff1a; python -m pip install pymongo3.5.1对已有的版本进行升级&#xff1a; python -m pip install --upgrade pymongo1.2、卸载 pip uninstall pymongo…

【MATLAB】史上最全的5种数据插值算法全家桶

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 大家吃一顿火锅的价格便可以拥有5种数据插值算法&#xff0c;绝对不亏&#xff0c;知识付费是现今时代的趋势&#xff0c;而且都是我精心制作的教程&#xff0c;有问题可随时反馈~也可单独获取某一算法的代码&#xff08…

使用vant list实现订单列表,支持下拉加载更多

在公司项目开发时&#xff0c;有一个需求是实现可以分页的订单列表&#xff0c;由于是移动端项目&#xff0c;所以最好的解决方法是做下拉加载更多。 1.在页面中使用vant组件 <van-listv-model"loading":finished"finished"finished-text"没有更…

kubernetes|云原生| 如何优雅的重启和更新pod---pod生命周期管理实务

前言&#xff1a; kubernetes的管理维护的复杂性体现在了方方面面&#xff0c;例如&#xff0c;&#xff50;&#xff4f;&#xff44;的管理&#xff0c;服务的管理&#xff0c;用户的管理&#xff08;&#xff32;&#xff22;&#xff21;&#xff23;&#xff09;&#xf…

RT-DETR算法优化改进:SCConv,空间和通道重建卷积 | CVPR2023 | 卷积变体大作战

💡💡💡本文改进:SCConv(空间和通道重建卷积),一个即插即用的架构单元,可以直接用来替代各种卷积神经网络中的标准卷积。 1)放入Neck RepC3后面; RT-DETR魔术师专栏介绍: https://blog.csdn.net/m0_63774211/category_12497375.html ✨✨✨魔改创新RT-DETR �…

98.qt qml-使用曲线图综合示例、支持多种鼠标交互、支持百万数据显示(已适配黑白风格)

在上章我们只是简单实现了曲线图和折线图的显示: 79.qt qml-如何在QML中使用QCustomPlot之曲线/折线示例(已适配黑白风格)_qml 折线图_诺谦的博客-CSDN博客 所以本章实现综合示例、并添加多种功能如下所示: 详细显示:鼠标任意移动显示具体值内容鼠标右击: 弹出菜单栏,支持…

华夏ERP打包手册

Maven安装及环境配置 1.下载 浏览器搜索maven点击apache Maven 2.选择安装目录&#xff0c;注意不能有中文 3.环境变量配置 点击计算机右键属性>高级系统设置>环境变量 新建系统变量 MAVEN_HOME 变量值是安装目录 进入path点击新建点击编辑&#xff0c;写入% MAVEN_H…

【Unity】单例模式及游戏声音管理类应用

【Unity】单例模式及游戏声音管理类应用 描述 在日常游戏项目开发中&#xff0c;单例模式是一种常用的设计模式&#xff0c;它允许在应用程序的生命周期中只创建一个对象实例&#xff0c;并提供对该实例的全局访问点。通过使用单例模式&#xff0c;可以提高代码的可维护性和可…

人工智能轨道交通行业周刊-第65期(2023.10.30-11.19)

本期关键词&#xff1a;高铁自主创新、智慧城轨、调车司机、大模型垂直应用、大模型幻觉 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro轨道…

PaddlePaddle:开源深度学习平台

深度学习作为人工智能领域的重要分支&#xff0c;正在全球范围内得到广泛应用。而在构建和训练深度学习模型时&#xff0c;选择一个高效、易用且功能强大的开源平台是至关重要的。PaddlePaddle&#xff08;即飞桨&#xff09;作为国内领先的深度学习平台&#xff0c;一直以来都…

【代码随想录】算法训练计划23

1、669. 修剪二叉搜索树 题目&#xff1a; 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即&#xff0c;如果没有被移除&…