AUTOSAR NvM Block的Native、Redundant和Dataset有什么区别?

描述

AUTOSAR的NvM Block有三种Native、Redundant和DataSet,用得最多的是Native,但你知道其他两种是干什么的吗?

AUTOSAR NVM(Non-Volatile Memory)是AUTOSAR标准中定义的一种用于存储非易失性数据的机制。在AUTOSAR NVM中,数据被存储在一个或多个NVM块中。每个NVM块由一个或多个NVM数据集组成,可以存储不同类型的数据。

数据集

图见《一图读懂AUTOSAR NvM(附pdf版文档资源)》

在AUTOSAR NVM块中的三种类型,它们之间的区别如下:

Native

Native数据是NVM块中存储的原始数据,是应用程序需要读写的数据。Native数据只在NVM块中存储一份,如果数据损坏或丢失,将无法恢复。因此,在写入Native数据时,需要确保数据的可靠性和一致性。

举例说明:江湖中的《九阳神功》只有一份,弄丢了就丢了。

Redundant

Redundant数据是为了增加数据的可靠性而存储在NVM块中的备份数据。与Native数据不同,Redundant数据通常存储在NVM块中的不同位置,以增加数据的冗余度。如果Native数据损坏或丢失,可以使用Redundant数据进行恢复。在写入Redundant数据时,需要确保数据的可靠性和一致性,以确保Redundant数据可以成功地用于数据恢复。

举例说明:江湖中,如果你巧合得到了一份《葵花宝典》,你也很清楚这玩意的“魅力”,你不想拥有它也不希望它失传,于是偷偷抄了一份,把原件扔到江湖中,爱咋咋地。如果江湖中的原件丢了,那你可以偷偷拿出你的手抄稿慢慢研究,咳咳~~

DataSet

DataSet数据是AUTOSAR NVM中的一个特殊数据类型,它是一组数据的集合。DataSet数据通常用于存储应用程序的配置数据或状态数据,例如车辆参数、故障码等。与Native和Redundant数据不同,DataSet数据可以在应用程序运行期间进行读写,并且可以使用AUTOSAR配置工具进行配置和管理。

DataSet数据由一个或多个DataBlock组成,每个DataBlock由一个或多个DataElement组成。在写入DataSet数据时,需要确保数据的可靠性和一致性,并且需要考虑到数据的版本管理和数据更新等问题。

举例说明:江湖中的《降龙十八掌》有好多个版本,例如有洪七公版、郭靖版和乔峰版,每个版本都有点不一样。

总之,在AUTOSAR NVM中,Native数据是应用程序需要读写的原始数据,Redundant数据是为了增加数据的可靠性而存储的备份数据,DataSet数据是一组数据的集合,通常用于存储配置数据或状态数据,一般可以是车厂不同车型的配置数据。

理论是这个样子,话也是这么说,但总得拿出来遛一遛,看看实际的样子。

于是乎,上代码、改配置,直接运行试试效果:

以下工程验证还是基于《AUTOSAR NvM模块配置详解》案例来修改。

Native

这个在原来教程有展示了,也是用得比较多一种,就配置成Native就好了,在EEPROM或FLASH中存储的数据只有一份。

它的读写示意图是这样的:

数据集

数据集

Redundant

Redundant就是冗余、重复的意思,最直观的理解就是有多一个备份Block。这样可以让数据更加可靠、容错性更好,可用性也更好。

注意:只要数据了,备份每次都要重新同步的。

数据集

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

数据集

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

数据集

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

数据集

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

数据集

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

数据集

这样看来,这个非常适合用于存储非常重要的数据,例如用于功能安全场合。

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的区别了。

审核编辑 :李倩

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分