图解AUTOSAR NVM模块

AUTOSAR中的NvM看起来挺难的,特别是在配置的时候,一堆参数,都不知道是干什么用的。想去研究它,却不知如何下手。

其实吧,AUTOSAR的官方文档讲的挺详细的,但是内容很多,网上有很多文章对其进行解读,很多人没时间也不想细读它。

本文打算换个讨论,不再累述其内容细节了,而通过图解的方式,将NvM重要特点提取出来讲解,方便理解,也方便记忆。

1. NvM在AUTOSAR中的层次结构

AUTOSAR中有个Memory的处理,在架构中是这样的

图解AUTOSAR NVM模块_第1张图片

分类三层,分别是Memory Service(NvM)、Memory Hardware Abstraction(Memory If和Fee/Ea)和Memory Driver(Fls/Eep驱动),单独拎出来就是这样的

图解AUTOSAR NVM模块_第2张图片

这部分在架构中有这样的接口关系

图解AUTOSAR NVM模块_第3张图片

回到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位地址空间,像这样

图解AUTOSAR NVM模块_第4张图片

这个虚拟的逻辑地址是包含着一些信息的,如NV Block number和Dataset index,还有Block address offset等,他们的关系可以通过以下公式来理解

FEE/EA_BLOCK_NUMBER=(NvMNvBlockBaseNumber << NvMDatasetSelectionBits) + DataIndex

举个例子,假如NVM_DATASET_SELECTION_BITS配置为4bits,那么就有14bits留给blocknumber,因此可以分最大有16个dataset。

图解AUTOSAR NVM模块_第5张图片

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必选部分。

用一个图来表达就是这样的

图解AUTOSAR NVM模块_第6张图片

图上得这几个block,用图示来看可能会更容易理解

图解AUTOSAR NVM模块_第7张图片

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都是随意可选配置。

    图解AUTOSAR NVM模块_第8张图片

  2. Redundant

    这种就复杂一点点,可以简单理解为双备份,意思是,如有一份数据错了,可以用备份的那块。

    图解AUTOSAR NVM模块_第9张图片

  3. Dataset

Dataset呢,这个不是多备份哈,而是针对不同配置做了对应。例如一个车系统平台有很多种配置,但有想集成在同一个软件种,那么就有很多个对应的配置数据,在运行的时候根据配置参数选择哪份数据使用。

图解AUTOSAR NVM模块_第10张图片

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_SetBlockLockStatusType 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_SetBlockLockStatusType 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_SetBlockLockStatusType 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 描述符相关的内容在配置期间生成,生成的内容包含以下信息。

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

这个最好对着代码去看更好理解。

7. 总结

以上讲得内容都不是很深入,适合刚入手的小伙伴学习,我将以上内容做成了一份备查手册,方便以后看代码或者阅读文档的时候,可以直接查看,不用费神看那么多鸡肠文英语。

这图内容比较多,看起来不是非常清晰,如果有需要,请关注公众号“嵌入式软件实战派”,对话框回复NVM,可获得高清PDF版内容。

参考文档:

AUTOSAR_SWS_NVRAMManager.pdf

AUTOSAR_SRS_MemoryServices.pdf

关注公众号“嵌入式软件实战派”回复“AUTOSAR”可获得整套实战教程

你可能感兴趣的:(AUTOSAR,单片机)