AUTOSAR学习笔记_NVM详解

AUTOSAR学习笔记_NVM详解

1、简介

1.1、背景

NVM:Non-Volatile RAM Manager,非易失内存管理

汽车ECU内存中存在着各式各样的变量,大多数变量随着ECU的掉电会丢失数据。也有一部分变量会伴随着整个ECU生命周期而一直存在。比如:车辆的VIN码,防盗钥匙,车辆下线配置字等等。而今天所说的Autosar NVM模块为ECU内所有NV(Non Volatile) data 进行管理与维护,并提供服务确保这些数据被正确的存储或备份。

1.2、缩略词

NVM:NVRAM Manager,NVRAM:Non Volatile RAM,非易失数据内存管理,是应用app层访问非易失性数据的唯一接口,提供非易失数据的管理服务。(服务层)

MEMIF:Memory Abstraction Interfacen,内存抽象接口(ECU抽象层)

FEE:Flash EEPROM Emulation,Flash模拟EEPROM(ECU抽象层)

EA:EEPROM Abstraction,EEPROM抽象(ECU 抽象层)

FLS:Flash Driver,Flash驱动(MCAL 层)

EEP:EEPROM Driver,EEP驱动(MCAL 层)

1.3、功能介绍

NvM模块负责管理和从非易失性内存中读写数据。在系统启动和关闭阶段,同步应用程序RAM区的数据。此模块还提供其他服务,例如用于上层数据保护的冗余数据单元。同时,RTE提供了简单灵活和接口(NvData Interface)用于非易失内存的数据处理。在AuoSAR架构中NvM的主要功能可以概述为以下几点:

  • 提供了三种Block的管理类型(Native、Redundant、DataSet)
  • 支持16bit和32bit的CRC校验
  • 支持数据操作的优先级机制,支持Immediately写操作
  • 给APP提供服务接口,NV Data类型的数据接口在APP层可以直接操作
  • NvM与APP的同步机制
  • 用于DCM诊断的数据操作
  • 支持操作数据读写操作的完成以及错误的回调通知
  • 可以配置的ID处理

2、架构图

在这里插入图片描述

在内存栈中包含**服务层(NvM)、抽象层(MemIf、EA、EEP、Fee)、MCAL(Fls、SPI等)**几个模块。

NVM模块上层是RTE,下层是对接Flash Driver或者EEPROM Driver的接口,所以可以理解为,NVM就是属于一个连接上层APP和底层的一个接口,应用层在执行一些和存储相关的服务如写EOL数据或者更新DTC的时候,会调用NVM里面的函数Memif_Read()或者Memif_Write(),而NVM又根据不同的需求,整合了分别调用Flash和EEPROM的接口

3、NVM的两种存储机制

AutoSAR中对NV数据的存储主要包括片内存储和外部存储两种方式:

3.1、片外EEPROM

通过外部EEPROM进行存储,一般会调用SPI、IIC等通信方式外挂EEPROM芯片,EEPROM(EA : EEPROM Abstraction)

  • 优点:读写速度快,寿命长
  • 缺点:价格较高

3.2、片内存储

用芯片内部的FLASH进行模拟存储,FLASH EEPROM模拟(FEE : Flash EEPROM Emulation)

  • 优点:价格便宜
  • 缺点:访问速度慢,擦写限制,寿命较短

4、NVRAM Block

在Autosar中规定了四种 NVRAM Block,分别为 NV Block、RAM Block、ROM Block、Administrative Block。这四种Block作为NVRM Block的最小单元,叫Basic Storage Object

  • NV block

NV block是存储NV变量的基本结构,其中Header以及CRC校验非必须项。

  • Ram block

由于NV变量的写入与读取都是一件相对较慢的操作,而应用层逻辑操作周期速度又太快。直接操作NV block显然不合适,所以在进行读写之前,我们会建议一个同样大小的Ram空间来操作、使用、存放这些还没有被写入或者读取的NV值。可以理解为NV block在RAM中的镜像,应用软件运行时并不会直接使用NV Block中的信息,而是使用RAM Block中的信息,在需要存储时才调用NvM的Write把RAM Block中的信息往NV Block中写,初始化或需要恢复数据时从NV Block中读取到RAM Block中使用

在NVM中规定了permanent,temporary 两种类型。其中永久型在项目配置时就必须输入指定的RAM地址;而临时型不需要在项目配置期间就设定

  • Rom block

ROM block 用于存储默认值,以便当NV block数据出现损坏时予以替换,也可以没有;

  • Administrative block

Administrative block是专门用于对NVRAM Block 与 RAM blcok 的数据安全性进行管理而设计的,它对应用层并不可见。

5、Block的三种管理类型

  • Native NVRAM block,最常用的单一Block,用于对数据存储要求不高的场景
  • Redundant NVRAM block,比Native多了一个相同大小的NV Block,2个NV Block可以形成冗余备份,一个Block异常,从另一个恢复数据
  • Dataset NVRAM block,可以多达255个相同大小NV Block,使用比较灵活,可以用于根据不同需要从不同NV Block中读取数据使用的场景(比如同一版软件用于不同项目的数据),Dataset NVRAM类型的设计可以根据需要对一个数据在NvRAM中以一定的循环偏移进行存储,每一次存储位置可以不同,实现对NvRAM的寿命延长

