目录
1.概述
2.NVRAM Manager
2.1 功能描述
2.2 Block描述
2.3 NvM的使用场景
3.小结
AUTOSAR 存储栈主要是用于管理EEPROM和Flash EEPROM中的非易失性数据,根据汽车运行环境保证数据能够被完整存储和保持。
整个存储栈结构如红框所示:
服务层为NvM,硬件抽象层为MemIf、Fee、Ea、MemAcc,驱动层为Fls、Mem等等。
需要注意的是,AUOTSAR对于这个栈的使用限制在如下三种存储介质:
- DFlash(芯片内部eFlash模拟EEPROM以节省成本)
- 外部Flash
- EEPROM
当我们使用DFlash进行存储时,FlashDriver仅仅用于Flash EEPROM Emulation模块存储数据,至于更新程序代码到Flash中,则不在当前存储栈的考虑范围之内。
因此模块间调用就有如下示意:
那么我们通常会在存储栈里配置哪些数据的存储?根据之前开发经验,可总结为如下几类:
- DEM相关数据
- EOL相关数据
- 用户自定义一些调试开关数据
- 汽车相关DID,例如里程、车型、ECU版本等
通常我们会拿DFlash全部做EEPROM 模拟,因此标定数据我们通常是存在PFlash。
NvM作为存储栈对外接口与SWC或者其他BSW模块进行交互,该模块提供了如下关于memory处理的服务:
- Read
- Erase
- Write
- Validation
- Report Status
- ....
而这些服务请求又分为同步和异步,所以在AUTOSAR关于NvM API描述时也是专门做了分类,如下:
可以看到,在memory请求里不管是读写擦都是对于Block进行处理,因此我们来看NvM视角下的Block具体长什么样。
在AUTOSAR标准中,NvM Block总共分为4种类型Nv Block、RAM Block、ROM Block和Administrative Block,如下图
- 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的一一映射,可以理解如下示意图:
从实际代码也可以看出如上结构:
我们在实际配置中可以根据芯片的ram大小做选择,通常情况都是关键的Block选择Redundant,Dataset用到比较少。
1.启动阶段
启动阶段,BswM会调用自定义NvMReadAll接口去读取关键Block的数据到RAM Block,完成初始化。当然如果对启动时间要求不高,NvMReadAll等待下层mainfunction运行完毕即可。
2.下电阶段
这个阶段,很明显就是要存储数据了,BswM调用接口NvM_WriteAll
3.运行阶段
在运行阶段,NVM通常需要提供各种服务接口给SWC或者BSW其他模块,例如DEM等。因此在做RTE设计时,NvM相关接口一般都是C/S类型,可以提供读写擦、获取错误状态等服务。如下图:
本文主要讲NvM的基本概念,其实从原理上理解起来不是很难,主要是搞清楚RAM Block几种类型,难点在于真正开发的时候搞懂NvM运行机制,
例如立即存储和下电存储之间有没有区别?
NvM memory request是用什么样的机制,在代码中每一层的mainfunction如何使用?
在上电NvM_ReadAll速度太慢,影响启动时间该如何处理。
我们在后面一章节会继续讲解。