AUTOSAR的NvM Block有三种Native、Redundant和DataSet,用得最多的是Native,但你知道其他两种是干什么的吗?
AUTOSAR NVM(Non-Volatile Memory)是AUTOSAR标准中定义的一种用于存储非易失性数据的机制。在AUTOSAR NVM中,数据被存储在一个或多个NVM块中。每个NVM块由一个或多个NVM数据集组成,可以存储不同类型的数据。

在AUTOSAR NVM块中的三种类型,它们之间的区别如下:
1.Native
Native数据是NVM块中存储的原始数据,是应用程序需要读写的数据。Native数据只在NVM块中存储一份,如果数据损坏或丢失,将无法恢复。因此,在写入Native数据时,需要确保数据的可靠性和一致性。
举例说明:江湖中的《九阳神功》只有一份,弄丢了就丢了。

2.Redundant
Redundant数据是为了增加数据的可靠性而存储在NVM块中的备份数据。与Native数据不同,Redundant数据通常存储在NVM块中的不同位置,以增加数据的冗余度。如果Native数据损坏或丢失,可以使用Redundant数据进行恢复。在写入Redundant数据时,需要确保数据的可靠性和一致性,以确保Redundant数据可以成功地用于数据恢复。
举例说明:江湖中,如果你巧合得到了一份《葵花宝典》,你也很清楚这玩意的“魅力”,你不想拥有它也不希望它失传,于是偷偷抄了一份,把原件扔到江湖中,爱咋咋地。如果江湖中的原件丢了,那你可以偷偷拿出你的手抄稿慢慢研究,咳咳~~

3.DataSet
DataSet数据是AUTOSAR NVM中的一个特殊数据类型,它是一组数据的集合。DataSet数据通常用于存储应用程序的配置数据或状态数据,例如车辆参数、故障码等。与Native和Redundant数据不同,DataSet数据可以在应用程序运行期间进行读写,并且可以使用AUTOSAR配置工具进行配置和管理。
DataSet数据由一个或多个DataBlock组成,每个DataBlock由一个或多个DataElement组成。在写入DataSet数据时,需要确保数据的可靠性和一致性,并且需要考虑到数据的版本管理和数据更新等问题。
举例说明:江湖中的《降龙十八掌》有好多个版本,例如有洪七公版、郭靖版和乔峰版,每个版本都有点不一样。

总之,在AUTOSAR NVM中,Native数据是应用程序需要读写的原始数据,Redundant数据是为了增加数据的可靠性而存储的备份数据,DataSet数据是一组数据的集合,通常用于存储配置数据或状态数据,一般可以是车厂不同车型的配置数据。
理论是这个样子,话也是这么说,但总得拿出来遛一遛,看看实际的样子。
于是乎,上代码、改配置,直接运行试试效果:
以下工程验证还是基于《 AUTOSAR NvM模块配置详解 》案例来修改。
1.Native
这个在原来教程有展示了,也是用得比较多一种,就配置成Native就好了,在EEPROM或FLASH中存储的数据只有一份。
它的读写示意图是这样的:


2.Redundant
Redundant就是冗余、重复的意思,最直观的理解就是有多一个备份Block。这样可以让数据更加可靠、容错性更好,可用性也更好。
注意:只要数据了,备份每次都要重新同步的。

实际案例中的写入过程动图是这样的:

在读的时候,读到其中一份是正确的就OK了

真实的读取过程也很简单:

但是,如果从第一个Block读取的数据是错误的(例如CRC校验不正确),那么,它就会从备份Block去读取数据。以下,我故意将CRC部分改成别的错误值,其读出来后会校验CRC,发现错的,再尝试读取备份区域的数据:

那么它的读取过程是怎样的呢?看动图:

这样看来,这个非常适合用于存储非常重要的数据,例如用于功能安全场合。
3.DataSet
DataSet数据是一组数据,这组数据里面有很多份相互独立的数据。它并不像Redundant那样,这些数据即使会有些相似性,但都是不一样的,改动其中一份不会影响其他的。
DataSet的读写其实跟Native的基本一样,只是在操作之前需要调用 NvM_SetDataIndex 函数来指定要操作哪一个DataSet数据块。它的参数定义是这样的:
Std_ReturnType NvM_SetDataIndex(NvM_BlockIdType BlockId, uint8 DataIndex)
如果不调用这个 NvM_SetDataIndex 函数,默认情况下,是操作最前的那个数据块,跟Native的表现一致:

如果操作第二块就是这样(起始地址是第一块的后面,紧挨着的):

以上就是NvM Block的Native、Redundant和DataSet的区别了。
|