Autosar NvM 详解

一、AutoSAR Memory Stack整体概述前言

在AutoSAR架构除了横向看包含APP/RTE/BSW/MCAL等分层架构之外,对于BSW(包含MCAL)对纵向的不同功能协议栈也作了详细的划分,主要包括通信栈、内存栈、CDD、IO操作相关的纵向栈、系统服务栈、信息安全相关的协议栈,今天介绍的NvM属于内存栈的管理模块,整个内存栈在AutoSAR的定义如下所示:

Autosar NvM 详解_第1张图片

在内存栈中包含服务层(NvM)、抽象层(MemIf、EA、EEP、Fee)、MCAL(Fls、SPI等)几个模块。

AutoSAR中对NV数据的存储主要包括片内存储和外部存储两种方式。片内存储,是用芯片内部的DFLASH进行数据存储;外部存储,是通过外部EEPROM进行存储,一般会调用SPI、IIC等通信方式外挂EEPROM芯片。

NVM主要提供抽象数据存储,在上电读取下电存储数据,支持Immediately存储数据,将NV data在ROM和RAM之间建立关联;MemIf实现存储数据Block在内部Flash或者外部EEP的分离操作;FEE实现对Flash的数据Block的抽象和动态数据的Layout;Flash Driver提供操作Flash的接口;EA定义外部EEPROM的存储抽象和数据的Layout;EEP提供外部EEPROM的操作接口和驱动。

二、NvM功能介绍

NvM模块负责管理和从非易失性内存中读写数据。在系统启动和关闭阶段,同步应用程序RAM区的数据。此模块还提供其他服务,例如用于上层数据保护的冗余数据单元。同时,RTE提供了简单灵活和接口(NvData Interface)用于非易失内存的数据处理。在AuoSAR架构中NvM的主要功能可以概述为以下几点:

  • 提供了三种Block的管理类型(Native、Redundant、DataSet)

  • 支持16bit和32bit的CRC校验

  • 支持数据操作的优先级机制,支持Immediately写操作

  • 给APP提供服务接口,NV Data类型的数据接口在APP层可以直接操作

  • NvM与APP的同步机制

  • 用于DCM诊断的数据操作

  • 支持操作数据读写操作的完成以及错误的回调通知

  • 可以配置的ID处理

在AutoSAR中NvM与多个模块存在关联。RTE提供与APP交互的接口;CRCLib用于NV Data存储时CRC校验;SchM用于NvM API调度;MemIf提供下层的内部还是外部存储的区分;BswM在上、下电阶段调用ReadAll和WriteAll接口;Dem负责相关DTC等诊断数据的存储;Det用于检测开发过程中相关的错误。

Autosar NvM 详解_第2张图片

01、NvM数据操作block介绍

NvM中对数据的操作一般叫做Basic storage objects,Basic storage objects是NvM中存储的最小单元,在NvM的概念中主要包括下面四种操作实体。

Autosar NvM 详解_第3张图片

NV Block一般包含了用户定义的数据,其中相关的header以及CRC作为可选项使用。NV RAM一般和NV Block对应,实现数据到NV Block的读写操作,在空间分配中可以不用考虑NV RAM的内存分配地址。NV RAM数据被分配到一个SWC或者BSW模块。

NV ROM数据存在DFlash或者外部的EEPROM中,在程序执行中数据不会改变,在空的或者破坏的ROM中为默认的数据。Administrative Block是NV RAM中必须使用的,包含了DataSet类型的NvM数据管理相关的NV RAM Block的属性、状态以及错误信息,能管理NV Block的写保护,以及上次数据操作的错误以及状态信息。

02、NvM数据操作类型介绍

NvM数据的管理主要包括三种管理类型,分别是Native NVRAM block、redundant NVRAM block、Dataset NVRAM block。具体对各个Block的使用情况如下所示。

管理类型

NV 块

RAM 块

ROM 块

管理块

NVM_BLOCK_NATIVE

1

1

0..1

1

NVM_BLOCK_REDUNDANT

2

1

0..1

1

NVM_BLOCK_DATASET

<256

1

0..n

1

Native NVRAM block是最简单的Block形式,该类型包括1个NV Block,1个RAM Block,1个Administrative Blocks;Redundant NVRAM block该类型包括2个NV Block,1个RAM Block,1个Administrative Blocks,通过该类型可以实现数据的冗余备份存储。

Dataset NVRAM是由多个大小相等的数据组成,APP在一次操作中获得其中的一个元素,每一个DataSet的位置可以通过Administrative Blocks获得,NvM可以读取选择的ROM Block。Dataset NVRAM类型的设计可以根据需要对一个数据在NvRAM中以一定的循环偏移进行存储,每一次存储位置可以不同,实现对NvRAM的寿命延长。

03、NvM数据操作同步机制介绍

在NvM对数据的操作过程中存在两种同步机制,隐式同步和显式同步。

隐式同步中APP中直接调用NVM的接口对数据进行操作,此种方式不推荐使用共享的RAM Block操作,在NVM中确保RAM Block数据的一致性(主要同步CRC机制实现)。

Autosar NvM 详解_第4张图片

