Autosar存储入门系列03_Autosar中NVM状态机及存储调用逻辑

news2024/11/13 19:01:50

本文框架

  • 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://www.coloradmin.cn/o/931936.html

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

相关文章

图文并茂:Python Tkinter从入门到高级实战全解析

目录 介绍什么是Tkinter?准备工作第一个Tkinter程序界面布局事件处理补充知识点 文本输入框复选框和单选框列表框弹出对话框 综合案例:待办事项列表总结 介绍 欢迎来到本篇文章,我们将带您深入了解如何在Python中使用Tkinter库来创建图形用…

弯道超车必做好题集锦二(C语言选择题)

前言: 编程想要学的好,刷题少不了,我们不仅要多刷题,还要刷好题!为此我开启了一个弯道超车必做好题锦集的系列,每篇大约10题左右。此为第二篇选择题篇,该系列会不定期更新,后续还会…

【网络云盘客户端】——项目简介

项目简介 网络云盘客户端时基于QT/C框架实现了一个网络云盘客户端软件,主要功能包括用户的注册,登录,显示用户的个人文件列表,以及文件的上传,下载,删除,共享文件。 登录界面 主窗口界面 文件…

Postman中参数区别及使用说明

一、Params与Body 二者区别在于请求参数在http协议中位置不一样。Params 它会将参数放入url中以?区分以&拼接Body则是将请求参数放在请求体中 后端接受数据: 二、body中不同格式 2.1 multipart/form-data key - value 格式输入,主要特点是可以上…

Proteus软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Proteus软件是一款电路设计和仿真的综合性软件,由Labcenter公司开发。它提供了一个交互式的图形界面,用户可以在其中构建电路、仿真结果并实时观察仿真结果。 1、Proteus的历史和演变 Proteus软件最初于…

Matlab图像处理-加法运算

加法运算 图像加法运算的一个应用是将一幅图像的内容叠加到另一幅图像上,生成叠加图像效果,或给图像中每个像素叠加常数改变图像的亮度。 在MATLAB图像处理工具箱中提供的函数imadd()可实现两幅图像的相加或者一幅图像和常量的相加。 程序代码 I1 i…

C++学习记录——이십유 C++11(2)

文章目录 1、类的新功能1、移动构造和移动赋值2、default、delete 2、可变参数模板3、STL容器的emplace 1、类的新功能 1、移动构造和移动赋值 逐成员按字节拷贝就是浅拷贝。一个类中,如果达成默认移动构造的要求,那么传右值就会使用移动构造了&#xf…

022-从零搭建微服务-短信服务(二)

写在最前 如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):https://gitee.com/csps/mingyue 源码地址(前端):https://gitee.com/csps…

Docker镜像的私有定制之nginx

一、背景 机器上已有nginx的可执行文件,但它是基于官方源码进行修改过的,可模块的源码一时找不到。另外,每次都基于源码去构建,对于Nginx部署也是麻烦。 所以,我们想要改为docker容器化部署nginx。 操作系统是centos…

STL-常用容器-map/ multimap容器(二叉树-红黑树)

1 map基本概念 简介: Map是一种关联容器,它通过将键和值成对存储,实现了快速的键值查找。在Map中,每个键都是唯一的,而值可以重复。Map容器内部使用平衡二叉树(通常是红黑树)的数据结构来实现高…

HodlSoftware-免费在线PDF工具箱 加解密PDF 集成隐私保护功能

HodlSoftware是什么 HodlSoftware是一款免费在线PDF工具箱,集合编辑 PDF 的简单功能,可以对PDF进行加解密、优化压缩PDF、PDF 合并、PDF旋转、PDF页面移除和分割PDF等操作,而且工具集成隐私保护功能,文件只在浏览器本地完成&…

OpenCV基础知识(8)— 图形检测

前言:Hello大家好,我是小哥谈。图形检测是计算机视觉的一项重要功能。通过图形检测可以分析图像中可能存在的形状,然后对这些形状进行描绘,例如搜索并绘制图像的边缘,定位图像的位置,判断图像中有没有直线、…

【面向大一新生IT技术社群招新啦,不来瞅瞅?】

个人名片: 🐼作者简介:一名大三在校生 🐻‍❄️个人主页:落798. 🐼个人WeChat:落798. 🕊️系列专栏:【零基础学java】 ----- 【重识c语言】 ---- 【计算机网络】—【Spri…

Fortran 微分方程求解 --ODEPACK

最近涉及到使用Fortran对微分方程求解,我们知道MATLAB已有内置的函数,比如ode家族,ode15s,对应着不同的求解办法。通过查看odepack的官方文档,我尝试使用了dlsode求解刚性和非刚性常微分方程组。 首先是github网址&am…

代码随想录算法训练营第四十六天|LeetCode 1143,1035,53

目录 LeetCode 1143.最长公共子序列 动态规划五步曲: 1.确定dp[i][j]的含义 2.找出递推公式 3.初始化dp数组 4.确定遍历顺序 5.打印dp数组 LeetCode 1035.不相交的线 LeetCode 53.最大子序列和(动态规划) 动态规划五步曲: 1.确定…

【rust/egui】(五)看看template的app.rs:SidePanel、CentralPanel以及heading

说在前面 rust新手,egui没啥找到啥教程,这里自己记录下学习过程环境:windows11 22H2rust版本:rustc 1.71.1egui版本:0.22.0eframe版本:0.22.0上一篇:这里 SidePanel 侧边栏,如下图 …

【软件安装】Python安装详细教程(附安装包)

软件简介 Python由荷兰数学和计算机科学研究学会的Guido van Rossum 于1990 年代初设计,作为一门叫做ABC语言的替代品。Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质&#xff0c…

Dynamic CRM开发 - 使用XrmToolbox工具创建自动编号

有时需要为实体创建自动编号,可以使用XrmToolbox工具。 下载XrmToolbox(https://www.xrmtoolbox.com/) 解压后打开XrmToolBox.exe,如下图: 打开后界面如下: 在“Tools”选项卡中找到Auto Number Manager工具</

麒麟OS国产系统身份证阅读器web网页开发使用操作流程

1、打开麒麟软件商店&#xff0c;选择驱动&#xff0c;找到身份证阅读器&#xff0c;找到东信智能身份证社保卡读卡器&#xff0c;点击安装。 2、安装完成后&#xff0c;点击打开 3、进入读卡界面 4、进入代码集成 <script type"text/javascript">var ctnFin…