[AutoSar NVM] 存储架构
依AutoSAR及公开知识辛苦整理,禁止转载。 专栏 《深入浅出AutoSAR》, 全文 2900 字.

图片来源: 知乎
汽车的ECU内存中有很多不同类型的变量,这些变量包括了车辆各个系统和功能所需的数据。大部分变量在ECU掉电后就会丢失,因为它们是易失性数据,无法长期保存。然而,在这些易失性数据之外,还存在一些非常重要的变量,它们被称为非易失性数据。
其中一个非易失性数据是车辆的VIN码(Vehicle Identification Number),VIN码是唯一标识一辆汽车身份信息的序列号。每辆汽车都有一个独特的VIN码,并且该码通常被用于注册、保险以及维修等方面。由于其重要性,VIN码需要在ECU掉电后仍能够保留。
另一个非易失性数据是防盗钥匙信息。现代汽车普遍采用了电子钥匙系统来提高安全性能。防盗钥匙信息包括了与钥匙配对相关的加密算法和认证机制等内容,在ECU掉电后依然需要保存以确保正确地进行身份验证和解锁操作。
此外,下线配置字也属于非易失性数据之一。下线配置字记录了生产过程中对某款汽车进行特定设置或调整时所使用到的参数和选项等信息。这些配置字可以影响到整个汽车系统运行状态和功能表现,在ECU掉电后仍需储存以确保恢复出厂设置或其他必要操作时能够准确应用。
为管理和维护所有这些重要而又不可丢失的非易失性数据,Autosar NVM模块应运而生。Autosar NVM(Non-Volatile Memory)模块专门负责处理与非易失性数据相关的存储、备份、读取和写入等任务。通过合理地管理NVM模块,可以有效地确保这些关键数据得到正确地保存,并在需要时能够快速访问。
Autosar NVM支持两种NV(Non-Volatile)变量存储方式:静态存储区域(Static Storage Area)和动态存储区域(Dynamic Storage Area)。
静态存储区域主要用于保存那些:
- 固定不变
- 只偶尔更新但占据空间较小
- 访问频率相对低的NV变量
而动态存储区域则适用于那些:
- 经常发生改变
- 更高访问频率
- 占据空间较大
Autosar 存储软件架构
AUTOSAR,存储模块软件架构分层依次是:
NVM->MemIf->Fee->FLS->FLASH

- NVM是存储服务层,也就是存储模块最上层,该层是对外提供的接口。
- MemIf是接口层,区分下面是Fee还是Ea。
- Fee是Flash模拟EEPROM的抽象层。
- Fls是flash驱动。AUTOSAR规范中是通过DFLASH模拟EEPROM的形式将数据存到DFLASH中的。
Autosar NVM
在基础软件的服务层中,Autosar NVM作为非易失性存储器管理工具。它不仅提供了多种同步/异步服务来维护和管理所有非易失性存储器(NV)数据,还具备一系列功能来满足各种需求。
首先,在数据操作方面,Autosar NVM提供了初始化、读取、写入和控制等功能。通过这些功能,开发人员可以轻松地对非易失性存储器中的数据进行操作,并确保数据的可靠性和完整性。无论是处理EEPROM还是Flash模拟等不同类型的非易失性存储器,在Autosar NVM这个层级上都以相同类型进行抽象处理,使得开发人员可以统一调用Autosar NVM提供的接口进行操作。
其次,在底层细节与应用程序解耦方面,Autosar NVM设计将底层细节与应用程序解耦合。具体而言,在MemIf层才会对具体存储介质进行区分。通过MemIf层,可以根据实际情况选择合适的驱动程序或算法来处理EEPROM或Flash模拟等不同类型的非易失性存储器。
此外,在错误检测和纠正机制方面,Autosar NVM支持自动监测并修复可能存在于非易失性存储器中的错误。这大大增强了系统对于数据完整性和稳定运行环境方面 的保障。

NVRAM Block
在Autosar中规定了四种 NVRAM Block,分别为 NV Block、RAM Block、ROM Block、Administrative Block。

1. NV Block
NV Block是一种非易失性存储器块,用于存储需要在ECU断电后保持的数据。这种存储器的读写速度较慢,但具有高可靠性和长寿命。NV Block通常用于存储ECU的配置设置、故障码、历史数据等信息。
NV block是存储NV变量的基本结构,其中Header以及CRC校验非必须项。

