了解本章博客之前,首先要了解一下内容
1.了解NVM的作用,
2.其次是NvRam Block的种类,
3.Autosar中NV数据的存储主要包括片内与片外存储
这些内容前面的两篇博客都有讲解链接: 【Autosar 存储栈Memery Stack 1.NVM Block的了解】
链接: 【Autosar 存储栈Memery Stack 2.EepRom与DFlash擦写的不同 】
RAM状态转换说明
1)上电最初状态:UNINITIALIZED
2)初始化后(NvM_Init):INVALID / UNCHANGED
3)NvM_ReadAll后更新:VALID/UNCHANGED,在这种状态下,WriteAll是不允许的
4)调用NvM_SetRamBlockStatus()可以设置RAM状态:
参数为true, VALID / CHANGED
参数为false,INVALID / UNCHANGED
5)出现CRC错误:INVALID
6)通过隐式或显式错误恢复机制改变,恢复之后:VALID / CHANGED,此时RAM的内容与NVRAM中的内容不同
7)成功将RAM中数据复制到NVRAM中:valid/unmodified
各状态条件
1)VALID / UNCHANGED
此状态RAM块的内容与相应的NV块的内容相同,或者app应用已访问了RAM,改变还没有体现出来。
进入此状态,最少满足下面一个条件:
NvM_ReadAll() 读block成功
NvM_ReadBlock成功完成block读操作
NvM_WriteBlock 成功完成block写操作
NvM_WriteAll() 写block成功
2)VALID / CHANGED
此状态RAM block的内容可能与相应的NV block中的内容不同。
进入此状态,最少满足下面一个条件:
调用NvM_SetRamBlockStatus 参数为true
NvM_WriteBlock is called for the block
NvM_WriteAll will also process the block
NvM_ReadBlock called for the block gives default data
NvM_RestoreBlockDefaults成功完成
NvM_ReadAll gives default data when processign the block
NvM_ValidateAll processed successfully the block
3) INVALID / UNCHANGED
此状态下NV block 数据是无效的,进入此状态,最少满足下面一个条件:
调用NvM_SetRamBlockStatus 参数为false
NvM_ReadBlock调用返回无效,或者数据错误,或者错误的staticID
NvM_WriteBlock finished non-successfully for the block
NvM_WriteAll non-successful write for the block
NvM_InvalidateNvBlock finished successfully for the block
NvM_EraseNvBlock finished successfully for the block
NvM在使用的时候需要BSW的NvM进行配置,对数据的操作中在APP可以使用两种类型的模式,可以定义一个应用层的Nv Component和内置的NvData Inteface实现,在Nv Component中会自动关联到底层的NvM中定义的Block,在APP也可以采用CS接口直接调用NvM的服务接口。对于数据的操作分为周期写、下电写、立刻写三种。
1.周期写
一般很少使用该功能,无论是EEPROM还是内部的Dflash都有一定的刷写次数的限制。在Nv Component中需要配置对应的周期触发函数;调用Rte_Write函数的时候会将数据存储的Flag设置为TRUE;周期到了触发NvM_WriteBlock操作,同时清除存储标志;在NvM_MainFunction进行后续的操作。
2.下电写
多数NVM相关的数据都是在下电的时候进行数据的存储,在BswM的Shutdown阶段调用WriteAll实现该功能
调用Rte_Write的时候会将存储Flag设置,同时设置对应的Evet Flag为TRUE,此时激活对应的函数NvM_SetRamBlockStatus设置变化位,以便执行下电的时候存储;在BswM执行下电的时候,调用NvM_WriteAll进行所有数据的下电存储。
3.立刻写
对于一些重要的改变的数据,根据情况在数据发生重要变化的时候需要立马存储。在调用Rte_Write的时候,数据会存储到NV Block中,同时会把Direct Flag设置为TRUE,此时的触发Event Flag被设置为TRUE;此时由于Event的Flag被设置了,作为一个触发源会去激活相应的Task;
在NvM的配置中主要包括BSW层NvM的Descriptor配置、APP层Nv Coponent中的Block配置相关的属性和NvData Interface配置。
01 NvM的Descriptor定义
NvM的Descriptor定义操作使用的Block Descriptor(主要定义 Block的ID、Length、CRC校验、优先级等)。
02 NvData Interface连接
在Nv Component中定义NvData Interface,在SWC中同样定义NvData Interface,将SWC的NvData Interface与Nv Component的NvData Interface做Mapping。
03 Nv Component的接口属性
Nv Component的接口属性定义主要包括下面参数。