Autosar软件架构之NVM软件实现-Part1

        接触Autosar软件架构也有两年的时间了,一直在输入,包括文档,代码,工具学习,虽然看似积累的很多知识,但停留在大脑中总是觉得非常混乱,索性就将他写出来,一方面是理清知识逻辑,另一方面分享知识给感兴趣的人,一起进步。

        为了使内容不枯燥,我决定采用倒叙的方式讲解NVM软件实现,先将结果展示出来,然后一步步的去讲解软件的实现。

1. NVM block 类型

        NVM block 主要分两种类型, Native 和 Redundant.通常如果对于保存的数据没有可靠性的考虑,使用Native类型即可。如果对数据有可靠性要求,使用Redundant类型,这种类型相当于数据冗余,即在物理空间上有两块区域保存数据,在读/写时都会对两块区域进行操作,必免因一块区域损坏后,造成数据丢失。

Native类型的Block是最简单的block,只有一个有效区域。

Redundant类型的Block,有两个有效区域,两个区域中的数据完全相同。

2. NVM block在物理空间中字段定义

        本节以我接触的项目中,写入物理空间的数据为例。写入物理空间的数据并不是只有有效数据,还有其他的Format字节和管理字节。如下,是需要跟有效数据写入的。

        这里我们直接插入结论,接下来会描述原因。我的硬件平台是瑞萨RH850芯片,该芯片Data flash最小擦写单元(page)是64字节。如果需要写入的数据不超过45字节,则只占用一个page物理空间。

物理空间数据结构
地址偏移长度描述数据
0x004Erase Pattern1空,保持Dala Flash擦写值
0x044Start Pattern固定0xAAAAAAAA
0x084End Pattern固定0xAAAAAAAA
0x0C1Management byte固定0xF0
0x0D实际长度需要写入的数据
0x0D+数据长度2有效数据的CRC

占用的总字节数-4

(例如,占用64字节,则为0x3C)

4Erase Pattern2固定为0xAAAAAAAA

        根据表格内容,除有效数据外,其他字段占用19字节,1个page是64字节,则剩余45字节。因此如果数据不超过45字节的话,1个page空间就够了。

3. NVM block 写入物理地址上的数据与解析

3.1 Native类型

        对照第2小节的表格,我们发现,除了表格中的数据外,其他offset字段下也有数据。以下截图是我用E1从0XFF2030C0的地址处读到的数据,我猜测没有写过数据的区域,E1读到的是随机值,但是执行Blankcheck操作,未写过数据的区域,返回值为True。这里我们不必关心其他位置上的数据,只关心表格中的数据即可。

        以下我们读取Block length是2的NVM Block数据。从截图中我们可以看出,该Native类型的Block物理地址从0xFF2030C0处开始,offset=4开始,数据为0xAAAAAAAA, 0xAAAAAAAA, 0xF0,与表格中的数据一致。有效数据两个字节01 02, 紧跟的两个字节是CRC Byte, 0x7C和0x0E. offset=0x3C,存放固定数据0xAAAAAAAA. 所以,写入到物理地址中的数据并不仅仅包含有效数据,还包括其他类型字节。

        这里我们说一下CRC字节,Memory stack在存储数据之前,会先计算数据的CRC,然后CRC字节会跟数据一块写入。CRC字节在NVM Read时用于校验存储的数据是否有效,如果读到的数据计算出的CRC与存储的CRC不一致,则NVM读接口返回NVM Block 默认值。这也是为什么,在NVM没写的情况下,返回默认值的原因。

3.2 Redundant类型

        Redundant类型主要是为了数据可靠性,而设计出的Block类型。两块地址连续的物理内存中存放着相同的数据,如果一块区域损坏,则会从备份的区域读写数据,保证关键数据的可靠性。

        我们以存放地址为0xFF206B80, length为4 的NVM Block,要求写入次数达到625000次为例进行讲解。

        这里插入一些背景知识,瑞萨RH850 Data Flash在同一个地址上的最大擦写次数为125000次,如果需要625000次的写入次数,我们需要5个相同的区域,来分摊写入次数,才能满足写入次数的需求,这里引入一个DataSet的概念。现在我们需要5个区域来存储数据,则DataSet=5,软件根据DataSetIndex依次读取每个区域数据,假如DatasetIndex=2区域上的数据为空,则将数据直接写入该物理空间上,如果DatasetIndex=4,已经存在数据,则会将两块区域全部擦除,重新从Dataindex=0的地址处写数据。

        DataSetSize根据(2*pattern bytes+1 manage byte+byte length + 2 CRC Bytes)按照4字节对齐获得长度值,这里bytelength=4,则DatasetSize=16. 

        则该Block占用的总字节=1 erase pattern1 + 5 * DataSetSize + 1 end pattern2按照64字节(page)对齐,占用总字节数是128bytes. 所以地址从0xff206b80-0xff20bff是NVM Block占用空间,0xff206c00-0xff206b7f是备份空间

        从下图我们可以看到2个相同的数据块,里面存放着相同的数据,最新的数据在DataIndex=1位置上,数据是20 00 00 20,数据也是从DatasetIndex=0,DatasetIndex=1按顺序写到物理空间中的。如果DatasetIndex=4上已经有数据,还要写入数据的话,则需要先擦除DataFlash从DataIndex=0位置重新写,现象与我们的理论一致。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值