12.AUTOSAR 存储栈分析(一)--NvM

目录

1.概述

2.NVRAM Manager

2.1 功能描述

2.2 Block描述

2.3 NvM的使用场景

3.小结


1.概述

AUTOSAR 存储栈主要是用于管理EEPROM和Flash EEPROM中的非易失性数据,根据汽车运行环境保证数据能够被完整存储和保持。

整个存储栈结构如红框所示:

12.AUTOSAR 存储栈分析(一)--NvM_第1张图片

 服务层为NvM,硬件抽象层为MemIf、Fee、Ea、MemAcc,驱动层为Fls、Mem等等。

需要注意的是,AUOTSAR对于这个栈的使用限制在如下三种存储介质:

  • DFlash(芯片内部eFlash模拟EEPROM以节省成本)
  • 外部Flash
  • EEPROM

当我们使用DFlash进行存储时,FlashDriver仅仅用于Flash EEPROM Emulation模块存储数据,至于更新程序代码到Flash中,则不在当前存储栈的考虑范围之内。

因此模块间调用就有如下示意:

12.AUTOSAR 存储栈分析(一)--NvM_第2张图片

 那么我们通常会在存储栈里配置哪些数据的存储?根据之前开发经验,可总结为如下几类:

  1. DEM相关数据
  2. EOL相关数据
  3. 用户自定义一些调试开关数据
  4. 汽车相关DID,例如里程、车型、ECU版本等

通常我们会拿DFlash全部做EEPROM 模拟,因此标定数据我们通常是存在PFlash。 

2.NVRAM Manager

2.1 功能描述

NvM作为存储栈对外接口与SWC或者其他BSW模块进行交互,该模块提供了如下关于memory处理的服务:

  1. Read
  2. Erase
  3. Write
  4. Validation
  5. Report Status
  6. ....

 而这些服务请求又分为同步和异步,所以在AUTOSAR关于NvM API描述时也是专门做了分类,如下:

12.AUTOSAR 存储栈分析(一)--NvM_第3张图片

可以看到,在memory请求里不管是读写擦都是对于Block进行处理,因此我们来看NvM视角下的Block具体长什么样。

2.2 Block描述

在AUTOSAR标准中,NvM Block总共分为4种类型Nv Block、RAM Block、ROM Block和Administrative Block,如下图

12.AUTOSAR 存储栈分析(一)--NvM_第4张图片

  • Nv Block是Nv Memory(EEPROM、Flash)的抽象,可以选择添加Header和CRC,存储在NvM中;
  • Ram blok是Nv Block在ram中的一个映射,属于基本存储对象,可以选择添加Header和CRC(与NvBlock对应)。它有三种选择1(NV BLCOK):1(RAM BLOCK)、1:2、1:n(Dataset,类似数组);
  • Admin Block用于保存NVRAM Block的属性、错误和状态,包含与数据集 NV 块相关联的块索引等,它分配在ram中,它本身对应用不可见,仅由NvM模块用于Ram block和nv Block本身的安全管理;
  • ROM BLOCK也是一个基本存储对象,保留在 ROM (FLASH) 中,用于在 NV 块为空或损坏的情况下提供默认数据。

 NvBlock和RAM Block可以看做是NvM和RAM的一一映射,可以理解如下示意图:

12.AUTOSAR 存储栈分析(一)--NvM_第5张图片

 从实际代码也可以看出如上结构:

12.AUTOSAR 存储栈分析(一)--NvM_第6张图片

我们在实际配置中可以根据芯片的ram大小做选择,通常情况都是关键的Block选择Redundant,Dataset用到比较少。

2.3 NvM的使用场景

 1.启动阶段

启动阶段,BswM会调用自定义NvMReadAll接口去读取关键Block的数据到RAM Block,完成初始化。当然如果对启动时间要求不高,NvMReadAll等待下层mainfunction运行完毕即可。

2.下电阶段

这个阶段,很明显就是要存储数据了,BswM调用接口NvM_WriteAll

3.运行阶段

在运行阶段,NVM通常需要提供各种服务接口给SWC或者BSW其他模块,例如DEM等。因此在做RTE设计时,NvM相关接口一般都是C/S类型,可以提供读写擦、获取错误状态等服务。如下图:

12.AUTOSAR 存储栈分析(一)--NvM_第7张图片

3.小结

本文主要讲NvM的基本概念,其实从原理上理解起来不是很难,主要是搞清楚RAM Block几种类型,难点在于真正开发的时候搞懂NvM运行机制,

例如立即存储和下电存储之间有没有区别?

NvM memory request是用什么样的机制,在代码中每一层的mainfunction如何使用?

在上电NvM_ReadAll速度太慢,影响启动时间该如何处理。

我们在后面一章节会继续讲解。

你可能感兴趣的:(AUTOSAR专项训练,AUTOSAR,NvM,Flash,Flash,模拟,EEPROM)