Autosar存储入门系列03_NVM状态机及读写存储调用逻辑

本文框架

  • 0.前言
  • 1. NVM状态机介绍
  • 2. NVM读/写基本逻辑
    • 2.1 NVM读操作
    • 2.2 NVM写操作
      • 2.2.1 实时写
      • 2.2.2 下电写
    • 2.3 NVM写入注意事项

0.前言

本系列是Autosar存储入门系列,希望能从学习者的角度把存储相关的知识点梳理一遍,这个过程中如果大家觉得有讲得不对或者不够清晰的地方,还请一定指出来,一起探讨,加深学习。

另外根据本人多年的开发经验,做了一些AutosarMCAL配置,通信,诊断,模式管理等实战总结,如果您有需求可以参见AutoSar 实战进阶系列专栏,快速链接:AutoSar实战进阶系列导读

本篇介绍一下Autosar中NVM状态机及读写调用逻辑,基本框架如下:
在这里插入图片描述

1. NVM状态机介绍

在NvM模块中,通过异步请求接口NvM_GetErrorStatus()获取Block的状态,可能状态如下:

NVM_REQ_OK:表明对应的异步请求操作成功完成,该状态对应的编号为0,为NvM的初始状态;

NVM_REQ_NOT_OK:表明上一次的异步读写请求操作未成功完成;

NVM_REQ_PENDING:表明当前异步请求读写操作正在进行中;

NVM_REQ_INTEGRITY_FAILED:表明最后一个次的异步请求NvM_ReadBlock或NvM_Read All结果的数据完整性失败,如在NvM_ReadBlock的情况下,RAM块的内容已更改,但已变为无效;

NVM_REQ_BLOCK_SKIPPED:在执行NvM_ReadAll或NvM_WriteAll期间跳过了引用的块,如全部Block都被NvM_ReadAll或NvM_WriteAll期间操作完成则该状态会被设置为NVM_REQ_OK状态;

NVM_REQ_NV_INVALIDATED:需要操作的对应Block是无效的;

NVM_REQ_CANCELED:通过调用NvM_CancelWriteAll取消了多块的请求NvM_WriteAll,或者通过调用NvM_CancelJobs取消了任何单个块作业请求(NvM_ReadBlock、NvM_WriteBlock、NvM_EraseNvBlock、NvM_InvalidateNvBlock和NvM_RestoreBlockDefaults)。

NVM_REQ_RESTORED_FROM_ROM:The referenced NV block had the default values copied to the RAM image.

以上状态的NvM操作过程中都可能会遇到,在一般正常的写操作请求中会遇到最多的状态就是:NVM_REQ_PENDING,NVM_REQ_OK及NVM_REQ_NOT_OK。

2. NVM读/写基本逻辑

接下来,进一步看一下NVM读及写的基本逻辑。

2.1 NVM读操作

在AUTOSAR中有不同的策略来将RAM Block恢复到ECU上次休眠前保存的结果:
1)可以使用NvM_ReadBlock/NvM_ReadPRAMBlock在Rte_Init()期间逐个显式读取单个Block;
2)另一种更好的方法是使用单个NvM请求NvM_ReadAll读取所有Block的结果,在NvM_ReadAll期间要读取的任何块都必须具有显式同步或具有永久RAM块。

一般项目开发中会在EcuM_StartupTwo()期间调用NvM_ReadAll接口实现NvM数据读取。

2.2 NVM写操作

在NVM写操作中按根据存储数据写入时机的不同可分为实时写及下电写,例如对于某些重要的数据,发现其发送改变如一些2E相关的DID存储,但对于一些下线相关的参数可能只需要在下电前存一次即可就没必要实时写,下电前存一次即可。

2.2.1 实时写

在SWC实际运行中,通过调用NvM_WriteBlock()来对单个Block执行写操作,对应的时序操作如下:
在这里插入图片描述
需要注意的是,虽然是实时写,但对于NvM的操作仍然是异步的,需要在NvM_MainFunction()中周期性的去判断Block状态是否为Pending,如选择了CRC校验的话NVM还会根据当前CRC与Block中的CRC值对比是否有变化,如CRC不同并对并执行对应的操作。

在NvM_MainFunction()中会继续调用MemIf及底层接口对Block进行操作,例如当选Fls做模拟EEPROM时的调度逻辑。
在这里插入图片描述

2.2.2 下电写

