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

目录

前言

正文

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指令能改写CPU Link的RAM的值。

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),这个过程对应“自旋”的含义。

参考文档:

1.RH850/U2A-EVA Group: User’s Manual: Hardware

2.RH850G4MH: User’s Manual: Software

3.MULTI: Building Applications for Embedded V850 and RH850

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

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

相关文章

基于PyTorch搭建你的生成对抗性网络

前言 你听说过GANs吗&#xff1f;还是你才刚刚开始学&#xff1f;GANs是2014年由蒙特利尔大学的学生 Ian Goodfellow 博士首次提出的。GANs最常见的例子是生成图像。有一个网站包含了不存在的人的面孔&#xff0c;便是一个常见的GANs应用示例。也是我们将要在本文中进行分享的…

Spring Boot中使用MongoDB完成数据存储

我们在开发中用到的数据存储工具有许多种&#xff0c;我们常见的数据存储工具包括&#xff1a; 关系性数据库&#xff1a;使用表格来存储数据&#xff0c;支持事务和索引。&#xff08;如&#xff1a;MySQL&#xff0c;Oracle&#xff0c;SQL Server等&#xff09;。NoSQL数据…

Redis篇---第七篇

系列文章目录 文章目录 系列文章目录前言一、是否使用过 Redis Cluster 集群,集群的原理是什么?二、 Redis Cluster 集群方案什么情况下会导致整个集群不可用?三、Redis 集群架构模式有哪几种?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分…

OPPO Watch纯手机开启远程ADB调试

Wear OS手表中&#xff0c;我们可以直接在开发者设置中打开WiFi调试。但是这在OPPO等魔改Android系统中不再奏效。 需要什么&#xff1f;&#xff1f; 手表一台手机一个OTG转接头一个手表充电器一个 演示设备 手机&#xff1a; OPPO Find X手表&#xff1a; OPPO Watch 1代 …

Android——模块级build.gradle配置——applicationId和namespace

官方地址&#xff1a; 配置应用模块-applicationId和namespace了解 build.gradle 中的实用设置。https://developer.android.google.cn/studio/build/configure-app-module?hlzh-cn 产生那些异常场景&#xff1a; Android&#xff1a;Namespace not specified. Please spec…

Halcon (3):窗体常用语法使用

文章目录 文章专栏视频资源前言halcon图像使用加载图片示例绘制常用图像批量批注绘制 文章专栏 Halcon开发 视频资源 机器视觉之C#联合Halcon 前言 在使用halcon的算子之前&#xff0c;我们要先学会如何在图片上面进行标注。因为我们不仅要导出处理的结果&#xff0c;还要导出…

论文阅读:YOLOV: Making Still Image Object Detectors Great at Video Object Detection

发表时间&#xff1a;2023年3月5日 论文地址&#xff1a;https://arxiv.org/abs/2208.09686 项目地址&#xff1a;https://github.com/YuHengsss/YOLOV 视频物体检测&#xff08;VID&#xff09;具有挑战性&#xff0c;因为物体外观的高度变化以及一些帧的不同恶化。有利的信息…

Windows10电脑没有微软商店的解决方法

在Windows10电脑中用户可以打开微软商店&#xff0c;下载自己需要的应用程序。但是&#xff0c;有用户反映自己Windows10电脑上没有微软商店&#xff0c;但是不清楚具体的解决方法&#xff0c;接下来小编给大家详细介绍关于解决Windows10电脑内微软商店不见了的方法&#xff0c…

计算机的发展

硬件的发展 第一台电子数字计算机&#xff1a;ENIAC&#xff08;1946&#xff09;&#xff0c;作者&#xff1a;冯诺依曼&#xff0c;逻辑元件&#xff1a;电子管 bug&#xff1a;小虫子&#xff0c;会影响打点 Intel&#xff1a; 机器字长&#xff1a;计算机一次整数运算所能…

springcloudalibaba-3

