[AutoSar]BSW_Memory_Stack_003 NVM与APP的显式和隐式同步

news2024/11/15 13:38:14

目录

  • 关键词
  • 平台说明
  • 背景
  • 一、implicit synchronization
    • 1.1 Write requests 流程 (NvM_WriteBlock)
    • 1.2 Read requests 流程 (NvM_ReadBlock)
    • 1.3 Restore default requests 流程 (NvM_RestoreBlockDefaults)
    • 1.4 Multi block read requests 流程 (NvM_ReadAll)
    • 1.5 Multi block write requests 流程 (NvM_WriteAll)
  • 二、explicit synchronization
    • 2.1 Write requests 流程 (NvM_WriteBlock)
    • 2.2Read requests 流程 (NvM_ReadBlock)

  

关键词

嵌入式、C语言、autosar、OS、BSW

平台说明

项目Value
OSautosar OS
autosar厂商vector , EB
芯片厂商TI 英飞凌
编程语言C,C++
编译器HighTec (GCC)
autosar版本4.3.1

在这里插入图片描述
  
  
>>>>>>>>>>>>>>>>>>>>>>>>>回到总目录<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

  
  

缩写描述
EEPROMElectrically Erasable Programmable read only memory
NVMNVRAM Manager
MEMIFMemory Abstraction Interface
EAEEPROM Abstraction
EEPinternal/external EEPROM DRIVER
FEEFlash EEPROM Emulation
FLSinternal/external Flash Driver
FCFSFirst come first served

背景

  NVM与APP之间的data有implicit和explicit两种同步方式,本文描述了两种方式之间的区别和实现方式。

一、implicit synchronization

  如NVM模块介绍和使用说明1.1所描述的,不论什么类型的NVRAM BLOCK 都至少有一个NV block, 一个RAM block and 一个 Administrative block。
在这里插入图片描述implicit synchronization 的意思就是APP 与NVRAM block 共用一个 RAM block。如下图所示:

在这里插入图片描述

  不建议多个APP 访问同一个RAM block,一是因为在写入期间 RAM 的值不允许改动,二是因为多个APP 的读写容易造成冲突和越界。

1.1 Write requests 流程 (NvM_WriteBlock)

    1. APP 数据写入RAM 中
    1. APP发出the NvM_WriteBlock请求,此后这个RAM block 的控制权移交给NVM模块。
    1. 从现在开始,APP不允许修改RAM block,直到通过异步轮询(预留链接位置,后面更新详情)发出请求成功或者失败的返回。这个时候可以读取RAM block。
    1. APP可以用轮询的方式周期性检查NvM写入操作是否完成,NvM也可以用回调函数的方式来通知APP操作完成。
    1. 当NvM操作完成后,APP才可以重新更改RAM Block中的值。
        

1.2 Read requests 流程 (NvM_ReadBlock)

    1. APP 端提供一个RAM 用于被 NVM 端的RAM block 填充data。
    1. APP 发出NvM_ReadBlock 请求,此后这个RAM block 的控制权移交给NVM模块。
    1. 从这一步开始,APP不允许读取 也不允许写入这个RAM,直到通过异步轮询发出请求成功或者失败的返回。
    1. APP可以用轮询的方式周期性检查NvM写入操作是否完成,NvM也可以用回调函数的方式来通知APP操作完成。
    1. 当NvM操作完成后,APP才可以重新读取和使用RAM Block中的值。

1.3 Restore default requests 流程 (NvM_RestoreBlockDefaults)

    1. APP 端提供一个RAM 用于被 NVM 端的ROM block 填充data。
    1. APP 发出NvM_RestoreBlockDefaults请求,此后这个RAM block 的控制权移交给NVM模块。
    1. 从这一步开始,APP不允许读取 也不允许写入这个RAM,直到通过异步轮询发出请求成功或者失败的返回。
      1. APP可以用轮询的方式周期性检查NvM写入操作是否完成,NvM也可以用回调函数的方式来通知APP操作完成。
    1. 当NvM操作完成后,APP才可以重新读取和使用RAM Block中被ROM提供的值。

1.4 Multi block read requests 流程 (NvM_ReadAll)

  EcuM Fixed 状态机在启动的时候调用,用于读取填充所有permanent block。

    1. ECU状态管理器可以使用轮询来获取请求的状态,也可以通过回调函数得到通知。
    1. 在NvM_ReadAll期间,将在完全处理完NVRAM块后调用单个块回调(如果配置了)。这些回调使RTE能够单独启动每个SW-C。

