AUTOSAR NvM 同步机制

news2025/1/19 17:18:32

一、部分 NvM API 解释

(1)Std_ReturnType NvM_ReadBlock(NvM_BlockIdType BlockId,void* NvM_DstPtr)

把Nv Block中的数据copy到NvM_DstPtr指向的RAM中,NvM_DstPtr可以是临时RAM,也可以是永久RAM(永久RAM即配置工具中配置的RAM Block)。如果NvM_DstPtr是NULL_PTR,且配置了永久RAM,那么数据会被copy到永久RAM中。

(2)Std_ReturnType NvM_WriteBlock(NvM_BlockIdType BlockId,const void* NvM_SrcPtr)

把NvM_SrcPtr指向的RAM中的数据Copy到NvBlock中,NvM_SrcPtr可以是临时RAM,也可以是永久RAM。如果NvM_SrcPtr是NULL_PTR,且配置了永久RAM,那么数据会从永久RAM中copy到NvBlock。

(3)Std_ReturnType NvM_ReadPRAMBlock(NvM_BlockIdType BlockId)

等同于(1)的NvM_DstPtr = NULL_PTR时的作用,即把NvBlock中的数据copy到配置的永久RAM中。

(4)Std_ReturnType NvM_WritePRAMBlock(NvM_BlockIdType BlockId)

等同于(2)的NvM_SrcPtr = NULL_PTR时的作用,即把数据从永久RAM中copy到NvBlock。

二、隐式同步

一个NvBlock(下图蓝色块)对应一个RAM Block(下图橙色块),可以是临时RAM,也可以是永久RAM,这个RAM Block建议只被一个SWC(APP)使用。

在这里插入图片描述

APP在写入数据时的流程如下:

  • (1)SWC把新的数据写到RAM Block中
  • (2)APP调用 NvM_WriteBlock 或 NvM_WritePRAMBlock(仅当RAM Block是永久RAM时),请求把RAM Block中的数据写入 NvBlock。
  • (3)从发起请求开始,到NvM模块写入完成为止(不管成功还是失败)的这段时间内,APP不能再次更改RAM Block中的值,但可以读取。
  • (4)APP可以用轮询的方式周期性检查NvM写入操作是否完成,NvM也可以用回调函数的方式来通知APP操作完成。
  • (5)当NvM操作完成后,APP才可以重新更改RAM Block中的值。

APP在读取数据时的流程如下:

  • (1)APP提供一个RAM Block,用来装从NvBlock中读取的数据。
  • (2)APP调用NvM_ReadBlock,发起请求把数据从NvBlock读取到RAM Block。
  • (3)从发起请求到NvM操作完成的这段时间内,APP不能读取和写入RAM Block中的值。
  • (4)APP可以用轮询的方式周期性检查NvM写入操作是否完成,NvM也可以用回调函数的方式来通知APP操作完成。
  • (5)当NvM操作完成后,RAM Block中就是读取到的新的数据了,这个时候APP才可有使用。

在这种机制下,NvM不对RAM Block的数据一致性(数据一致性简单理解就是数据的正确性,比如我想要写什么数据,最终写入的就是什么数据)负责,使用RAM Block的APP负责确保RAM Block的数据一致性,也就是说在NvM写入和读取NvBlock期间,不能再更改RAM Block的值,以及在NvM读取数据期间,不访问RAM Block。

不推荐多个SWC共享一个RAM Block。因为如果多个SWC共享一个RAM Block,那么不仅要确保这些SWC在访问RAM Block的时候互相之间不冲突,还要确保在NvM写入期间所有的SWC都不能访问这个RAM Block。这套机制会很复杂,而且容易出问题,比如:APP用NvM回调函数的方式来判断NvM写入是否完成,APP1发起了一个NvM写入请求,然后等待写入完成的回调函数被触发,之后回调函数被触发了,但其实触发这个回调函数的写入操作不是这个APP1请求的,而是另一个APP2在之前请求的,此时APP1认为RAM Block中的数据已经被写入NvBlock了,但实际还没有。诸如此类,总之就是机制很复杂,且容易出问题,不推荐。但你要非得用隐式同步且多个APP共享一个RAM Block行不行呢,我觉得应该也行,但需要详细的去设计整套逻辑,确保使用时不冲突。

三、显式同步

显式同步与隐式同步相比较,多了一个RAM块——RAM Mirror:
在这里插入图片描述

首先我们来看一看达芬奇中和这个有关的几个配置项:
在这里插入图片描述
其中Use Synchronization Mechanism用来配置是否使用显式同步,下面两个回调函数我们在后文将会介绍怎么使用。如果勾选了使用显式同步,那么将不允许配置RAM Block Data,NvM协议栈会自动为其分配一个RAM Mirror,也就是上图中的RAM Mirror。

我们来看看显式同步的数据写入和读取流程:

写入流程:

  • APP把想要写入的数据存到RAM Block中。
  • APP调用NvM_WriteBlock或NvM_WritePRAMBlock,发起一个写入数据请求。如果调用NvM_WriteBlock这个API的话,需要输入一个SrcPtr的地址,但我理解这个地址现在是没用的,所以可能输入啥都行,这个未验证,存疑。这一步的目的就是发起一个写入数据的请求。
  • NvM模块之后会调用Write Ram Block To Nv Callback这里配置的回调函数,在调用这个回调函数之前APP都可以修改RAM Block中的值。
  • 当NvM模块调用Write Ram Block To Nv Callback这个回调函数时,会有一个输入参数,如下面的代码所示,即RAM Mirror的地址,APP应该在这个回调函数中把RAM Block中的数据copy到RAM Mirror中,这个时候APP要确保copy的数据的一致性,也就是在复制数据的过程中不能允许其他APP访问。这个回调函数可以返回E_OK或E_NOT_OK,如果复制过程中出现问题返回了E_NOT_OK,NvM协议栈会自动重复调用这个回调函数,重复次数最多为NvMRepeatMirrorOperations配置的次数。
typedef P2FUNC(Std_ReturnType, NVM_APPL_CODE, NvM_WriteRamToNvMCbkPtrType)(P2VAR(void, AUTOMATIC, NVM_APPL_DATA) NvMBuffer);
  • APP复制数据完成后,APP就可以再次读写RAM Block中的值了。
  • APP可以用轮询的方式获取NvM的操作结果,NvM也可以用回调函数的方式通知APP操作结果。

读取流程(与写入类似):

  • APP准备一个RAM Block用来存储从NvM Block读取的数据。
  • APP调用API NvM_ReadBlock 或 NvM_ReadPRAMBlock发起一个NvM读取数据请求。
  • NvM模块之后会调用Read Ram Block From Nv Callback这里配置的回调函数,在调用这个回调函数之前APP都可以读写RAM Block中的值。
  • 当NvM模块调用Read Ram Block From Nv Callback这个回调函数时,会有一个输入参数,如下面的代码所示,即RAM Mirror的地址,与上面的区别是这次是个常量指针,因为是APP在这个回调函数中把RAM Mirror中的数据copy到RAM Block中,这个时候APP也要确保copy的数据的一致性,也就是在复制数据的过程中不能允许其他APP访问RAM Block。这个回调函数可以返回E_OK或E_NOT_OK,如果复制过程中出现问题返回了E_NOT_OK,NvM协议栈会自动重复调用这个回调函数,重复次数最多为NvMRepeatMirrorOperations配置的次数。
typedef P2FUNC(Std_ReturnType, NVM_APPL_CODE, NvM_ReadRamFromNvMCbkPtrType)(P2CONST(void, AUTOMATIC, NVM_APPL_DATA) NvMBuffer);
  • APP复制数据完成后,APP就可以再次使用RAM Block中的值了。
  • APP可以用轮询的方式获取NvM的操作结果,NvM也可以用回调函数的方式通知APP操作结果。

我们对比隐式同步可以看到,APP在大部分时间都可以读写RAM Block中的数据,只有在两个回调函数中复制数据的极短时间内不能使用RAM Block,所以显式同步使得APP在使用RAM Block中的数据的时候更加方便灵活。缺点就是多占用一块RAM 空间,且多了一步copy的操作。

显式同步与隐式同步最根本的区别就是,显式同步APP是知道NvM使用RAM Block的起始时间点和结束时间点的,而且这两个时间点是APP自己来控制的,即两个回调函数中的复制操作起始和结束的时间点。APP不需要通过读取NvM的操作状态来判断当前是否可以使用RAM Block。

显式同步是支持多个APP共享一个RAM Block的,机制也比较简单,设置一个互斥量或AUTOSAR OS中的Resource来保护一下,哪个APP或上面的两个回调函数使用RAM Block前申请一下互斥量,使用完了再释放就可以了。

注意一点:如果APP1先发起了一个写入或读取的请求,但NvM还没有处理,回调函数也还没有调,APP2有发起了一个相同类型(指写入或读取)的请求,那么这两个(或多个)请求会被合并,NvM只会处理一次,回调函数只会调一次。

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

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

相关文章

自动化、智能、机器人-2023-

文明:农业、工业、信息、智能,以目前认知的四个阶段。 农业文明到工业文明:机械自动化 工业文明到信息文明:电气自动化 信息文明到智能文明:数据自动化 这些时代典型的机器人: 机械自动化 电气自动化 数…

Mini_Web开发

文章目录 服务器开发回顾面向对象服务端客户端(浏览器)请求数据处理判断不同的请求路径,返回不同的数据给前端 单独封装方法不同请求路径处理的方法再次拆分业务封装JSON数据处理 Mini_Web开发导入数据使用Python操作数据库使用pymysql模块日…

瑞吉外卖 - 编辑员工信息功能(9)

某马瑞吉外卖单体架构项目完整开发文档,基于 Spring Boot 2.7.11 JDK 11。预计 5 月 20 日前更新完成,有需要的胖友记得一键三连,关注主页 “瑞吉外卖” 专栏获取最新文章。 相关资料:https://pan.baidu.com/s/1rO1Vytcp67mcw-PD…

238:vue+openlayers绘制扩展,弓形、曲线、扇形、双箭头、进攻方向...

