3、NVM 关键概念:NvM Block、Block类型、Block管理类型
好,我们直接进入正题。这一节要聊的,是NVM模块里最核心的几个概念。说白了,你搞懂了Block,就搞懂了NVM的一半。
3.1 什么是NvM Block?
NvM Block,你可以把它想象成一个“数据容器”。每个Block都对应着一组需要持久化存储的数据。比如,ECU的故障码、驾驶模式偏好、里程数——这些数据掉电不能丢,就得放到Block里。
我个人习惯把Block比作“文件柜里的一个抽屉”。每个抽屉有编号、有大小、有类型。你往里面放什么数据,怎么放,都由Block的属性决定。
核心要点:每个NvM Block在配置时,必须指定三个关键属性:Block ID(唯一标识)、Block Size(数据长度)、Block Type(存储策略)。
嗯,这里要注意:Block ID不是随便给的。我在项目中遇到过,有人把ID搞重复了,结果两个功能模块互相覆盖数据,查了三天才定位到问题。所以,ID一定要全局唯一,最好有个统一的分配表。
3.2 Block的三种类型
Block类型,说白了就是数据怎么存、怎么保护。AUTOSAR定义了三种:Native、Redundant、Dataset。我们一个一个说。
3.2.1 Native Block(原生块)
这是最基础的类型。一个Native Block,就是一块连续的内存空间。你写进去什么,读出来就是什么。没有冗余,没有校验。
什么时候用?很简单——数据丢了也无所谓,或者你有外部校验的场景。比如,一些临时性的标定参数,重启后重新学习就行,那用Native就够了。
我的建议:除非你非常确定数据不重要,否则别用Native。我曾经在一个量产项目里,因为图省事用了Native,结果OTA升级过程中断电,标定数据全丢了,客户投诉了一整周。从那以后,我但凡有点犹豫,都选Redundant。
3.2.2 Redundant Block(冗余块)
Redundant Block,说白了就是存两份。一份主数据,一份备份。读的时候,先读主数据,如果校验失败(比如CRC不对),就自动切到备份。
你想想看,这相当于给数据上了双保险。ECU在车上,什么情况都可能发生——掉电、电压不稳、写操作被打断。Redundant Block就是用来应对这些“脏”场景的。
我建议,所有关键数据都用Redundant。比如:
- VIN码(车辆识别号)
- 配置参数(比如CAN ID、网关路由表)
- 累计里程
注意:Redundant Block的存储空间是Native的两倍。如果你的Flash空间紧张,需要权衡。但说实话,现在Flash越来越便宜,为了可靠性,多花一倍空间是值得的。
3.2.3 Dataset Block(数据集块)
Dataset Block稍微复杂一点。它里面可以包含多个“数据集”(Dataset),每个数据集都有自己的编号。你可以理解为,一个Block里放了多个“版本”的数据。
举个例子:ECU需要存储最近10次的故障快照。每次故障,都写一个新的Dataset进去。读的时候,可以指定读第几个。这样,历史数据就不会被覆盖。
Dataset Block的典型应用场景:
- 故障码历史记录(DTC snapshot)
- 黑匣子数据(事故前后几秒的数据)
- 多版本标定参数
我记得有个项目,客户要求存储最近20次启动时的环境温度。用Dataset Block,每次启动写一个Dataset,读的时候按时间戳取最新的几个,非常方便。
3.3 Block的管理类型
管理类型,决定了Block在运行时怎么被操作。AUTOSAR定义了三种管理类型:
| 管理类型 | 说明 | 典型场景 |
|---|---|---|
| NVM_BLOCK_MANAGEMENT_DATA | 标准管理,支持读写、校验、冗余 | 绝大多数应用数据 |
| NVM_BLOCK_MANAGEMENT_NONE | 无管理,直接操作底层存储 | 临时数据、调试数据 |
| NVM_BLOCK_MANAGEMENT_REDUNDANT | 冗余管理,自动维护主/备份 | 关键安全数据 |
嗯,这里要解释一下:管理类型和Block类型是正交的。你可以有Native Block + 标准管理,也可以有Redundant Block + 冗余管理。但通常,我们会这样搭配:
- Native Block + NONE管理:用于临时数据,读写最快
- Redundant Block + DATA管理:用于一般关键数据
- Redundant Block + REDUNDANT管理:用于安全关键数据,双重保护
避坑指南:我曾经犯过一个错误——给一个Redundant Block配了NONE管理。结果写数据时,只写了主块,备份块一直是旧的。读的时候,主块校验失败,自动切到备份,读出来的是几个月前的数据。嗯,从那以后,我每次配置都会再三确认管理类型和Block类型是否匹配。
3.4 知识体系总览
说了这么多,我们用一个图来总结一下。这张图展示了NvM Block的核心概念和它们之间的关系。
这张图把Block类型、管理类型、关键属性串在了一起。你配置一个Block时,这三方面都要考虑清楚。
一个小技巧:刚开始接触NVM时,可以先从Redundant Block + DATA管理入手。这是最稳妥的组合,覆盖了80%以上的应用场景。等熟悉了,再根据实际需求调整。
好了,这一节的内容就到这里。记住:Block是NVM的基石,类型决定怎么存,管理类型决定怎么管。搞清楚了这些,后面的配置和调试就会顺畅很多。
公众号:蓝海资料掘金营,微信deep3321