1.5 Multi block write requests 流程 (NvM_WriteAll)

  此请求必须仅在系统关闭时由ECU状态管理器触发。这个请求将所有修改过的永久RAM块的内容写入NV内存。通过仅在ECU关闭期间调用此请求,ECU状态管理器可以确保在操作结束之前,没有SW组件能够修改RAM块中的数据。

    1. ECU状态管理器发出NvM_WriteAll请求,该请求将控制权转移给NvM模块。
    1. ECU状态管理器可以使用轮询来获取请求的状态,也可以通过回调函数得到通知。

二、explicit synchronization

开启explicit sync 配置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

NvMReadRamBlockFromNvCallback:回调,读取RAM mirror 数据到 RAM block。
NvMWriteRamBlockToNvCallback:回调,将RAM block 数据写到 RAM mirror。
NvMrepeatmirrorOperations:上述两个回调失败时重新执行次数。

  如下图所示,explicit 与implicit synchronization 相比,多了一个mirro RAM ,

在这里插入图片描述

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

注意: 如果在一个APP 请求 没有执行完的时候APP2由来一个请求,NVM会合并两个请求,NVM只会处理一次。

2.1 Write requests 流程 (NvM_WriteBlock)

    1. APP 数据写入RAM 中。
    1. APP发出the NvM_WriteBlock请求。
    1. APP可以修改RAM block,直到NvM模块调用NvMWriteRamBlockToNvM 回调。
    1. NvM模块调用NvMWriteRamBlockToNvM回调的时候,将RAM block 数据写到 RAM mirror。如果返回E_NOT_OK则表示数据不一致,重新执行直到NvMRepeatMirrorOperations次数。
    1. 成功执行NvMWriteRamBlockToNvM后,APP才能重新读写RAM block。
    1. APP可以用轮询的方式获取NvM的操作结果,NvM也可以用回调函数的方式通知APP操作结果。

2.2Read requests 流程 (NvM_ReadBlock)

    1. APP 端提供一个RAM 用于被 NVM 端的RAM block 填充data。
    1. APP发出NvM_ReadBlock请求。
    1. APP可以修改RAM block,直到NvM模块调用NvMReadRamBlockFromNvM回调。
    1. NvM模块调用NvMReadRamBlockFromNvM 回调的时候,将RAM mirror 数据写到 RAM block 。如果返回E_NOT_OK则表示数据不一致,重新执行直到NvMRepeatMirrorOperations次数。
    1. 成功执行NvMReadRamBlockFromNvM 后,APP才能重新使用RAM block 的数据。
    1. APP可以用轮询的方式获取NvM的操作结果,NvM也可以用回调函数的方式通知APP操作结果。

  
  
>>>>>>>>>>>>>>>>>>>>>>>>>回到总目录<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

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

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

相关文章

LangChain入门:12.OutputFixingParser解析器实战

引言 在处理自动化数据解析时&#xff0c;格式错误是常见的问题。本文将展示如何使用OutputFixingParser来自动纠正这些错误&#xff0c;确保数据解析的顺利进行。 问题场景 在解析JSON数据时&#xff0c;如果格式不正确&#xff0c;Python的内建JSON解析器会抛出错误。例如…

逻辑回归(Logistic Regression)详解

逻辑回归&#xff08;Logistic Regression&#xff09;是一种常用的统计学习方法&#xff0c;用于解决二分类问题。虽然名字中包含“回归”&#xff0c;但逻辑回归实际上是一种分类算法&#xff0c;而不是回归算法。它的基本原理是使用逻辑函数&#xff08;也称为Sigmoid函数&a…

【基于HTML5的网页设计及应用】——-正则表达式.

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

Vue2电商前台项目(一):项目前的初始化及搭建

一、项目初始化 创建项目&#xff1a;sudo vue create app 1.项目配置 &#xff08;1&#xff09;浏览器自动打开 在package.json文件中&#xff0c;serve后面加上 --open "scripts": {"serve": "vue-cli-service serve --open","buil…

Vue tree自定义滚动条位置

贴一张效果图&#xff0c;我的效果不方便贴出来 实现支持&#xff1a; 1、懒加载 2、普通加载 下面贴关键思想&#xff1a; document有一个获取element元素的方法。 let element document.getElementById(tree); let arr document.querySelectorAll(".nodelModel&quo…

深入Tauri开发——从环境搭建到项目构建

深入Tauri开发——从环境搭建到项目构建 开启你的Tauri桌面应用开发之旅&#xff08;续&#xff09; 经过上一篇文章的基础介绍&#xff0c;现在让我们更进一步&#xff0c;详细阐述如何在Windows和macOS平台上顺利搭建Tauri应用所需的开发环境&#xff0c;并指导您从创建项目…

模板匹配——基于模板与基于特征的两种模板匹配对比