第238个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中利用ol-plot插件进行绘制图形扩展,可以绘制弓形、弧形、标志旗、战斗进攻图形等等。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果; 注意如果OpenStreetMap无法加载,请加载其他…

win11 下部署Vicuna-7B,Vicuna-13B模型,

运行Vicuna-7B需要RAM>30GB或者14GB的显存 运行Vicuna-13B需要RAM>60GB或者28GB的显存 如果没有上面的硬件配置请绕行了,我笔记本有64G内存,两个都跑跑看,使用python3.9,当时转换13b时一直崩溃后来发现是没有设定虚拟内存&…

Linux指令 快捷键

热键 上一次我们说到了linux的基本指令,这次我们先说一下热键 TAB TAB键在linux中有什么作用呢?? 在Linux中,假设我们想要输入的指令忘记了,我们可以TAB两下,帮我们补全命令或者假如命令太多&#xff0…

C++基础STL-set容器

set容器介绍: set译为集合,集合是按照特定顺序存储唯一元素的容器。在集合中,元素的值也标识它(值本身就是键,类型为T),并且每个值必须是唯一的。集合中元素的值在容器中一次就不能修改(元素总是const),但可…

python学习环境准备

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言本专栏文章旨在记录《Python编程从入门到实践》一书的学习笔记。 一、编程环境二、使用步骤1.修改默认python版本2.终端退出python解释器3.编写.py文件4.运行.p…

【Linux是如何发送网络包的?】

网络模型 为了使得多种设备能通过网络相互通信,和为了解决各种不同设备在网络互联中的兼容性问题,国际标准化组织制定了开放式系统互联通信参考模型(Open System Interconnection Reference Model),也就是 OSI 网络模…

【工作中掌握10个就够了!!!】Linux中的10个最常见命令+vim三个基本操作

欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示:重难点★✔ 蓝色文字表示&#…

【macOS自带VNC远程】——Windows在外远程桌面控制macOS

文章目录 前言1.测试局域网内远程控制1.1 macOS打开屏幕共享1.2 测试局域网内VNC远程控制 2. 测试公网远程控制2.1 macOS安装配置cpolar内网穿透2.2 创建tcp隧道,指向5900端口 3. 测试公网远程控制4. 配置公网固定TCP地址4.1 保留固定TCP地址4.2 配置固定TCP端口地址…

Java | 一分钟掌握定时任务 | 4 - 多线程的Timer

作者:Mars酱 声明:本文章由Mars酱原创,部分内容来源于网络,如有疑问请联系本人。 转载:欢迎转载,转载前先请联系我! 前言 JDK自带的Timer是无法做到多任务并发的,那么我们怎么处理多…

如何编写一份优质软件测试工程师简历的范文【建议收臧】

很多刚转行软件测试的小伙伴是不是不知道怎么写好一份优质的软件测试工程师的简历。今天呢,就给大家分享一下一个优质软件测试工程师简历的范文。记得收藏起来哦。 下面的案例:2-3年的软件测试工程的简历 姓 名:XXX 学历&#xff1a…

Zabbix“专家坐诊”第191期问答汇总

问题一 Q:snmp监控服务器风扇、温度等硬件信息需要要mib库吗? A:官网有相关的mib库可查,一般同大型号通用,直接去官方下就行。 问题二 Q:zabbix用的postgresqltimescaledb备份这个数据库的时候不想包含历…

【Linux】-Linux的权限

💖作者:小树苗渴望变成参天大树 ❤️‍🩹作者宣言:认真写好每一篇博客 💨作者gitee:gitee 💞作者专栏:C语言,数据结构初阶,Linux,C 如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 …

【C++】入门必备小知识

C入门 1. 域2. 命名空间2.1命名空间的定义2.2 命名空间的使用 3. C输入和输出4. 缺省参数5. 函数重载6. 引用7. auto8. 范围for9.nullptr空指针10.内联函数 1. 域 域就是作用域,同一个域不可以用同名的变量,不同域可以用同名变量,遵循局部优…

案例11:Java超市管理系统设计与实现开题报告

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

5年时间里,自动化测试于我带来的意义,希望你也能早点知道

摘要:在我有限的软件测试经历里,曾有一段专职的自动化测试经历。 接触自动化 那时第一次上手自动化测试,团队里用的是Python,接口自动化测试的框架是requestsExcelJenkins,APP自动化测试的框架是Appium。 整个公司当…

寻找差值结构的最优顺序

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点,AB训练集各由6张二值化的图片组成,让A中有6个1 差值结构的每行只能是二进制的3,6,5..3列每列1的数量为1,2,3.B中全是0,排列组合…

“记录新时代 奋进新征程”省市主流媒体共赴省交通集团在建项目采风

近日,浙江省省市13家主流媒体集中走进杭绍甬高速杭绍段绍兴侧路面施工现场、杭金衢高速联络线PPP项目中村大桥及杨家山隧道等施工现场,近距离感受在建工程的标准化施工、数字化赋能以及产业工人队伍打造。 标准化、数字化齐头并进,保障路面施…