|  AUTOSAR中的NvM看起来挺难的,特别是在配置的时候,一堆参数,都不知道是干什么用的。想去研究它,却不知如何下手。 其实吧,AUTOSAR的官方文档讲的挺详细的,但是内容很多,网上有很多文章对其进行解读,很多人没时间也不想细读它。 本文打算换个讨论,不再累述其内容细节了,而通过图解的方式,将NvM重要特点提取出来讲解,方便理解,也方便记忆。 1. NvM在AUTOSAR中的层次结构  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。为了适用于所有的车载系统,其具有高度可扩展性和可靠性。 2. Memory抽象层空间寻址策略 
							   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。 3. NvM Basic Storage Object 
							   以上提到的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,用图示来看可能会更容易理解 4. NvM Block Management Type 
							   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 |  1.Native 
							   这种最简单,平时大多情况下,我们用的就是这种 它包含就简单的NV Block,其他如Header和CRC都是随意可选配置。 
 2.Redundant 这种就复杂一点点,可以简单理解为双备份,意思是,如有一份数据错了,可以用备份的那块。 3.Dataset Dataset呢,这个不是多备份哈,而是针对不同配置做了对应。例如一个车系统平台有很多种配置,但有想集成在同一个软件种,那么就有很多个对应的配置数据,在运行的时候根据配置参数选择哪份数据使用。 5. NVRAM Manager API 配置类 
							   讲到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通过函数本身内部的命令接口向任务发出成功信号  |    6. NvM Descriptor Table 
							   以上讲的都是一些原理或者配置上的东西,那么在软件代码上是怎么用的呢,其实用到了一个描述符表(Descriptor Table),即将所有的配置信息映射或囊括到这里面来,那么这个表是怎样的? AUTOSAR的配置策略,要将所有和NVRAM 描述符相关的内容在配置期间生成,生成的内容包含以下信息。 这个最好对着代码去看更好理解。 7. 总结 
							   以上讲得内容都不是很深入,适合刚入手的小伙伴学习,我将以上内容做成了一份备查手册,方便以后看代码或者阅读文档的时候,可以直接查看,不用费神看那么多鸡肠文英语。 
							   版权声明:本文为CSDN博主「嵌入式软件实战派」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 
							   原文链接 |