概述 在人工智能&#xff08;AI&#xff09;的研究领域中&#xff0c;模板匹配不仅是一个重要的研究课题&#xff0c;也是解决图像处理中核心问题——定位兴趣区域的关键方法之一。通过模板匹配&#xff0c;可以准确地识别和定位给定图像中的特定对象。这项技术在对象检测、跟…

Golang | Leetcode Golang题解之第10题正则表达式匹配

题目&#xff1a; 题解&#xff1a; func isMatch(s string, p string) bool {m, n : len(s), len(p)matches : func(i, j int) bool {if i 0 {return false}if p[j-1] . {return true}return s[i-1] p[j-1]}f : make([][]bool, m 1)for i : 0; i < len(f); i {f[i] m…

多线程学习-线程安全

目录 1.多线程可能会造成的安全问题 2. static共享变量 3.同步代码块 4.同步方法 5.使用Lock手动加锁和解锁 6.死锁 1.多线程可能会造成的安全问题 场景&#xff1a;三个窗口同时售卖100张电影票&#xff0c;使用线程模拟。 public class MyThread extends Thread{//tic…

windows安装OpenUSD

一、下载OpenUSD git clone https://github.com/PixarAnimationStudios/OpenUSDOpenUSD&#xff0c;原名USD&#xff08;Universal Scene Description&#xff0c;通用场景描述&#xff09;&#xff0c;是由皮克斯动画工作室开发的一种开放数据格式。OpenUSD主要用于在虚拟世界…

Linux-程序地址空间

目录 1. 程序地址空间分布 2. 两个问题 3. 虚拟地址和物理地址 4. 页表 5. 解决问题 6. 为什么要有地址空间 1. 程序地址空间分布 测试一下&#xff1a; #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h>int ga…

java中Date类,SimpleDateFormat类和Calendar类

Date类 public Date() 创建一个Date对象&#xff0c;代表的是系统当前此刻的日期时间 public Date(long date) Constructs a Date object using the given milliseconds time value. 把时间毫秒值转变成Date日期对象 public void setTime(long date) Sets an existing Date ob…

【Linux学习】Linux 的虚拟化和容器化技术

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

进阶线段树之乘法线段树

1.乘法线段树 顾名思义&#xff0c;就是其中的区间修改为乘法&#xff0c;但是呢&#xff0c;如果只是一个乘法&#xff0c;把之前的加号变成*号&#xff0c;然后开long long即可&#xff08;因为乘法的数据超大&#xff0c;如果不在中间mod点儿东西还能直接超出64位&#xff…

【Java EE】Maven jar 包下载失败问题的解决方法

文章目录 1. 配置好国内的Maven源1.1配置当前项⽬setting1.2设置新项⽬的setting 2.重新下载jar包3.其他问题⭕总结 1. 配置好国内的Maven源 因为中央仓库在国外, 所以下载起来会⽐较慢, 所以咱们选择借助国内⼀些公开的远程仓库来下载资源 接下来介绍, 如何设置国内源 1.1配…

Java集合(个人整理笔记)

目录 1. 常见的集合有哪些&#xff1f; 2. 线程安全的集合有哪些&#xff1f;线程不安全的呢&#xff1f; 3. Arraylist与 LinkedList 异同点&#xff1f; 4. ArrayList 与 Vector 区别&#xff1f; 5. Array 和 ArrayList 有什么区别&#xff1f;什么时候该应 Array而不是…

Spring Boot Mockito (二)

Spring Boot Mockito (二) 基于第一篇Spring Boot Mockito (一) 这篇文章主要是讲解Spring boot 与 Mockito 集成持久层接口层单元测试。 1. 引入数据库 h2及其依赖包 <dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId…

C语言----数据在内存中的存储

文章目录 前言1.整数在内存中的存储2.大小端字节序和字节序判断2.1 什么是大小端&#xff1f;2.2 练习 3.浮点数在内存中的存储3.1.引子3.2.浮点数的存储3.2.2 浮点数取的过程 前言 下面给大家介绍一下数据在内存中的存储&#xff0c;这个是一个了解c语言内部的知识点&#xf…

动规训练3

一、按摩师 1、题目解析 简而言之就是&#xff0c;找到一个按摩师的预约总是长的最长方案&#xff0c;还有一个限制条件&#xff0c;选取的预约两两不相邻。 2、算法原理 a状态表示方程 小技巧&#xff1a;经验题目要求 dp[i]表示以这个节点为结尾&#xff0c;最长的预约时…

【C语言】翻译环境与运行环境

一、前言 在我们学习C语言的时候&#xff0c;第一个接触的程序就是&#xff1a;在屏幕上打印” hello word! “&#xff0c;可当时的我们却未去深入的理解与感悟&#xff0c;一个程序代码是如何运行的&#xff1b;而这一期的博客&#xff0c;则是带着我们&#xff0c;通过C代码…