天天看点

Autosar NvM 详解

一、AutoSAR Memory Stack整体概述前言

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

Autosar NvM 详解

在内存栈中包含服务层(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 详解

01、NvM数据操作block介绍

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

Autosar NvM 详解

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 详解

显式同步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 详解

在显式同步中,采用了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 详解

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

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

Autosar NvM 详解

立刻写:对于一些重要的改变的数据,根据情况在数据发生重要变化的时候需要立马存储。在调用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 详解

三、NvM配置简介

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

01、NvM的Descriptor定义

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

Autosar NvM 详解

02、NvData Interface连接

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

Autosar NvM 详解

03、Nv Component的接口属性

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

Autosar NvM 详解

04、Nv Component的Block属性

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

Autosar NvM 详解

当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定义的变量的读写操作

继续阅读