如下如所示:

管理类型NV 块Ram 块Rom 块管理块
NVM_BLOCK_NATIVE110…11
NVM_BLOCK_REDUNDANT210…11
NVM_BLOCK_DATASET<25610…11

6、MemService 组成

NvM模块向User提供各种非易失存储器的数据管理,NvM模块自身是独立于硬件的,但所有的功能都是直接访问硬件的,包括内部/外部的 EEP,或者是内部/外部的Flash 模拟的EEP。NVRAM 管理器处理对非易失性数据的并发访问,并提供可靠性机制,如单个数据元素的校验和保护。

MemService 由NvM MemIf EA EEP Fee Fls组成,支持对Flash 和Eeprom的数据集成管理,

6.1、MemIf 模块

Memory Abstraction Interface (MemIf)作为接口抽象层, 为 NvM 提供访问 Fee/EA 模块的函数,NvM借此抽象成硬件无关的模块,实现存储数据Block在内部Flash或者外部EEP的分离操作

MemIf 通过Device Id将Fee 与EA 的相关接口抽象成MemIf接口供NvM访问

6.1.1、Device & Api管理

MemIf 可以同时管理EA 和FEE,通过NvM Block 的 DeviceId 配置属性,进行识别,在访问对应的Device Api

  • EA 的Device ID 0
  • Fee 的Device ID 1

6.2、EA 模块

由于EEP 是可以支持直接写入的,因此存储在Eep的Block地址都是固定的,Ea 模块为EEPROM 硬件抽象层, 通过访问下层 Eep 模块提供的 API 操作 EEPROM 硬件, EEPROM 具有如下物理特性:

  • 可按字节写入。
  • 写入前不需执行数据擦除操作。

由于 EEPROM 具有如上特性, Ea 可为每个 Block 确定具体的硬件存储地址并划分存储空间, NvM 在执行读/写等服务时, 通过 Ea 完成相应 Block 的地址映射即可操作 EEPROM 硬件中数据

6.2.1、EA 地址管理

通过获取 NvM Block 的类型、 长度等配置, Ea 按照各 Block 的长度为其分配地址空间, 从 0 地址起依次向后排列。

6.2.2、EA Block 写入管理

Ea Block 中包含块状态标识位, 该标识位会存入 Eeprom 中, 通过该字段可以判断当前 Block 是否有效。在读任务若发现标识位为无效的状态, 则直接向上层返回 MEMIF_BLOCK_INVALID 失败状态;若发现标识位不为有效/无效值, 则直接向上层返回 MEMIF_BLOCK_INCONSISTENT 失败状态。

6.3、EEP

提供外部EEPROM的操作接口和驱动

6.4、Fee 模块

Fee(Flash Eeprom Emulation), 顾名思义就是Flash 模拟Eeprom. 那么为何不直接使用Eeprom,或者说Flash为什么需要模拟Eeprom.

Flash 与 EEP 都属于非易失存储器(Non-Valatile Memory),主要存在以下几点区别

  • 成本:同样的存储空间,EEP比Flash贵上许多,因此一般MCU上Flash空间要比EEPROM 空间大
  • 擦写方式:Flash 以Page为单位,擦除的时候 必须按照Page 为单位擦住,同时写入的时候,只能写1,也就是由0->1,因此如果要改写某个Page的一个Byte,那么必须先将Page的内容全部读到Ram,然后改写Ram中对应的变量,然后擦除该Page,最后把Ram修改后的值写入到Page,也就是需要以下三步:读->改->写
  • Eeprom 支持按照Byte直接修改Fee,就是将Flash的写入操作,通过软件的模拟成EEP.

6.4.1、模拟EEP写入方式

Fee 通过 Fls 模块操作 DataFlash, DataFlash 具有如下物理特性:

  • 按页写入, 写数据需为物理页的整数倍, 否则需做字节补齐。
  • 写入前需确保此段空间未被写入过数据, 否则需要擦除后再写入数据。
  • 最小擦除单位为整个物理扇区。

Fee 的写入单元是Block,Fee Block 是继承自NvM Block,在NvM Block 数据的基础上加上Fee Block Header数据,形成Fee Block。

Fee 写入Block 按照先写入,地址就靠前的原则,下次写入Block 就依次往后排。这样确保每次写入都不需要擦除。

6.4.2、Fee翻页机制

Fee 通过对Flash空间整体划分为两个逻辑Sector, 一个作为Active Sector,一个作为Inactive Sector。这两个Sector 由一个或者多个物理Sector组成。

在任意时间,只能有一个Logical Sector在作为 Active Sector只有当Active Sector,如何写入下一个Block,或者达到配置的剩余空间,那么就会进行翻页操作。翻页操作一般会经历如下几个步骤:

  • 将所有Block的最新数据写入到Inactive Sertor
  • 擦除Active,设置Inactive Sector为Active

