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版权协议,转载请附上原文出处链接及本声明。
原文链接
|