AUTOSAR中的NvM看起来挺难的,特别是在配置的时候,一堆参数,都不知道是干什么用的。想去研究它,却不知如何下手。
其实吧,AUTOSAR的官方文档讲的挺详细的,但是内容很多,网上有很多文章对其进行解读,很多人没时间也不想细读它。
本文打算换个讨论,不再累述其内容细节了,而通过图解的方式,将NvM重要特点提取出来讲解,方便理解,也方便记忆。
AUTOSAR中有个Memory的处理,在架构中是这样的
分类三层,分别是Memory Service(NvM)、Memory Hardware Abstraction(Memory If和Fee/Ea)和Memory Driver(Fls/Eep驱动),单独拎出来就是这样的
这部分在架构中有这样的接口关系
回到Nvm,这个NVM即Non-VolatileRAM Manager (NVRAM Manager),用于管理存储于各类non-volatile memory(如EEPROM/Flash等)的数据。
NVM在AUTOSAR中是独立于硬件的,通过底层接口访问外部EEPROM或模拟成EEPROM的DataFlash。为了适用于所有的车载系统,其具有高度可扩展性和可靠性。
AUTOSAR中的Memory是怎么寻址的呢?
其实,MemoryAbstraction Interface为底层EEPROM/FEE提供32位地址空间,像这样
这个虚拟的逻辑地址是包含着一些信息的,如NV Block number和Dataset index,还有Block address offset等,他们的关系可以通过以下公式来理解
FEE/EA_BLOCK_NUMBER=(NvMNvBlockBaseNumber << NvMDatasetSelectionBits) + DataIndex
举个例子,假如NVM_DATASET_SELECTION_BITS配置为4bits,那么就有14bits留给blocknumber,因此可以分最大有16个dataset。
以上提到的Dataset、NV Block等概念,是不是容易混淆,也不清楚是干什么用的?好了,下面做个汇总和介绍。
名称 |
描述 |
Basic Storage Object |
Basic Storage Object是一个最小的NVRAM block,多个Basic Storage Objects可以组成一个NVRAM Block。 |
NVRAM Block |
NVRAM Block是管理和存储 NV Block所需的整个结构 |
NV data |
要存储在Non-Volatile memory的数据 |
Block Management Type |
这个是NVRAM Block的类型,它取决于强制/可选Basic Storage Object中 NVRAM Block的(可配置的)单独组成以及该 NVRAM 块的后续处理。 |
RAM Block |
属于Basic Storage Object,它是NVRAM Block的一部分,常驻于RAM空间。 |
ROM Block |
属于Basic Storage Object,它是NVRAM Block的一部分(可选的),常驻于ROM空间。 |
NV Block |
属于Basic Storage Object,它是NVRAM Block的一部分(必选的),常驻于NV空间。 |
NV Block Header |
如果Static Block ID是enable的,这个作为附加信息包含在NV Block中。 |
Administrative Block |
属于Basic Storage Object,它常驻于RAM,是NVRAM Block必选部分。 |
用一个图来表达就是这样的
图上得这几个block,用图示来看可能会更容易理解
NVM在AUTOSAR中的功能是挺完善的,要满足车载系统的各种需求,例如数据块错了怎么办等等,都考虑周全。
NvM支持三种类型实现:Native、Redundant和Dataset。那么这三种类型是怎样的呢?
我做了个表,他们包含了哪几种block
NV Block |
RAM Block |
ROM Block |
Administrator Block |
|
Native |
1 |
1 |
0..1 |
1 |
Redundant |
2 |
1 |
0..1 |
1 |
Dataset |
1..255 |
1 |
0..n |
1 |
Native
这种最简单,平时大多情况下,我们用的就是这种
它包含就简单的NV Block,其他如Header和CRC都是随意可选配置。
Redundant
这种就复杂一点点,可以简单理解为双备份,意思是,如有一份数据错了,可以用备份的那块。
Dataset
Dataset呢,这个不是多备份哈,而是针对不同配置做了对应。例如一个车系统平台有很多种配置,但有想集成在同一个软件种,那么就有很多个对应的配置数据,在运行的时候根据配置参数选择哪份数据使用。
讲到NvM的API,其实NvM API分三类:
Class3:所有指定的API调用都可用,最多支持功能。
Class2:有一组中间API调用可用。
Class1:特别是对于硬件资源非常有限的匹配系统,此API配置类仅提供最少的一组
Class 3 包含下面这些API:
Type 1:
- NvM_SetDataIndex(...)
- NvM_GetDataIndex(...)
- NvM_SetBlockProtection(...)
- NvM_GetErrorStatus(...)
- NvM_SetRamBlockStatus(...)
- NvM_SetBlockLockStatus
Type 2:
- NvM_ReadBlock(...)
- NvM_WriteBlock(...)
- NvM_RestoreBlockDefaults(...)
- NvM_EraseNvBlock(...)
- NvM_InvalidateNvBlock(...)
- NvM_CancelJobs(…)
- NvM_ReadPRAMBlock(...)
- NvM_WritePRAMBlock(...)
- NvM_RestorePRAMBlockDefaults(...)
Type 3:
- NvM_ReadAll(...)
- NvM_WriteAll(...)
- NvM_CancelWriteAll(...)
- NvM_ValidateAll(...)
Type 4:
- NvM_Init(...)
Class 2 包含下面这些API:
Type 1:
- NvM_SetDataIndex(...)
- NvM_GetDataIndex(...)
- NvM_GetErrorStatus(...)
- NvM_SetRamBlockStatus(...)
- NvM_SetBlockLockStatus
Type 2:
- NvM_ReadBlock(...)
- NvM_WriteBlock(...)
- NvM_RestoreBlockDefaults(...)
- NvM_CancelJobs(…)
- NvM_ReadPRAMBlock(...)
- NvM_WritePRAMBlock(...)
- NvM_RestorePRAMBlockDefaults(...)
Type 3:
- NvM_ReadAll(...)
- NvM_WriteAll(...)
- NvM_CancelWriteAll(...)
- NvM_ValidatedAll(...)
Type 4:
- NvM_Init(...)
Class 1 包含下面这些API:
Type 1:
- NvM_GetErrorStatus(...)
- NvM_SetRamBlockStatus(...)
- NvM_SetBlockLockStatus
Type 2:
- --
Type 3:
- NvM_ReadAll(...)
- NvM_WriteAll(...)
- NvM_CancelWriteAll(...)
Type 4:
- NvM_Init(...)
也许你会好奇,上面提到的Type是啥?
其实是根据功能分类而已,可以参考下表内容
Request Types |
Characteristics of Request Types |
Type 1: - NvM_SetDataIndex (...) - NvM_GetDataIndex (...) - NvM_SetBlockProtection (...) - NvM_GetErrorStatus(...) - NvM_SetRamBlockStatus(...) |
n同步请求 n作用于一个RAM Block n适用于所有SWC |
Type 2: - NvM_ReadBlock(...) - NvM_WriteBlock(...) - NvM_RestoreBlockDefaults(...) - NvM_EraseNvBlock(...) - NvM_InvalidateNvBlock(...) - NvM_CancelJobs(…) - NvM_ReadPRAMBlock(...) - NvM_WritePRAMBlock(...) - NvM_RestorePRAMBlockDefaults(...) |
n异步请求(通过callback或polling返回结果) n作用于一个NVRAM Block n通过NVRAM manager task处理 n适用于所有SWC |
Type 3: - NvM_ReadAll(...) - NvM_WriteAll(...) - NvM_CancelWriteAll(...) - NvM_ValidateAll(...) |
n异步请求(通过callback或polling返回结果 n作用于具有常驻RAM data的NVRAM Block |
Type 4: - NvM_Init(...) |
n同步请求 n基本初始化 n通过函数本身内部的命令接口向任务发出成功信号 |
以上讲的都是一些原理或者配置上的东西,那么在软件代码上是怎么用的呢,其实用到了一个描述符表(Descriptor Table),即将所有的配置信息映射或囊括到这里面来,那么这个表是怎样的?
AUTOSAR的配置策略,要将所有和NVRAM 描述符相关的内容在配置期间生成,生成的内容包含以下信息。
SWS Item |
Items |
Type |
ECUC_NvM_00476 |
NvMBlockCrcType |
EcucEnumerationParamDef |
ECUC_NvM_00554 |
NvMBlockHeaderInclude |
EcucStringParamDef |
ECUC_NvM_00477 |
NvMBlockJobPriority |
EcucIntegerParamDef |
ECUC_NvM_00062 |
NvMBlockManagementType |
EcucEnumerationParamDef |
ECUC_NvM_00557 |
NvMBlockUseAutoValidation |
EcucBooleanParamDef |
ECUC_NvM_00556 |
NvMBlockUseCRCCompMechanism |
EcucBooleanParamDef |
ECUC_NvM_00036 |
NvMBlockUseCrc |
EcucBooleanParamDef |
ECUC_NvM_00552 |
NvMBlockUseSetRamBlockStatus |
EcucBooleanParamDef |
ECUC_NvM_00519 |
NvMBlockUseSyncMechanism |
EcucBooleanParamDef |
ECUC_NvM_00033 |
NvMBlockWriteProt |
EcucBooleanParamDef |
ECUC_NvM_00551 |
NvMBswMBlockStatusInformation |
EcucBooleanParamDef |
ECUC_NvM_00119 |
NvMCalcRamBlockCrc |
EcucBooleanParamDef |
ECUC_NvM_00116 |
NvMInitBlockCallback |
EcucFunctionNameDef |
ECUC_NvM_00533 |
NvMMaxNumOfReadRetries |
EcucIntegerParamDef |
ECUC_NvM_00499 |
NvMMaxNumOfWriteRetries |
EcucIntegerParamDef |
ECUC_NvM_00478 |
NvMNvBlockBaseNumber |
EcucIntegerParamDef |
ECUC_NvM_00479 |
NvMNvBlockLength |
EcucIntegerParamDef |
ECUC_NvM_00480 |
NvMNvBlockNum |
EcucIntegerParamDef |
ECUC_NvM_00481 |
NvMNvramBlockIdentifier |
EcucIntegerParamDef |
ECUC_NvM_00035 |
NvMNvramDeviceId |
EcucIntegerParamDef |
ECUC_NvM_00482 |
NvMRamBlockDataAddress |
EcucStringParamDef |
ECUC_NvM_00521 |
NvMReadRamBlockFromNvCallback |
EcucFunctionNameDef |
ECUC_NvM_00483 |
NvMResistantToChangedSw |
EcucBooleanParamDef |
ECUC_NvM_00484 |
NvMRomBlockDataAddress |
EcucStringParamDef |
ECUC_NvM_00485 |
NvMRomBlockNum |
EcucIntegerParamDef |
ECUC_NvM_00117 |
NvMSelectBlockForReadAll |
EcucBooleanParamDef |
ECUC_NvM_00549 |
NvMSelectBlockForWriteAll |
EcucBooleanParamDef |
ECUC_NvM_00506 |
NvMSingleBlockCallback |
EcucFunctionNameDef |
ECUC_NvM_00532 |
NvMStaticBlockIDCheck |
EcucBooleanParamDef |
ECUC_NvM_00072 |
NvMWriteBlockOnce |
EcucBooleanParamDef |
ECUC_NvM_00520 |
NvMWriteRamBlockToNvCallback |
EcucFunctionNameDef |
ECUC_NvM_00534 |
NvMWriteVerification |
EcucBooleanParamDef |
ECUC_NvM_00538 |
NvMWriteVerificationDataSize |
EcucIntegerParamDef |
这个最好对着代码去看更好理解。
以上讲得内容都不是很深入,适合刚入手的小伙伴学习,我将以上内容做成了一份备查手册,方便以后看代码或者阅读文档的时候,可以直接查看,不用费神看那么多鸡肠文英语。
这图内容比较多,看起来不是非常清晰,如果有需要,请关注公众号“嵌入式软件实战派”,对话框回复NVM,可获得高清PDF版内容。
参考文档:
AUTOSAR_SWS_NVRAMManager.pdf
AUTOSAR_SRS_MemoryServices.pdf
关注公众号“嵌入式软件实战派”回复“AUTOSAR”可获得整套实战教程