2. RAM Block
RAM Block是一种随机存储器块,用于存储需要在ECU上电后才能保持的数据。这种存储器的读写速度较快,但是在ECU断电或重启后,存储的数据会丢失。RAM Block通常用于临时存储一些运行时数据,如缓存、栈、堆等。
缓存(Cache)是一种临时存储,在计算机系统中用于存储频繁使用的数据,加速计算机的运行速度。缓存由CPU内部或者外部芯片组实现,可以分为一级缓存、二级缓存等。
栈(Stack)是一种数据结构,它以先进后出的顺序存储数据,即后进先出。栈一般分配在内存的高地址,有一个指针记录下栈顶的位置。栈常用于函数调用、表达式求值、递归等操作。
堆(Heap)也是一种数据结构,它用于存储动态分配的内存。堆的内存分配和释放不是按照固定顺序进行的,也不是像栈那样有一个指针指向栈顶,而是由程序员自己控制的,因此堆中的内存可以被多个指针引用,也可以在程序的任何地方进行释放。

由于NV变量的写入与读取都是一件相对较慢的操作,而应用层逻辑操作周期速度又太快。直接操作NV block显然不合适,所以在进行读写之前,我们会建议一个同样大小的Ram空间来操作、使用、存放这些还没有被写入或者读取的NV值。
在NVM中规定了permanent,temporary 两种类型。其中永久型在项目配置时就必须输入指定的RAM地址;而临时型不需要在项目配置期间就设定
3. ROM Block
ROM Block是一种只读存储器块,用于存储只读数据。这种存储器的读取速度较快,但不能进行写操作,也不能在ECU运行时修改存储的数据。ROM Block通常用于存储ECU的程序代码、固件升级文件等。
4. Administrative Block
Administrative Block是一种系统级别的存储器块,用于存储ECU的元数据和管理信息。Administrative Block通常包含ECU的识别码、版本信息、访问权限等。
Administrative block是专门用于对NVRAM Block 与 RAM blcok 的数据安全性进行管理而设计的,它对应用层并不可见。

参考
| META | Autosar NVM 介绍 - 知乎 |
| AutoSar | AUTOSAR_SRS_MemoryServices.pdf |
| AutoSar | AUTOSAR_SWS_NVRAMManager.pdf |
| 汽车工程师谈技术 | Autosar nvm的机制原理是怎样的 |