在NvM的Block属性配置中,有一个WriteAll的选项,该选项配置与否意味着该Block在NvM_WriteAll()接口调用时是否写该Block。
在这里插入图片描述
一般NvM_WriteAll()接口是在下电前,在BswM执行下电逻辑的时候,调用NvM_WriteAll进行所有数据的下电存储,存储完成后ECU进入Shutdown或Sleep状态。
在这里插入图片描述

2.3 NVM写入注意事项

如有不同SWC操作同一Block进行存储的情况,需要注意在Block操作前需要调用NvM_GetErrorStatus()判断接口状态,如Block为Pending状态时不能直接写,否则程序会出问题(进Det等导致程序跑飞)。

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

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

相关文章

PC天翼云盘v6.3.4精简版

介绍: 由于天翼云盘网页端不能上传大文件了,需要客户端,于是制作了绿色版,直接打开就能用,装到u盘,走到哪用到哪。 下载不限速,上传文件大小无限制,支持识别MD5秒传。 这是天翼云盘…

如何外网登录访问瑞友天翼应用虚拟化系统?——快解析内网端口映射方案

瑞友天翼应用虚拟化系统(GWT System)是国内具有自主知识产权的应用虚拟化平台,是基于服务器计算(Server-based Computing)的应用虚拟化平台。如何将内网平台提供到互联网上外网访问,是我们比较关注的问题。…

Goby 漏洞更新 | 瑞友天翼应用虚拟化系统 index.php 文件远程代码执行漏洞

漏洞名称: 瑞友天翼应用虚拟化系统 index.php 文件远程代码执行漏洞 English Name:Ruiyou Tianyi Application Virtualization System Index.php File Remote Code Execution Vulnerability CVSS core: 9.3 影响资产数:61711 漏洞描述&am…

[maven]关于pom文件中的<relativePath>标签

关于pom文件中的<relativePath>标签 为什么子工程要使用relativePath准确的找到父工程pom.xml.因为本质继承就是pom的继承。父工程pom文件被子工程复用了标签。&#xff08;可以说只要我在父工程定义了标签&#xff0c;子工程就可以没有&#xff0c;因为他继承过来了&…

IO模型和NGINX安装升级

IO模型和NGINX安装升级 IO模型 IO概念 I/O在计算机中指Input/Output&#xff0c; IOPS (Input/Output Per Second)即每秒的输入输出量(或读写次数)&#xff0c;是衡量磁盘性能的主要指标之一。 Linux的IO类型 磁盘I/O 磁盘I/O是进程向内核发起系统调用&#xff0c;请求磁…

EditPlus安装教程

首先官网下载EditPlus&#xff1a;https://www.editplus.com/ 然后直接一直图示安装 &#xff08;也可以放其他盘&#xff09; 最后在下图中输入下面内容&#xff1a; Username: Vovan Regcode: 3AG46-JJ48E-CEACC-8E6EW-ECUAW 大功告成&#xff01;

ICLR 2023 | StrucTexTv2:端到端文档图像理解预训练框架

点击下方卡片&#xff0c;关注“CVer”公众号 AI/CV重磅干货&#xff0c;第一时间送达 点击进入—>【计算机视觉】微信技术交流群 转载自&#xff1a;CSIG文档图像分析与识别专委会 本文简要介绍ICLR 2023录用论文“StrucTexTv2: Masked Visual-Textual Prediction for Docu…

静态方法 与 非静态方法的区别/static 关键字

为什么80%的码农都做不了架构师&#xff1f;>>> 使用static修饰的静态方法是属于整个类的类方法&#xff0c;它在内存中的代码段会随类的定义而被分配和装载&#xff1b;而非静态方法是属于具体对象的方法&#xff0c;当这个对 象创建时&#xff0c;在对象的内存中…

Python 通过traceback追溯异常信息