6.5、FLS模块

Flash Driver提供操作Flash的接口

7、NvM数据操作同步机制

NVM里面的数据读写有两种同步机制,分别是Implicit synchronization(隐式同步)和Explicit synchronization(显式同步)

7.1、Implicit synchronization(隐式同步)

在隐式同步中,应用层和NVM可以同时访问公用的RAM,就是应用层在读写时调用NVM里面的接口。

这种情况下,一块RAM最好只映射到一个SW-C,并且在读写操作进行中,这块RAM里的数据不能改变。

写操作步骤:

(1)应用层将数据写入RAM

(2)应用层调用NvM_WriteBlock()函数,开始进入NVM执行操作

(3)应用层通过轮询方式检查NVM写操作结果,NVM执行写操作之后,应用层才可以更新RAM中的内容

7.2、Explicit synchronization(显式同步)

在这种情况下,NVM定义一个RAM Mirror,与应用层中的RAM进行数据交换,APP将数据写进RAM并且调用NVM的接口,NVM将数据从应用层RAM拷贝到RAM Mirror。

在显式同步中,采用了Mirror机制更好的防止数据一致性破坏,但是需要额外的RAM开销。

写操作步骤:

(1)APP将数据填充进RAM

(2)应用层调用NvM_WriteBlock()函数,开始进入NVM执行操作

(3)应用层RAM中的数据拷贝进NVM RAM Mirror中以后就可以随意修改RAM的数据了

7.3、异步调用

由于NV data区域的访问速度较慢,所以NVM所支持的API多以异步调用为主。其核心函数为周期执行的NvM_MainFunction()。下面主要阐述了在异步调用中使用 PollingCallback 两种方式来执行NvM_WriteBlock()操作。

  • Polling

在NVM User 请求写入NvM_WriteBlock时,会将这个任务写入存储在队列里,并由后台***NvM*_MainFunction()** 执行。Nvm user需要用polling 方式主动查询写入结果。如果返回NVM_REQ_PENDING,表示还没有执行完成,回复NVM_REQ_OK 表示执行成功。

  • Callback

在call back模式下,如果执行成功,NvM_MainFunction() 会主动调用call back 函数来提醒 NVM user 来查询结果。

写操作步骤:

(1)应用层将数据写入RAM

(2)应用层调用NvM_WriteBlock()函数,开始进入NVM执行操作

(3)应用层通过轮询方式检查NVM写操作结果,NVM执行写操作之后,应用层才可以更新RAM中的内容

8、NvM数据操作类型

NvM在使用的时候需要BSW的NvM进行配置,对数据的操作中在APP可以使用两种类型的模式,

  • 定义一个应用层的Nv Component和内置的NvData Inteface实现,在Nv Component中会自动关联到底层的NvM中定义的Block
  • 采用CS接口直接调用NvM的服务接口。

对于数据的操作分为周期写、下电写、立刻写三种。

8.1、周期写

建议一般尽量少使用周期写,因为EEPROM和内部的Dflash都有一定的擦写寿命的限制。周期写需按照以下步骤执行:

  • 在Nv Component中需要配置对应的周期触发函数

  • 调用Rte_Write()的时候会将数据存储的Flag设置为TRUE

  • 周期到了触发NvM_WriteBlock操作,同时清除存储标志

  • 在NvM_MainFunction进行后续的操作

    如下图所示:

在这里插入图片描述

8.2、下电写

大多数NVM相关的数据是在下电的时候进行数据的存储,在BswM的Shutdown阶段调用WriteAll实现该功能。

  • 在Nv Component中需要配置对应的ShutDown存储方式
  • 调用NvM_SetRamBlockStatus通知Rte表示数据发生了变化在下电的时候要存储
  • 调用Rte_Write的时候会将存储Flag设置,同时设置对应的Evet Flag为TRUE,此时激活对应的函数NvM_SetRamBlockStatus设置变化位,以便执行下电的时候存储
  • 在BswM执行下电的时候,调用NvM_WriteAll进行所有数据的下电存储

如下图所示:

在这里插入图片描述

8.3、立刻写

立刻写:对于一些重要的改变的数据,根据情况在数据发生重要变化的时候需要立马存储。

  • 在调用Rte_Write的时候,数据会存储到NV Block中,同时会把Direct Flag设置为TRUE,此时的触发Event Flag被设置为TRUE

  • 此时由于Event的Flag被设置了,作为一个触发源会去激活相应的Task

  • 在Task中调用Nvm_WriteBlock的函数,将数据存储,此时会清除Direct Flag和Event Flag

  • NvM_WriteBlock的传递参数为NULL,一般需要一个永久的RAM(Global的变量Mirror)

  • 在NvM的MainFunction查看Mirror的状态

  • NvMWriteRamBlockToNvM调用将数据放到NvM中,调用EA或者FEE的接口函数,存储到EEPROM或者FLASH中

如下图所示:

在这里插入图片描述

9、参考连接

AUTOSAR之NVM模块介绍

Autosar NvM 详解

06 CP AUTOSAR NvM 详解

  • 6
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值