一、Nacos Config入门 1. 搭建nacos环境【使用现有的nacos环境即可】 使用之前的即可 2. 在微服务中引入nacos的依赖 <!-- nacos配置依赖 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-…

深入Rust:探索所有权和借用机制

大家好&#xff01;我是lincyang。 今天&#xff0c;我们将一起深入探索Rust语言中的一个核心概念&#xff1a;所有权和借用机制。 这些特性是Rust区别于其他语言的重要特点&#xff0c;它们在内存管理和并发编程中扮演着关键角色。 一、Rust所有权机制 1. 什么是所有权&#x…

Qt HTTP 摘要认证(海康球机摄像机ISAPI开发)

接到一个需求是开发下海康的球机,控制云台,给到我的是一个开发手册,当然了是海康的私有协议 ISAPI开发手册https://download.csdn.net/download/qq_37059136/88547425关于开发这块读文档就可以理解了,海康使用的是摘要认证,当然了海康已经给出使用范例 通过libcurl就可以直接连…

C/C++---------------LeetCode第1189. “气球” 的最大数量

气球的最大数量 题目及要求统计法在main内使用 题目及要求 给你一个字符串 text&#xff0c;你需要使用 text 中的字母来拼凑尽可能多的单词 “balloon”&#xff08;气球&#xff09;。 字符串 text 中的每个字母最多只能被使用一次。请你返回最多可以拼凑出多少个单词 “ba…

Openssl X509 v3 AuthorityKeyIdentifier实验与逻辑分析

Openssl是X509的事实标准&#xff0c;目前主流OS或个别安全性要求较高的设计场景&#xff0c;对X509的证书链验证已经不在停留在只从数字签名校验了&#xff0c;也就是仅仅从公钥验签的角度&#xff0c;在这些场景中&#xff0c;往往还会校验AuthorityKeyIdentifier和SubjectKe…

Egress-TLS-Origination

目录 文章目录 目录本节实战1、出口网关TLS发起2、通过 egress 网关发起双向 TLS 连接关于我最后 本节实战 实战名称&#x1f6a9; 实战&#xff1a;Egress TLS Origination-2023.11.19(failed)&#x1f6a9; 实战&#xff1a;通过 egress 网关发起双向 TLS 连接-2023.11.19(测…

STM32_SPI总线驱动OLED详细原理讲解

目录 这里写目录标题 第13章 Cortex-M4-SPI总线13.1 SPI总线概述13.1.1 SPI总线介绍13.1.2 SPI总线接口与物理拓扑结构13.1.3 SPI总线通信原理13.1.4 SPI总线数据格式 13.2 IO口模拟SPI操作OLED13.2.1 常见的显示设备13.2.2 OLED显示屏概述13.2.3 OLED特征13.2.4 显示原理13.2.…

【图数据库实战】HugeGraph架构

一、概述 作为一款通用的图数据库产品&#xff0c;HugeGraph需具备图数据的基本功能&#xff0c;如下图所示。HugeGraph包括三个层次的功能&#xff0c;分别是存储层、计算层和用户接口层。 HugeGraph支持OLTP和OLAP两种图计算类型&#xff0c;其中OLTP实现了Apache TinkerPop3…

webAPP基础学习

###视觉基础 part-I ####1.面试中常见的像素问题 >什么是像素? *1.什么是px? px-虚拟像素,css像素的单位 px是一个相对单位,相对于设备像素而言 >相对性 a.相对于同一个设备,css像素的可变的 css像素物理像素>会受到缩放的影响 css像素缩放倍数*单个物理像…

QEMU显示虚拟化的几种选项

QEMU可以通过通过命令行"-vga type"选择为客户机模拟的VGA卡的类别,可选择的类型有多个: -vga typeSelect type of VGA card to emulate. Valid values for type arecirrusCirrus Logic GD5446 Video card. All Windows versions starting from Windows 95 should …