精华内容
下载资源
问答
  • Autosar NVM

    2020-07-15 14:40:47
    而今天所说的Autosar NVM模块为ECU内所有NV(Non Volatile) data 进行管理与维护,并提供服务确保这些数据被正确的存储或备份。在Autsar NVM支持两种NV变量存储方式: EEPROM(EA : EEPROM Abstraction) 优点:读写...

    汽车ECU内存中存在着各式各样的变量,绝大多数变量随着ECU的掉电数据就丢失了。也有一部分十分重要的变量会伴随着整个ECU生命周期而一直存在。比如:车辆的VIN码,防盗钥匙,车辆下线配置字等等。而今天所说的Autosar NVM模块为ECU内所有NV(Non Volatile) data 进行管理与维护,并提供服务确保这些数据被正确的存储或备份。在Autsar NVM支持两种NV变量存储方式:
    EEPROM(EA : EEPROM Abstraction)
    优点:读写速度快,寿命长
    缺点:价格较高
    FLASH EEPROM模拟(FEE : Flash EEPROM Emulation)
    优点:价格便宜
    缺点:访问速度慢,擦写限制,寿命较短

    Autosar NVM

    在这里插入图片描述
    Autosar NVM位于基础软件的服务层,并为为所有NV data的(初始化、读、写、控制)维护以及管理作提供了各种同步/异步服务。无论是EEPROM还是Flash模拟,都在这层被抽象为同一类型,直到MemIf层才会做出区分。
    在这里插入图片描述

    NVRAM Block

    在Autosar中规定了四种 NVRAM Block,分别为 NV Block、RAM Block、ROM Block、Administrative Block。
    在这里插入图片描述

    NV block

    NV block是存储NV变量的基本结构,其中Header以及CRC校验非必须项。
    [SWS_NvM_00125] ⌈The NV block is a basic storage object and represents a memory area consisting of NV user data and (optionally) a CRC value and(optionally) a NV block header.
    在这里插入图片描述

    Ram block

    由于NV变量的写入与读取都是一件相对较慢的操作,而应用层逻辑操作周期速度又太快。直接操作NV block显然不合适,所以在进行读写之前,我们会建议一个同样大小的Ram空间来操作、使用、存放这些还没有被写入或者读取的NV值。

    在NVM中规定了permanent,temporary 两种类型。其中永久型在项目配置时就必须输入指定的RAM地址;而临时型不需要在项目配置期间就设定

    [SWS_NvM_00373] ⌈The RAM block data shall contain the permanently ortemporarily assigned user data. ⌋ ( )

    [SWS_NvM_00370] ⌈In case of permanently assigned user data, the address of the RAM block data is known during configuration time. ⌋ ( )

    在这里插入图片描述

    Rom block

    ROM block 用于存储默认值,以便当NV block数据出现损坏时予以替换。
    [SWS_NvM_00020] ⌈The ROM block is a basic storage object, resides in the ROM (FLASH) and is used to provide default data in case of an empty or damaged NV block.

    在这里插入图片描述

    Administrative block

    Administrative block是专门用于对NVRAM Block 与 RAM blcok 的数据安全性进行管理而设计的,它对应用层并不可见。
    [SWS_NvM_00135] ⌈The Administrative block shall be invisible for the application and is used exclusively by the NvM module for security and administrative purposes of the RAM block and the NVRAM block itself. ⌋ ( )

    [SWS_NvM_00054] ⌈The NvM module shall use an attribute field to manage the NV block write protection in order to protect/unprotect a NV block data field. ⌋ ( )

    异步调用

    由于NV data区域的访问速度较慢,所以NVM所支持的API多以异步调用为主。其核心函数为周期执行的NvM_MainFunction()。下图主要阐述了在异步调用中使用 Polling 和 Callback 两种方式来执行NvM_WriteBlock()操作。

    在这里插入图片描述
    在NVM User 请求写入NvM_WriteBlock时,会将这个任务写入存储在队列里,并由后台NvM_MainFunction() 执行。Nvm user需要用polling 方式主动查询写入结果。如果返回NVM_REQ_PENDING,表示还没有执行完成,回复NVM_REQ_OK 表示执行成功。
    在这里插入图片描述
    在call back模式下,如果执行成功,NvM_MainFunction() 会主动调用call back 函数来提醒 NVM user 来查询结果。

    展开全文
  • Autosar NVM调试几点心得

    千次阅读 2019-06-22 23:22:24
    Autosar NVM(non-volatile memory)在汽车电子电控软件中经常会用到的,但是非常不容懂。由于手头上一个项目在读写DID以及在Application中需要存储一些重要数据到DataFlash中,调试时经常碰到些奇怪的问题,但是BSW的...

    Autosar NVM(non-volatile memory)在汽车电子电控软件中经常会用到的,但是非常不容懂。由于手头上一个项目在读写DID以及在Application中需要存储一些重要数据到DataFlash中,调试时经常碰到些奇怪的问题,但是BSW的配置是由德国同事做的,因此碰到问题很难调试。把碰到问题总结的几点心得列出来:

    1、ECU 模式分为Fixed和Flexed,Autosar4.0以前版本用Fixed的较多,Flexed在4.0版本之后用得多。

    2、ReadAll函数在System Startup启动时调用,作用是把所有的Block中的数据从NV Block中拷贝到Ram中。

    3、WriteAll函数在ECU state manage里System Shutdown的时候被调用,作用是把要写到Block中的数据从Ram中拷贝到NV Block        中。

    4、在NVM Queue Job执行出错时,应该读取NVM 中的默认值。

    5、当完成某一个Block ID的写操作后,将NV Block中的数据拷贝到Ram Block中,但是在应用程序重修改了Ram Block的值,如果        调用NvM_SetRamBlockStatus函数设置这个Block ID为TRUE,并且在NVM_cfg.c中设置了参数               NVM_SELECT_BLOCK_FOR_WRITEALL_ON,那么ECU在进入sleep(ECU ShutDown)期间会调用WriteAll函数,把完成前述     设置的block全部写到NVM中。

    6、当Ram Block中的数据写到NV Block中后,要有回读验证的过程,即把NVM中的数据与Ram block中的original数据进行比较

    7、调用NvM_RestoreBlockDefaults函数可以把相应的Block的内容设置为默认值。

     

    展开全文
  • The original nvm is a completely separate project for Mac/Linux only. This project uses an entirely different philosophy and is not just a clone of nvm. Details are listed in the Why another version ...
  • Application access NvM scenario Create PIM in SWC create NvM Block Needs Create sever Runnable Davici config
    1. Application access NvM scenario

    2.  Create PIM in SWC

     

    • create NvM Block Needs

     Create sever Runnable

    •  Davici config 

     

    展开全文
  • AUTOSAR-NvM模块

    千次阅读 2020-08-28 17:04:08
    AUTOSAR_SWS_NVRAMManager0 前言1 介绍及功能概述2 首字母缩写词和缩写词7 功能说明7.1 基本架构指南7.1.2 内存硬件抽象的寻址方案[SWS_NvM_00051][SWS_NvM_00122][SWS_NvM_00343][SWS_NvM_00123][SWS_NvM_00442]...

    AUTOSAR-NvM模块

    0 前言

    >>返回AUTOSAR系列文章目录<<
    NvM模块全称Non-volatile Memory Management Module,属于ECU抽象层服务层,NvM模块独立于硬件

    在AUTOSAR中,Flash和EEPROM统称为非易失性内存(NV,Non-volatile Memory)

    NvM模块是应用层SWC访问非易失性内存的唯一方式

    1 NvM模块的设计原理

    1.1 NV块

    NvM模块的核心工作是读写Flash或者EEPROM里面的数据。从Fee模块可知,Flash或者EEPROM里面的数据是以逻辑块(Logical Block)的形式管理的,无论是Flash的逻辑块还是EEPROM的逻辑块,在NvM模块中统称NV块(NV Block)

    NV CRC

    NV块可以设置Checksum,可以是CRC16或CRC32。配置选项CRC Usage决定是否启用CRC

    写保护

    NvM_SetBlockProtection用于锁定和解锁NV块。写保护由NvM_ReadAll初始化

    NV块也可以开启Written Once,开启Written Once后的NV块写保护不能通过NvM_SetBlockProtection解除

    1.2 RAM块

    CPU不能使用NV中的数据(速度太慢),所以必须将NV块中的数据读到RAM中供CPU使用。RAM块是NV块在RAM中的映射数据

    • Read Job是用NV数据覆盖RAM数据
    • Write Job是用RAM数据覆盖NV数据

    RAM CRC

    如果配置了Calc RAM CRC,会启用RAM块的CRC位。在每次调用NvM_SetRamBlockStatus时会重新计算RAM CRC,目的是防止reset数据错误 (比如short power-loss, watchdog-reset时)

    Permanent 和Non-permanent RAM块

    一个NV块如果被多个SWC使用,每个SWC都会有自己的映射RAM块,也就是说NV块和RAM块不是一对一关系,可以一对多

    • 固定块(Permanent RAM块)

    如果一个NV块只能由一个SWC访问,只映射一个RAM块,就是Permanent RAM块。Permanent RAM块的地址是固定的,并存储在NvM的配置中

    • 非固定块(Non-permanent RAM块)

    Non-permanent RAM:如果一个NV块被多个SWC使用,每个SWC都有自己的映射RAM块,就是Non-permanent RAM块。在这种情况下,Non-permanent RAM块地址不被存储,只能用指针访问

    同步机制

    RAM块不能被SWC修改的同时写入NV块,RAM块在写入NV块时需要提供保护机制,保护机制可以分为两种:

    • 隐式同步(Implicit Synchronization):当RAM块值正在写入NV块时,RAM块变为只读
    • 显示同步(Explicit Synchronization):NvM会定义一个RAM Mirror,当RAM块值正在写入NV块时,RAM块值也会复制到RAM Mirror,SWC可以修改RAM Mirror中的值,等到写入操作完成后,RAM Mirror覆盖RAM块

    如果配置了显式同步机制,则必须同时配置NvMWriteRamBlockToNvMNvMReadRamBlockFromNvM

    显式同步可以为每个NVRAM块单独配置。如果配置了显式同步,NvM使用内部缓冲区作为NvM和应用程序之间的RAM镜像。它和Crc计算用的是同一个内部缓冲区。内部缓冲区的大小是已配置的最大块的大小加上已配置的Crc字节。

    RAM状态

    • 初始化(上电)之前,RAM block的状态为 UNINITIALIZED
    • 上电后,RAM的状态为 INVALID/UNCHANGED
    • 在 ReadAll 执行完毕后,RAM状态会变为 VALID/UNCHANGED(此状态不允许执行WriteAll)
    • 如果调用NvM_SetRamBlockStatus,则可以离开此状态
    • 如果发生CRC错误,则RAM的状态会再次变为INVALID,通过隐式或显式的错误恢复机制可以离开INVALID状态
    • 在错误恢复之后,RAM会处于VALID / CHANGED状态,因为此时RAM的内容与NV块中的内容不同了

    1.3 ROM块

    如果NV块里的数据报错,或者程序想改回出厂状态,这时候就需要保存一批默认值(Default),必要时用默认值覆盖RAM块数据,默认数据称为ROM块

    ROM块应该存储在PFlash里,只读,不能修改

    恢复机制

    有2种方式可以使用ROM块覆盖RAM块:

    • 显式读取(Read Explicit)

    可以通过NvM_RestoreBlockDefaults使用ROM块覆盖RAM块

    • 隐式读取(Read Implicit)

    Read Job过程中,发现NV块CRC校验错误时,自动使用ROM块覆盖RAM块

    1.4 NVRAM块

    具有映射关系的NV块、RAM块和ROM块被打包成NVRAM块(NVRAM Block)

    NvM模块,每一个NVRAM块都会被分配一个 Block ID,Block ID从0开始,连续且唯一

    根据NVRAM块包含的NV块、RAM块、ROM块数量不同,可分为3种类型:

    1. Native NVRAM块

    • Native NVRAM块应该由1个NV块和1个RAM块构成,ROM块可选

    2. Redundant NVRAM块

    • Redundant NVRAM块应由2个NV块和1个RAM块构成,ROM块可选
    • 2个NV块互为备份,如果一个 NV块无效,则会使用另一个有效的NV块中的数据来恢复此无效块

    3. Dataset NVRAM块

    • Dataset NVRAM块应该由>1个NV块,1个RAM块和>=0个ROM块构成。其中的 (NV + ROM)块 总数必须在1…255的范围内

    1.5 硬件抽象层的寻址方案

    Fee模块中介绍了Fee模块向上层提供32位虚拟地址空间(Virtual Linear Address Space),其中

    • 前16位为Block Number
    • 后16位为Block Offset,即数据在Block中的偏移地址

    NvM模块定义了NVRAM块的Block ID,Block ID和Block Number之间存在对应关系

    将32位虚拟地址空间的前16位再细分,设定一个参数SelectionBits

    • 虚拟地址空间的前16位中的前16-SelectionBits位表示NVRAM块的Block ID
    • 虚拟地址空间的前16位中的后SelectionBits位表示Data Index,即NV块在NVRAM块里所有NV块中的顺序,从0开始,连续且唯一

    SelectionBits取值范围[0, 8],需要确保:

    • 当项目中只存在Native NVRAM块时,显然,所有NV块的Data Index都为0,SelectionBits可以取[0, 8]
    • 当项目中只存在Native NVRAM块和Redundant NVRAM块时,所有Native NVRAM块里的NV块的Data Index都为0,所有Redundant NVRAM块里的NV块的Data Index分别为0和1,SelectionBits可以取[1, 8]
    • 当项目中存在Dataset NVRAM块时,显然,必须保证SelectionBits取值使得2^SelectionBits-1大于Dataset NVRAM块包含的最大NV块数量,确保Dataset NVRAM块中每个NV块都能分到一个Data Index。同样,所有Native NVRAM块里的NV块的Data Index都为0,所有Redundant NVRAM块里的NV块的Data Index分别为0和1,所有Dataset NVRAM块中NV块的Data Index为别为0、1、2 …等等

    有两个Block是预留的:

    • Block ID=0 的NVRAM块用于记录多块请求的结果,专供NvM_GetErrorStatus调用

    • Block ID=1 的NVRAM块是NvMConfigBlock

    1.6 优先级方案

    异步请求不是立即处理的,而是由NvM_MainFunction排队处理的,NVM模块支持基于优先级的任务处理,由Job Prioritization配置确认

    开启Job Prioritization,则NVM在处理异步请求时会有两个Job Queue

    • Immediate Job Queue (Prioritization = 0):只用于Immediate Write Job
    • Standard Job Queue (Prioritization =1~255,数字越大,优先级越低):用于所有其他Job(包括Immediate Read/Erase Job)

    关闭Job Prioritization,则不支持Immediate Job Queue,只有Standard Job Queue

    优先级顺序:

    • 正在处理NvM_ReadAll/NvM_WriteAll Job时,遇到Immediate Write Job请求将立即执行Immediate Write Job,然后继续执行NvM_ReadAll/NvM_WriteAll Job
    • 正在处理NvM_ReadAll/NvM_WriteAll Job时,遇到其他Write/Read Job请求,加入到队列中等待,待 NvM_WriteAll/NvM_ReadAll执行完成后再行处理
    • NvM_WriteAll可以通过调用NvM_CancelWriteAll 来取消。调用NvM_CancelWriteAll 后,当前正在处理的块会一直执行直到完成,但是不再执行后续的block write 操作
    • 不可能将同一个块多次排队。如果BlockId 5的一个读作业进入队列,那么该Block的一个擦除作业在读作业完成之前就不能进入队列
    • 优先级取决于块,而不是请求。多块请求的优先级值总是大于255,即其优先级小于最低的块特定优先级;它们将在所有单个块请求完成后被处理

    1.7 API配置class

    为了使NvM模块能够适应有限的硬件资源,需要定义三个不同的API配置类:

    • API配置class 1:特别是对于硬件资源非常有限的匹配系统,这个API配置类只提供了在任何情况下都需要的最小API调用集,不支持Dataset NVRAM块,不支持Immediate队列
    • API配置class 2:可用API调用的中间集
    • API配置class 3:所有指定的API调用都可用。支持最大的功能
    class 1 class 2 额外 class 3 额外
    NvM_GetErrorStatus
    NvM_SetRamBlockStatus
    NvM_ReadAll
    NvM_WriteAll
    NvM_CancelWriteAll
    NvM_Init
    NvM_SetBlockLockStatus
    NvM_SetDataIndex
    NvM_GetDataIndex
    NvM_ReadBlock
    NvM_WriteBlock
    NvM_RestoreBlockDefaults
    NvM_CancelJobs
    NvM_SetBlockProtection
    NvM_EraseNvBlock
    NvM_InvalidateNvBlock

    2 NvM模块的C语言实现

    2.1 C文件架构

    静态文件 描述
    NvM.h 包含API所需的状态枚举常量、类定义
    NvM.c API代码
    NvM.h Callback Function声明
    动态文件 描述
    StartApplication_NvM_ecuc.arxml Configurator生成的本地配置文件
    NvM_Bswmd.arxml
    NvM_Cfg.h 包含项目所需的常量宏定义、开关宏定义
    NvM_Cbk.h 包含回调函数声明
    NvM_PBcfg.h

    2.2 使用到的类定义和状态枚举

    NvM定义的类 描述 定义来源
    NvM_RequestResultType NVRAM块在异步请求完成后返回执行结果
    1.NVM_REQ_OK
    最后一个异步请求已成功完成。这是重置后的默认值
    2.NVM_REQ_NOT_OK
    最后一个异步请求失败
    3.NVM_REQ_PENDING
    一个异步请求正在等待执行
    4.NVM_REQ_INTEGRITY_FAILED
    数据完整性验证失败或CRC不匹配,
    NvM_ReadBlock和NvM_ReadAll可能返回这个结果
    5.NVM_REQ_BLOCK_SKIPPED
    该块被多块请求跳过
    NvM_ReadAll和NvM_WriteAll可能返回这个结果
    6.NVM_REQ_NV_INVALIDATED
    NV块被标记为invalid,
    NvM_ReadBlock和NvM_ReadAll可能返回这个结果
    7.NVM_REQ_CANCELED
    请求已取消,
    NvM_CancelWriteAll可能返回这个结果
    Std定义的类 描述 定义来源
    Std_ReturnType 描述Job Request结果
    1.E_OK
    对同步指令,表示指令执行成功
    对异步指令,表示指令被队列接受
    2.E_NOT_OK
    对同步指令,表示指令执行失败
    对异步指令,表示指令被队列拒绝
    Std_Type.h

    2.3 块描述表

    const NvM_BlockDescriptorType NvM_BlockDescriptorTable_at[NVRAM_TOTAL_NUMBER]
    {
      {
      
      }
      ...
    }
    

    2.4 NvM模块提供的API class 1

    NvM_Init

    void NvM_Init(void)
    • BswM模块调用NvM_Init完成对NvM模块的初始化
    • NvM_Init只用于初始化队列,无配置参数

    NvM_MainFunction

    void NvM_MainFunction(void)
    • NvM_MainFunctionDefault_BSW_Async_Task_Core0中以10ms周期被调用,负责执行异步Job

    NvM_ReadAll

    void NvM_ReadAll(void)
    • NvM_ReadAll只在ECU Startup的时候被EcuM模块调用一次,是NvM模块初始化的一部分
    • 对所有开启了Select Block For ReadAll的NVRAM块下达Read Job,但是会跳过所有Non-permanent块和Dataset NVRAM块
    • 异步指令,在NvM_MainFunction中执行
    • 如果开启了RAM CRC,则会在每个NVRAM块Read Job前,通过RAM块CRC,检查RAM块数据和NV块数据一致性,如果一致,则不进行读取
    • 如果启用Dynamic Configuration HandlingNvM_ReadAll首先读取NvMConfigBlock(Block ID = 1),将NvMConfigBlock读取结果与编译的configuration ID进行比较,如果比较失败,则触发ROM的隐式同步
    • NvM_ReadAll全部完成时,可触发回调函数

    NvM_WriteAll

    void NvM_WriteAll(void)
    • NvM_WriteAll只在ECU Shutdown的时候被EcuM模块调用一次
    • 对所有开启了Select Block For WriteAll的NVRAM块下达Write Job,但是会跳过所有Non-permanent块和Dataset NVRAM块
    • 异步指令,在NvM_MainFunction中执行
    • NvMConfigBlock(Block ID = 1)是最后一个被Write的块
    • NvM_WriteAll全部完成时,可触发回调函数

    NvM_CancelWriteAll

    void NvM_CancelWriteAll(void)
    • 请求取消NvM_WriteAll
    • 异步指令,在NvM_MainFunction中执行,不是立即生效

    NvM_GetErrorStatus

    Std_ReturnType NvM_GetErrorStatus
    (
    uint16 BlockId,
    NvM_RequestResultType* RequestResultPtr
    )
    • BlockId>0时,读取单块Status Information,每个异步指令都会留下单块Status Information
    • BlockId=0时,读取多块Status Information,只有NvM_ReadAllNvM_WriteAll会留下多块Status Information
    • 同步指令

    NvM_SetRamBlockStatus

    Std_ReturnType NvM_SetRamBlockStatus
    (
    uint16 BlockId,
    boolean BlockChanged
    )
    • NvM_SetRamBlockStatus将NVRAM块状态从valid/changed改为unchanged
    • NvM_WriteAll执行过的NVRAM块处于valid/changed

    NvM_SetBlockLockStatus

    void NvM_SetBlockLockStatus
    (
    uint16 BlockId,
    boolean Locked
    )
    • 提供给DCM模块的Action

    2.5 NvM模块提供的API class 2

    NvM_ReadBlock

    Std_ReturnType NvM_ReadBlock
    (
    uint16 BlockId,
    uint8* NvM_DstPtr
    )
    • 如果是Non-permanent RAM块,则NvM_DstPtr是RAM块地址
    • 如果是Permanent RAM块,则NvM_DstPtrNULL_PTR
    • 异步指令,在NvM_MainFunction中执行
    • NvM_ReadBlock全部完成时,可触发回调函数

    NvM_WriteBlock

    Std_ReturnType NvM_WriteBlock
    (
    uint16 BlockId,
    uint8* NvM_SrcPtr
    )
    • 如果是Non-permanent RAM块,则NvM_DstPtr是RAM块地址
    • 如果是Permanent RAM块,则NvM_DstPtrNULL_PTR
    • 如果开启RAM CRC,则必须先计算RAM CRC,然后连同CRC一起写入NV块
    • 如果写入NV块失败,可以重复写入,写入次数可配置
    • 异步指令,在NvM_MainFunction中执行
    • NvM_WriteBlock全部完成时,可触发回调函数

    NvM_RestoreBlockDefaults

    Std_ReturnType NvM_RestoreBlockDefaults
    (
    uint16 BlockId,
    uint8* NvM_DstPtr
    )
    • 将ROM块中的默认值写入RAM块
    • 如果是Non-permanent RAM块,则NvM_DstPtr是RAM块地址
    • 如果是Permanent RAM块,则NvM_DstPtrNULL_PTR
    • 异步指令,在NvM_MainFunction中执行
    • NvM_RestoreBlockDefaults全部完成时,可触发回调函数

    NvM_CancelJobs

    Std_ReturnType NvM_CancelJobs(uint16 BlockId)
    • 取消异步指令
    • 异步指令,在NvM_MainFunction中执行

    2.6 NvM模块提供的API class 3

    NvM_SetBlockProtection

    Std_ReturnType NvM_SetBlockProtection
    (
    uint16 BlockId,
    boolean ProtectionEnabled
    )
    • 开启/关闭NV块的写保护,写保护的NV块不得Write、Erase、Invalidate
    • 同步指令

    NvM_EraseNvBlock

    Std_ReturnType NvM_EraseNvBlock(uint16 BlockId)
    • Erase指定NVRAM块中的NV块
    • 异步指令,在NvM_MainFunction中执行

    NvM_InvalidateNvBlock

    Std_ReturnType NvM_InvalidateNvBlock(uint16 BlockId)
    • Invalidate指定NVRAM块中的NV块
    • 异步指令,在NvM_MainFunction中执行

    2.7 NvM模块提供的Callback

    NvM_JobEndNotification

    void NvM_JobEndNotification (void)
    NvMFeeFlsFee_JobEndNotificationFls_17_Dmu_GetNotifCallerFls_17_Dmu_GetNotifCallerNvM_JobEndNotificationNvM_JobEndNotificationFee_JobEndNotificationNvMFeeFls
    • Fee模块接收到Fls模块发送的Fee_JobEndNotification后,向NvM模块返回此回调函数
    • NvM_JobEndNotification会在当前NVRAM块信息中写入NVM_REQ_OK

    NvM_JobErrorNotification

    void NvM_JobErrorNotification (void)
    NvMFeeFlsFee_JobErrorNotificationFls_17_Dmu_GetNotifCallerFls_17_Dmu_GetNotifCallerNvM_JobErrorNotificationNvM_JobErrorNotificationFee_JobErrorNotificationNvMFeeFls
    • Fee模块接收到Fls模块发送的Fee_JobErrorNotification后,向NvM模块返回此回调函数
    • NvM_JobErrorNotification会在当前NVRAM块信息中写入NVM_REQ_NOT_OKNVM_REQ_NV_INVALIDATENVM_REQ_INTEGRITY_FAILED

    2.8 NvM模块使用的外部API

    Det_ReportError

    Std_ReturnType Det_ReportError
    (
    uint16 ModuleId,
    uint8 InstanceId,
    uint8 ApiId,
    uint8 ErrorId
    )
    • 来自Det模块的API,检测并报告开发错误,由Dev Error Detect启用
    • ModuleId==NVM_MODULE_ID20
    • InstanceId=0
    • ErrorId有7个

    3 NvM模块的DaVinci Configurator配制

    3.1 NvM\NvMCommon

    部分主要对应NvM_Cfg.h文件中的常量宏定义开关宏定义


    API Config Class

    配制 Configurator选项 API Config Class-> enum:
    NVM_API_CONFIG_CLASS_1
    NVM_API_CONFIG_CLASS_2
    NVM_API_CONFIG_CLASS_3
    影响 NvM_Cfg.h #define NVM_API_CONFIG_CLASS
    • 选择API class

    Call Cycle of NvM_MainFunction [ms]

    配制 Configurator选项 Call Cycle of NvM_MainFunction [ms] -> [1, 1000]
    • NvM_MainFunction的任务周期

    Compiled Configuration Id

    配制 Configurator选项 Compiled Configuration Id -> [0, 65535]
    影响 NvM_Cfg.h #define NVM_COMPILED_CONFIG_ID
    • 定义Config Block 的ID,默认1,不要改

    CRC Num of Bytes

    配制 Configurator选项 CRC Num of Bytes -> [1, 65535]
    • 在一个NvM_MainFunction周期内应计算CRC的最大字节数
    • 一般64

    Csm Retry Counter

    配制 Configurator选项 Csm Retry Counter -> [0, 255]
    • Csm功能暂时不用

    Dataset Selection Bits

    配制 Configurator选项 Dataset Selection Bits -> [0, 8]
    影响 NvM_Cfg.h #define NVM_DATASET_SELECTION_BITS
    • 宏定义常量,【1.6 硬件抽象层的寻址方案】有说明

    Development Error Detection

    配制 Configurator选项 Development Error Detection -> True/False
    影响 NvM_Cfg.h #define NVM_DEV_ERROR_DETECT
    • 宏定义开关,是否启用Det模块检测开发错误
    • 如果启用Dev Error Detect,则添加#include Det.h并启用APIDet_ReportError
    • 选择False

    Driver Mode Switch

    配制 Configurator选项 Driver Mode Switch -> True/False
    影响 NvM_Cfg.h #define NVM_DEV_ERROR_DETECT
    • 宏定义开关,在NvM_ReadAllNvM_WriteAll时使用Fls模块的Fast Mode,其他时候使用Fls模块的Slow Mode
    • 选择True

    Dynamic Config Handling

    配制 Configurator选项 Dynamic Config Handling -> True/False
    影响 NvM_Cfg.h #define NVM_DYNAMIC_CONFIGURATION
    • 宏定义开关,在NvM_ReadAll是否开启比较
    • 选择False

    Job Prioritization

    配制 Configurator选项 Job Prioritization -> True/False
    影响 NvM_Cfg.h #define NVM_JOB_PRIORISATION
    • 宏定义开关,是否启用优先级
    • 选择False

    Maximum Num of Write Retries

    配制 Configurator选项 Maximum Num of Write Retries -> [0, 7]
    • NvM_WriteBlockNvM_WriteAll失败时的最大重试次数

    Multi Block Callback

    配制 Configurator选项 Multi Block Callback -> 不填
    • 填入Multi Block Callback 函数名,不填则为NULL_PTR
    • 不填

    Multiblock Job Status Info

    配制 Configurator选项 Multiblock Job Status Info -> True/False
    • 开启时,每次多块指令的开始、结束、取消都会调用BswM_NvM_CurrentJobModeBswM模块报告信息

    Polling Mode

    配制 Configurator选项 Polling Mode -> True/False
    影响 NvM_Cfg.h #define NVM_POLLING_MODE
    • 宏定义开关,开启则使用Polling Mode,关闭则使用Callback Mode
    • 选择False

    Repair Redundant Block API

    配制 Configurator选项 Repair Redundant Block API -> True/False
    影响 NvM_Cfg.h #define NVM_REPAIR_REDUNDANT_BLOCKS_API
    • 宏定义开关,是否开启APINvM_RepairRedundantBlocks
    • 选择False

    Repeat Mirror Operations

    配制 Configurator选项 Repeat Mirror Operations -> 不填
    • 功能没做

    Safe BSW Check

    配制 Configurator选项 Safe BSW Check -> True/False
    • 带有功能安全要求的项目需要开启,非AUTOSAR标准内容
    • 选择False

    SetRamBlockStatus API

    配制 Configurator选项 SetRamBlockStatus API -> True/False
    影响 NvM_Cfg.h #define NVM_SET_RAM_BLOCK_STATUS_API
    • 宏定义开关,是否启用API NvM_SetRamBlockStatus
    • 选择True

    Size Of Immediate Job Queue

    配制 Configurator选项 Size Of Immediate Job Queue -> [1, 255]
    • 宏定义常量,Immediate Queue长度
    • Job Prioritization未启用时无意义

    Size Of Standard Job Queue

    配制 Configurator选项 Size Of Standard Job Queue -> [1, 255]
    • 宏定义常量, Standard Queue长度

    Use Block Id Check for Blocks with Crc

    配制 Configurator选项 Use Block Id Check for Blocks with Crc -> True/False
    • 宏定义开关,是否将ID和Index也加入CRC计算
      • 选择False

    Version Information API

    配制 Configurator选项 Version Information API -> True/False
    • 宏定义开关,是否启用API NvM_GetVersionInfo
    • 选择False

    3.2 NvM\NvMCommonVendorParams

    CRC Internal Buffer

    配制 Configurator选项 CRC Internal Buffer -> True/False
    影响 NvM_Cfg.h #define NVM_CRC_INT_BUFFER
    • 宏定义开关,安排了一个变量保存NVRAM块的Crc,只保留最新的一个
    • 选择True

    Kill WriteAll API

    配制 Configurator选项 Kill WriteAll API -> True/False
    影响 NvM_Cfg.h #define NVM_KILL_WRITEALL_API
    • 宏定义开关,是否启用API NvM_KillWriteAll
    • 选择True

    Callback Include File List

    配制 Configurator选项 Callback Include File List -> reference
    影响 NvM_Cfg.c #include
    • 需要#include用到的Callback函数文件,一般是Dem_Cbk.h,Appl_Misc.h

    3.3 NvM\NvMBlockDescriptors

    每个NVRAM块一个Descriptor页,相关内容会写进NvM_BlockDescriptorTable_at[NVM_TOTAL_NUM_OF_NVRAM_BLOCKS]中


    Automatic Block Length

    配制 Configurator选项 Automatic Block Length -> True/False
    • 宏定义开关
    • 选择False

    Block Base Number

    配制 Configurator选项 Block Base Number -> [1, :]
    • 功能没做

    Block Identifier

    配制 Configurator选项 Block Identifier -> [1, :]
    • NVRAM块的Block ID,其实就是Block在块描述表NvM_BlockDescriptorTable_at[NVM_TOTAL_NUM_OF_NVRAM_BLOCKS]中的下标顺序
    • Block ID = 0 留给MultiBlockRequest
    • Block ID = 1 留给NvMConfigBlock
    • 自定义Block从Block ID = 2开始排

    Block Length

    配制 Configurator选项 Block Length -> [1, 65535]
    影响 NvM_Cfg.c const NvM_BlockDescriptorType NvM_BlockDescriptorTable_at[]
    {
    .NvBlockLength_u16=
    }
    • NV块的Length

    Block Length Check

    配制 Configurator选项 Block Length Check -> True/False
    • 宏定义开关,编译时检测Block Length,不正确的Block Length编译会报错
    • 只能用于Permanent RAM的块

    Block Length Check Strict

    配制 Configurator选项 Block Length Check Strict -> True/False
    • 宏定义开关,开启时要求Block Length必须与ROM Length和RAM Length精确匹配
    • 只能用于Permanent RAM的块
    • 必须开启Block Length Check同时关闭Automatic Block Length才有用

    Block NV RAM Data Length

    配制 Configurator选项 Block Length Check Strict -> [1, 65535]
    • 用于CSM Job
    • 不填

    Block Post Read Transform Callback

    配制 Configurator选项 Block Post Read Transform Callback -> 函数名或不填
    • Read后的回调函数,要使用则必须配合Block Pre Write Transform Callback
    • 不填

    Block Pre Write Transform Callback

    配制 Configurator选项 Block Pre Write Transform Callback -> 函数名或不填
    • Write前的回调函数,要使用则必须配合Block Post Read Transform Callback
    • 不填

    Block Status Information

    配制 Configurator选项 Block Status Information -> 函数名或不填
    • 开启时,每次Block Status Information改变时都会调用BswM_NvM_CurrentJobModeBswM模块报告信息

    Use CRC Comp Mechanism

    配制 Configurator选项 Use CRC Comp Mechanism -> True/False
    • 开启时,每次Write Job前都会将RAM CRC与NV CRC进行比较,如果相同,则直接返回Write成功

    Block Use Set Ram Status

    配制 Configurator选项 Block Use Set Ram Status -> True/False
    • 在这个块中是否启用API NvM_SetRamBlockStatus
    • 必须开启SetRamBlockStatus API才有效

    Calc Ram Block CRC

    配制 Configurator选项 Calc Ram Block CRC -> True/False
    • 是否计算Permanent RA的CRC

    Crc Type

    配制 Configurator选项 Crc Type -> enum:
    NVM_CRC16
    NVM_CRC32
    • 选择NVRAM块的CRC大小
    • 必须开启Crc usage才有效

    Crc usage

    配制 Configurator选项 Crc usage -> True/False
    • 是否使用NVRAM块的CRC

    Csm Decryption Job Reference

    配制 Configurator选项 Csm Decryption Job Reference -> reference
    • 用于Csm功能,目前不用

    Csm Encryption Job Reference

    配制 Configurator选项 Csm Encryption Job Reference -> reference
    • 用于Csm功能,目前不用

    Datasets

    配制 Configurator选项 Datasets -> [1, 255]
    • NVRAM块中NV块的数量

    Device Id

    配制 Configurator选项 Device Id -> [1, 255]
    • 功能没做

    Init Block Callback

    配制 Configurator选项 Init Block Callback -> 函数名
    • 是否使用Callback隐式回复默认值

    Init Block Callback(Extended)

    配制 Configurator选项 Init Block Callback(Extended) -> 函数名
    • 是否使用Callback隐式回复默认值,非AUTOSAR,别用

    Invoke Callbacks For Read All

    配制 Configurator选项 Invoke Callbacks For Read All -> True/False
    • NvM_ReadAll时是否调用NvMSingleBlockCallbackNvMInitBlockCallback
    • 选择True

    Invoke Callbacks For Write All

    配制 Configurator选项 Invoke Callbacks For Write All -> True/False
    • NvM_WriteAll时是否调用NvMSingleBlockCallback
    • 选择False

    Management Type

    配制 Configurator选项 Management Type -> enum:
    NVM_BLOCK_NATIVE
    NVM_BLOCK_REDUNDANT
    NVM_BLOCK_DATASET
    • 选择NVRAM块类型

    Maximum number of read retries

    配制 Configurator选项 Maximum number of read retries -> [0, 7]
    • 功能没做

    Maximum number of write retries

    配制 Configurator选项 Maximum number of write retries -> [0, 7]
    • 功能没做

    Priority

    配制 Configurator选项 Priority -> [0, 255]
    • NVRAM块的优先级,0为Immediate

    RAM Block Data

    配制 Configurator选项 RAM Block Data -> 变量名
    • RAM里的变量名
    • Permanent RAM块必填

    Read Ram Block to Nv Callback

    配制 Configurator选项 Read Ram Block to Nv Callback -> 函数名

    Resistant To Changed Software

    配制 Configurator选项 Resistant To Changed Software -> 函数名
    • 开启则Dynamic Config Handling对此NVRAM块无效

    ROM Block Data

    配制 Configurator选项 RAM Block Data -> 变量名
    • ROM里的变量名
    • 没有则不填

    ROM Block Number

    配制 Configurator选项 ROM Block Number -> 不填
    • 功能没做

    Select Block For ReadAll

    配制 Configurator选项 Select Block For ReadAll -> True/False
    • NVRAM块是否被NvM_ReadAll指令执行

    Select Block For WriteAll

    配制 Configurator选项 Select Block For WriteAll -> True/False
    • NVRAM块是否被NvM_WriteAll指令执行

    Single Block Callback

    配制 Configurator选项 Single Block Callback -> 函数名
    • 是否使用单块指令Callback

    Single Block Callback(Extended)

    配制 Configurator选项 Single Block Callback(Extended) -> 函数名
    • 是否使用单块指令Callback,非AUTOSAR,别用

    Static Block Id Check

    配制 Configurator选项 Static Block Id Check -> 不填
    • 功能没做

    Use Init Callback

    配制 Configurator选项 Use Init Callback -> 不填

    Use Job End Callback

    配制 Configurator选项 Use Job End Callback -> 不填

    Use Service Ports

    配制 Configurator选项 Use Service Ports -> 不填

    Use Synchronization Mechanism

    配制 Configurator选项 Use Synchronization Mechanism -> 不填

    Write Block Once

    配制 Configurator选项 Write Block Once -> 不填

    Write Protection

    配制 Configurator选项 Write Protection -> 不填

    Write Ram Block from Nv Callback

    配制 Configurator选项 Write Ram Block from Nv Callback -> 函数名

    Write Verification

    配制 Configurator选项 Write Verification -> 不填

    Write Verification Data Size

    配制 Configurator选项 Write Verification Data Size -> 不填

    >>返回AUTOSAR系列文章目录<<

    展开全文
  • AUTOSAR —— NVM 1

    千次阅读 热门讨论 2019-07-28 14:26:04
    本文根据AUTOSAR4.4(Classic Platform)...AUTOSAR_SRS_MemoryServices.pdf AUTOSAR_SWS_NVRAMManager.pdf 两篇文章整理。仅为个人理解,不当之处,还请指正,...
  • AUTOSAR —— NVM 2

    千次阅读 2019-07-28 23:19:37
    本文根据AUTOSAR4.4(Classic Platform)...AUTOSAR_SRS_MemoryServices.pdf AUTOSAR_SWS_NVRAMManager.pdf 两篇文章整理。仅为个人理解,不当之处,还请指正,...
  • AUTOSAR —— NVM 3

    千次阅读 2019-09-15 18:35:29
    本文根据AUTOSAR4.4(Classic Platform)...AUTOSAR_SRS_MemoryServices.pdf AUTOSAR_SWS_NVRAMManager.pdf 两篇文章整理。仅为个人理解,不当之处,还请指正,...
  • AUTOSAR —— NVM 4

    千次阅读 2019-11-30 22:22:11
    本文根据AUTOSAR4.4(Classic Platform)...AUTOSAR_SRS_MemoryServices.pdf AUTOSAR_SWS_NVRAMManager.pdf 两篇文章整理。仅为个人理解,不当之处,还请指正,...
  • AUTOSAR —— NVM 5:数据处理机制

    千次阅读 2019-12-01 11:42:28
    本文根据AUTOSAR4.4(Classic Platform)...AUTOSAR_EXP_NVDataHandling.pdf 文章整理。仅为个人理解,不当之处,还请指正,感谢! 目录 1 Acronyms and abbre...
  • 三、NVM-作用 四、NvM-概述 五、NvM-结构 六、NvM-基本概念 一、存储栈组成 NVRAM Manager-NvM Memory Abstraction Interface-MemIf EEPROM Abstraction-Ea Flash EEPROM Emulation-Fee Internal/...
  • 一、NvM-地址结构 二、NvM-基本存储对象 1、NvM-NV block 2、NvM-RAM block 3、NVM-ROM block 4、NvM-Administrative block 5、NvM-NV Block Header 一、NvM-地址结构 MemIf、EA、Fee为NvM模块提供虚拟线性...
  • 一、NvM-API配置类 二、NVM-扫描顺序/优先级策略 三、NVM-功能 四、NVM-时序(异步调用) 一、NvM-API配置类 API Configuration class3: 所有的API调用均可用,可使用功能最大化 API Configuration class2: ...
  • 02_Autosar基础软件

    2020-09-19 12:22:53
    1. 通信协议栈 1.1 模块总览 1.2 驱动 Can 1.3 接口 CanIf 1.4 路由 PduR ...1.6 网络管理 2. 存储协议栈 2.1 模块总览 ...2.5 存储 NvM 3. 诊断协议栈 3.1 模块总览 3.2 CanTp 3.3 Dcm 3.4 Dem 2.5 FiM
  • Autosar06 - FEE 模块

    2020-12-21 11:39:59
    1.Memory Split for NVM and Quasi-Static Data 2.Garbage Collection 2.1 Initial Status with valid State Pages 2.2Initial Status with valid State Pages 2.3 Sector 0 filled with Data ...
  • 内存:Fls Fee Eep Ea NvM MemIf 1.2 AS迷你BSW 主要目的是创建由我实现的所有代码的小型引导程序。 诊断: 2. OS 该RTOS ASKAR是根据设计的,并参考了许多其他开源RTOS,通常情况如下: 为了能够运行大多数...
  • AUTOSAR之DEM(四)——Event Memory

    千次阅读 2020-05-06 22:46:15
    Event Memory event memory是DEM的精髓所在。...如果存在一个完整的上下电过程,可以在NvM_ReadAll的时候把数据读取到存储在RAM中的变量,当下电时,NvM_WriteAll写入NvM。Event memory管理负责故...
  • 汽车电子学习笔记—AutoSAR之BSW—NVRAM Manager(二) - 1、RAM Block data RAM 状态转换图 RAM状态转换说明 1)上电最初状态:UNINITIALIZED 2)初始化后(NvM_Init):INVALID / UNCHANGED 3)NvM_ReadAll后...
  • 讲解了一下NvM模块的作用
  • 汽车电子学习笔记—AutoSAR之BSW—NVRAM Manager(一) - 1、概述 NVRAM Manager(NvM)是应用app层访问非易失性数据的唯一接口,提供非易失数据的管理服务。 NvM上层是RTE,下层是对接Flash Driver或者EEPROM ...
  • 存储相关模块 23、Ea EEPRON Abstraction,提供了独立于硬件的接口来访问EEPROM数据(擦除、读取、写入函数接口),均衡擦写机制(延长eeprom使用寿命)...26、NVM:Non-Volative-RAM Manager,位于MemIf之上,读写数.
  • MemIf模块允许NVM访问多个存储抽象模块(FEE/EA) MemIf模块对下层存储抽象模块( FEE/EA)的数量的抽象 MemIf模块提供给上层在统一线性地址空间的虚拟分段 1、Fast Mode 在启动或关闭阶段,底层驱动可以转换...
  • 微控制器存储器介绍

    2021-03-15 15:46:52
    本文介绍车用微控制器存储器,无论是寄存器指令还是AUTOSARNvM单元,都是以微控制器的存储器硬件为基础 1 存储器硬件分类 1.1 ROM存储器 Read Only Memory,只读存储器,最初代表一种出厂后只能读不能写、不掉电的...

空空如也

空空如也

1 2
收藏数 24
精华内容 9
关键字:

autosarnvm