图片来源: COMIDOC
免责声明:
本文根据公开信息整理,旨在介绍更多的汽车知识,所载文章仅为作者观点,不构成投资或商用建议。本文仅用于学习交流, 不允许商用。若有疑问或有侵权行为请联系作者处理。
相关文章:
[AutoSar NVM] 存储架构
依AutoSAR及公开知识辛苦整理,禁止转载。 专栏 《深入浅出AutoSAR》, 全文 2900 字. 图片来源: 知乎 汽车的ECU内存中有很多不同类型的变量,这些变量包括了车辆各个系统和功能所需的数据。大部分变量在ECU掉电后就会丢失&#x…...
ES10 新特性
1. Object.fromEntries Object.fromEntries() 方法把可迭代对象的键值对列表转换为一个对象。 语法: Object.fromEntries(iterable)iterable:类似 Array 、 Map 或者其它实现了可迭代协议的可迭代对象。返回值:一个由该迭代对象条目提供对应属性的新对象。相当于 Object.e…...
宝塔安装脚本
Centos安装脚本 yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec Ubuntu/Deepin安装脚本 wget -O install.sh https://download.bt.cn/install/install-ubuntu_6.0.sh && sud…...
gulp打包vue3+jsx+less插件
最终转换结果如下 在根目录下添加gulpfile.js文件,package.json添加命令npm run gulp var gulp require(gulp) var babel require(gulp-babel) var less require(gulp-less) var del require(del); var spawn require(child_process).spawn;const outDir &…...
华为ICT——第四章深度学习和积卷神经
接第三章的末尾: 目录 接第三章的末尾: 1:自适应阈值分割: 2:形态处理: 4:膨胀: 5:腐蚀 6:开运算 7:闭运算 8:特征描述子 9…...
MongoDB 学习笔记(基础)
概论 出现背景:MongoDB 是文档型数据库,由于传统的关系型数据库(如 MySQL),在数据操作的“三高”需求以及应对 web 的网站需求面前显得有些吃力,在此环境下 MongoDB 出世了 三高需求: (1) 对数…...
【TGRS 2023】RingMo: A Remote Sensing Foundation ModelWith Masked Image Modeling
RingMo: A Remote Sensing Foundation Model With Masked Image Modeling, TGRS 2023 论文:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber9844015 代码:https://github.com/comeony/RingMo MindSpore/RingMo-Framework (gitee.com) …...
性能测试 —— 生成html测试报告、参数化、jvm监控
1.生成HTML的测试报告 1.1配置 (1)找到jmeter 的安装目录,下的bin中的jmeter.properties(jmeter配置文件) (2) ctrl f ,搜索jmeter.save.saveservice.output_format,取消井号 并且 把等号后的xml改为csv,…...
堆(二叉树,带图详解)
一.堆 1.堆的概念 2.堆的存储方式 逻辑结构 物理结构 2.堆的插入问题 3.堆的基本实现(代码)(以小堆为例) 1.堆的初始化 2. 向上调整 3.插入结点 4. 交换函数、堆的打印 5.向下调整 6.删除根节点并调整成小根堆 7.获取堆…...
vue3 code format bug
vue code format bug vue客户端代码格式化缺陷,为了方便阅读和维护,对代码格式化发现这个缺陷 vue.global.min.3.2.26.js var Vuefunction(r){"use strict";function e(e,t){const nObject.create(null);var re.split(",");for(le…...
7-3、S曲线生成器【51单片机控制步进电机-TB6600系列】
摘要:本节介绍步进电机S曲线生成器的计算以及使用 一.计算原理 根据上一节内容,已经计算了一条任意S曲线的函数。在步进电机S曲线加减速的控制中,需要的S曲线如图1所示,横轴为时间,纵轴为角速度,其中w0为起…...
CDC实时数据同步
一丶CDC实时数据同步介绍 CDC实时数据同步指的是Change Data Capture(数据变更捕获)技术在数据同步过程中的应用。CDC技术允许在数据源发生变化时,实时地捕获这些变化,并将其应用到目标系统中,从而保持数据的同步性。…...
javaEE -10(11000字详解5层重要协议)
一:应用层重点协议 1.1: DNS DNS,即Domain Name System,域名系统。DNS是一整套从域名映射到IP的系统。 TCP/IP中使用IP地址来确定网络上的一台主机,但是IP地址不方便记忆,且不能表达地址组织信息&#x…...
360智慧生活旗舰产品率先接入“360智脑”能力实现升级
10月25日,360智慧生活秋季新品及视觉云方案发布会在深圳召开。360智能硬件产品,诸如 360可视门铃、360智能摄像机、360行车记录仪、360儿童手表和家庭防火墙等,都在各自的行业有着举足轻重得地位,而这次发布的系列新品,…...
【系统架构设计】 架构核心知识: 2 云原生架构
目录 一 云原生架构 1 云计算 2 分类 3 云计算架构 4 云原生架构设计原则...
Unity - 导出的FBX模型,无法将 vector4 保存在 uv 中(使用 Unity Mesh 保存即可)
文章目录 目的问题解决方案验证保存为 Unity Mesh 结果 - OK保存为 *.obj 文件结果 - not OK,但是可以 DIY importer注意References 目的 备忘,便于日后自己索引 问题 为了学习了解大厂项目的效果: 上周为了将 王者荣耀的 杨玉环 的某个皮肤…...
【疯狂Java】数组
1、一维数组 (1)初始化 ①静态初始化:只指定元素,不指定长度 new 类型[] {元素1,元素2,...} int[] intArr; intArr new int[] {5,6,7,8}; ②动态初始化:只指定长度,不指定元素 new 类型[数组长度] int[] princes new in…...
leetcode 503. 下一个更大元素 II、42. 接雨水
下一个更大元素 II 给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数&…...
【德哥说库系列】-PostgreSQL跨版本升级
📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…...
rust学习——智能指针
智能指针 在各个编程语言中,指针的概念几乎都是相同的:指针是一个包含了内存地址的变量,该内存地址引用或者指向了另外的数据。 在 Rust 中,最常见的指针类型是引用,引用通过 & 符号表示。不同于其它语言…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
