在AUTOSAR架构中,BSW层有一个存储器相关的模块Memory Stack,如下图所示:
图1 Memory Stack 示意
NVM:NVRAM Manager
MEMIF:Memory Abstraction Interface
FEE:Flash EEPROM Emulation
EA:EEPROM Abstraction
FLS:Flash Driver
EEP:EEPROM Driver
NVM模块可以和以下模块进行交互:
图2 可以和NVM交互的模块
NVM模块上层是RTE,下层是对接Flash Driver或者EEPROM Driver的接口,笔者对这里的理解,NVM就是属于一个连接上层APP和底层的一个接口,应用层在执行一些和存储相关的服务如写EOL数据或者更新DTC的时候,会调用NVM里面的函数,而NVM又根据不同的需求,整合了分别调用Flash和EEPROM的接口。
NVM里面的数据读写有两种同步机制,分别是Implicit synchronization(隐式同步)和Explicit synchronization(显式同步)。
1.Implicit synchronization(隐式同步)
在隐式同步中,应用层和NVM可以同时访问公用的RAM,就是应用层在读写时调用NVM里面的接口。
图3 隐式同步示意
这种情况下,一块RAM最好只映射到一个SW-C,并且在读写操作进行中,这块RAM里的数据不能改变。
写操作步骤:
(1)应用层将数据写入RAM
(2)应用层调用NvM_WriteBlock()函数,开始进入NVM执行操作
(3)应用层通过轮询方式检查NVM写操作结果,NVM执行写操作之后,应用层才可以更新RAM中的内容
2.Explicit synchronization(显式同步)
在这种情况下,NVM定义一个RAM Mirror,与应用层中的RAM进行数据交换,APP将数据写进RAM并且调用NVM的接口,NVM将数据从应用层RAM拷贝到RAM Mirror。
图4 显式同步示意
这种机制的好处就是应用层可以更有效地利用RAM。
写操作步骤:
(1)APP将数据填充进RAM
(2)应用层调用NvM_WriteBlock()函数,开始进入NVM执行操作
(3)应用层RAM中的数据拷贝进NVM RAM Mirror中以后就可以随意修改RAM的数据了
其他的一些特性:
(1)基于CRC的对比
用CRC校验来对比数据有无变化,如果无变化可以选择跳过写操作的配置选项
(2)错误恢复
在读取错误的时候可以读回默认值,在写错误时会有重试机制。
(3)写操作确认
当数据写入NV Memory后,会与RAM里的数据进行对比,如果对比不一致会重新写入。