Python 通过traceback追溯异常信息 导入traceback包 import traceback自定义函数 def func_3():return 1 / 0def func_2():func_3()def func_1():func_2()捕捉异常 try:func_1() except Exception as e:traceback_info traceback.format_exc()print("traceback_info"…

TSRFormer:复杂场景的表格结构识别新利器

编者按&#xff1a;近年来&#xff0c;各大企业和组织机构都在经历数字化转型。将文档转换成计算机所能识别的样态&#xff0c;是数字化转型的关键步骤&#xff0c;如何识别出图片中表格具体的结构与内容&#xff0c;并直接提取其中的数据和信息是学术界和工业界共同瞩目的焦点…

C++设计模式_01_设计模式简介(多态带来的便利;软件设计的目标:复用)

文章目录 本栏简介1. 什么是设计模式2. GOF 设计模式3. 从面向对象谈起4. 深入理解面向对象5. 软件设计固有的复杂性5.1 软件设计复杂性的根本原因5.2 如何解决复杂性 ? 6. 结构化 VS. 面向对象6.1 同一需求的分解写法6.1.1 Shape1.h6.1.2 MainForm1.cpp 6.2 同一需求的抽象的…

聚类分析 | MATLAB实现基于AHC聚类算法可视化

聚类分析 | MATLAB实现基于AHC聚类算法可视化 目录 聚类分析 | MATLAB实现基于AHC聚类算法可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 AHC聚类算法&#xff0c;聚类结果可视化&#xff0c;MATLAB程序。 Agglomerative Hierarchical Clustering&#xff08;自底…

从360随身WiFi到随身WiFi的改革发展史

摘要 随身WiFi从3G逐渐发展到4G、5G网络&#xff0c;再到WiFi&#xff0c;将网络信号转换成WiFi信号的设备&#xff0c;很大程度上的满足了出差需要移动办公的商务人士及旅游人士对网络的需求。 最先开始出现的是插电脑USB接口的随身WiFi&#xff0c;提前是你已经有了有线宽带…

360wifi使用方法|360wifi使用教程

360随身WiFi是一款超迷你、操作极其简单的无线路由器&#xff0c;只需把360随身WiFi插到一台可以上网的电脑上&#xff0c;不用做任何设置&#xff0c;就把连接有线网络的电脑转变成接入点&#xff0c;实现与其他终端的网络共享。简单方便实现手机WIFI上网。1、是否支持台式机&…

软件工程(九) UML顺序-活动-状态-通信图

顺序图和后面的一些图,要求没有用例图和类图那么高,但仍然是比较重要的,我们也需要按程度去了解。 1、顺序图 顺序图(sequence diagram, 顺序图),顺序图是一种交互图(interaction diagram),它强调的是对象之间消息发送的顺序,同时显示对象之间的交互。 下面以一个简…

iOS 4.3.5 红雪不完美越狱教程

苹果前不久放出了最新的iOS 4.3.5&#xff0c;声称是封堵了之前4.3.3的越狱漏洞&#xff0c;不过大神MuscleNerd很快就在他的推特上说Redsnow(红雪)0.98b4可以越狱4.3.5。下面为大家提供4.3.5详细越狱方法&#xff01; 什么是不完美越狱? 不完美越狱就是越狱后你的设备不能…

iPhone / iPad iOS 5.0.1完美 越狱 教程 A4/A5处理器

黑客团队Dev Team的红雪列越狱软件Redsn0w 0.9.10b1&#xff0c;可以完美越狱部分iOS 5.0.1设备,1、此次完美越狱工具支持机型&#xff1a;iPhone 3GSiPhone 4iPhone 4-CDMAiPad (第一代)iPod touch 3GiPod touch 4G不支持的机型&#xff1a;iPhone 4SiPad 22、如果以上设备还不…

果粉的福音 ios5不完美越狱图文教程

转载自&#xff1a;http://mobile.sanhaostreet.com/Newsdata/2011/10/20111017104016162.shtml 2011年10月13日随着苹果全新系统ios5的开放下载&#xff0c;让诸多果粉又一次体验到了苹果的神奇与创新。全新的ios5系统增加了200余项新功能&#xff0c;通知中心、iCloud、报刊杂…

Xcode6.1 OS X 10.10 打越狱包和免证书测试方法

公司要发布包到91助手等平台上,需要打越狱包,之前没有动手打过,于是在网上搜集资料自己整理了一下,顺便分享给大家。 我的运行环境:OS X 10.10 ,Xcode6.1 iPhone5C (已越狱,这里就不详说越狱步骤,网上很多教程也很简单)。 1、首先要自己创建证书,并且名字必须叫做,iPh…

在vue项目中用vue-watermark快捷开发屏幕水印效果

我们先引入一个第三方依赖 npm install vue-watermark然后 因为这只是个测试工具 我就直接代码写 App.vue里啦 参考代码如下 <template><div><vue-watermark :text"watermarkText"></vue-watermark><!-- 正常的页面内容 --></div…