显式同步NVM定义了一个RAM Mirror用于和APP进行数据交换,APP调用NvM_WriteBlock的时候写数据到RAM Block中,此时数据仍然可以被修改,因为数据还没有写到最终的Nv Block,调用NVM数据操作NvMWriteRamBlockToNvM的时候数据被Copy到内部的Mirror中,最后将数据写到Nv Block。

NVM在读的时候调用API从NvM_ReadBlock读取数据,在NvM调用了NvMReadRamBlockFromNvM后数据才真正的从RAM Mirror中Copy到了RAM Block。NvM提供了双向的控制Callback的路由,实现APP数据的传输。

Autosar NvM 详解_第5张图片

在显式同步中,采用了Mirror机制更好的防止数据一致性破坏,但是需要额外的RAM开销。

04、NvM数据操作类型介绍

NvM在使用的时候需要BSW的NvM进行配置,对数据的操作中在APP可以使用两种类型的模式,可以定义一个应用层的Nv Component和内置的NvData Inteface实现,在Nv Component中会自动关联到底层的NvM中定义的Block,在APP也可以采用CS接口直接调用NvM的服务接口。对于数据的操作分为周期写、下电写、立刻写三种。

周期写:一般很少使用该功能,无论是EEPROM还是内部的Dflash都有一定的刷写次数的限制。在Nv Component中需要配置对应的周期触发函数;调用Rte_Write函数的时候会将数据存储的Flag设置为TRUE;周期到了触发NvM_WriteBlock操作,同时清除存储标志;在NvM_MainFunction进行后续的操作。

Autosar NvM 详解_第6张图片

下电写:多数NVM相关的数据都是在下电的时候进行数据的存储,在BswM的Shutdown阶段调用WriteAll实现该功能。

在Nv Component中需要配置对应的ShutDown存储方式;调用NvM_SetRamBlockStatus通知Rte表示数据发生了变化在下电的时候要存储;调用Rte_Write的时候会将存储Flag设置,同时设置对应的Evet Flag为TRUE,此时激活对应的函数NvM_SetRamBlockStatus设置变化位,以便执行下电的时候存储;在BswM执行下电的时候,调用NvM_WriteAll进行所有数据的下电存储。

Autosar NvM 详解_第7张图片

立刻写:对于一些重要的改变的数据,根据情况在数据发生重要变化的时候需要立马存储。在调用Rte_Write的时候,数据会存储到NV Block中,同时会把Direct Flag设置为TRUE,此时的触发Event  Flag被设置为TRUE;此时由于Event的Flag被设置了,作为一个触发源会去激活相应的Task;

在Task中调用Nvm_WriteBlock的函数,将数据存储,此时会清除Direct Flag和Event Flag;NvM_WriteBlock的传递参数为NULL,一般需要一个永久的RAM(Global的变量.Mirror);在NvM的MainFunction查看Mirror的状态;NvMWriteRamBlockToNvM调用将数据放到NvM中,调用EA或者FEE的接口函数,存储到EEPROM或者FLASH中。

Autosar NvM 详解_第8张图片

三、NvM配置简介

在NvM的配置中主要包括BSW层NvM的Descriptor配置、APP层Nv Coponent中的Block配置相关的属性和NvData Interface配置。

01、NvM的Descriptor定义

NvM的Descriptor定义操作使用的Block Descriptor(主要定义 Block的ID、Length、CRC校验、优先级等)。

Autosar NvM 详解_第9张图片

02、NvData Interface连接

在Nv Component中定义NvData Interface,在SWC中同样定义NvData Interface,将SWC的NvData Interface与Nv Component的NvData Interface做Mapping。

Autosar NvM 详解_第10张图片

03、Nv Component的接口属性

Nv Component的接口属性定义主要包括下面参数。

Autosar NvM 详解_第11张图片

04、Nv Component的Block属性

在使用Nv Component的定义的时候,除了定义BSW层的NvM Block相关的配置,在Nv Component中也要根据NvData Interface以及BSW定义的NvM的Block做相关的配置,主要包括下面参数:

Autosar NvM 详解_第12张图片

当NVM触发NvRAM读写数据,都是通过Rte_GetMirror/Rte_SetMirror 更新RAM  Block,这些功能在RTE内实现,选择Support DirctFlag(FALSE:Rte不支持直接触发写操作,需要SWC额外的CS接口实现;True)调用写操作的时候,直接触发操作写的Flag)。

具体的配置Workflow大概如下:

  • 在ASW中创建一个NvMemoryBlock类型的ASW,并创建对应的SWC

  • 在SWC中建立对应的Nv Block的Descriptor(与服务层的Nv Block的内容一致),并创建对应的数据结构体

  • 配置对应的RAM Block、ROM Block以及相关的操作属性(操作类型、触发函数、同步方式等)

  • 创建Nv Data Interface并建立与RAM Block的Mapping

  • 配置周期触发的函数用于触发周期的存储操作

  • 在NvM服务层Check对应的ASW的Block配置

  • 生成Rte产生周期调用的函数以及SetMirror and GetMirror(主要是对NvBuffer的数据到RAM Block操作的Copy操作) callback 来读写Rte中的RamMirror,在操作过程中一般采用加锁操作避免数据操作过程中被修改。

  • 在SWC调用Nv Data Interface的时候实现了数据从RAM Block到SWC定义的变量的读写操作

你可能感兴趣的:(AutoSar,Module,Introduction,Autosar,NvM)