汽车电子学习笔记---AutoSAR之BSW---NVRAM Manager(一)

汽车电子学习笔记—AutoSAR之BSW—NVRAM Manager(一)

- 1、概述

  • NVRAM Manager(NvM)是应用app层访问非易失性数据的唯一接口,提供非易失数据的管理服务。

  • NvM上层是RTE,下层是对接Flash Driver或者EEPROM Driver的接口。

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

  • DET:Default Error Tracer – module to which development errors are reported

  • DEM:Diagnostic Event Manager

  • FEE:Flash EEPROM Emulation

  • EA:EEPROM Abstraction

- 3、架构图
在这里插入图片描述
- 4、NVRAM Block
1)Autosar中规定了四种 NVRAM Block

  • NV Block:
    nvram block必须存在的模块,数据内容持久存在与flash中,可以在程序执行过程中修改,它的组成:
    在这里插入图片描述
  • RAM Block
    NV数据的读写是相对较慢的操作,而swc task执行时间较快,如果直接读写太过频繁不可取,所以一般会使用一个同样大小的Ram空间来操作、使用、存放这些还没有被写入或者读取的NV值。
    RAM Block 是NV Block在RAM中的一个映射,因为应用层不能直接操作NV(速度太慢),所以基本上是一个1:1的结构
    在这里插入图片描述
  • ROM Block
    用于存储默认值,以便当NV block数据出现损坏时予以替换
  • Administrative Block
    1)专门用于对NVRAM Block 与 RAM blcok 的数据安全性进行管理而设计的,它对应用层并不可见。
    2)存在与RAM中,不是持久的,用于保存相应NVRAM块的属性/错误/状态信息,以及‘Dataset’类型的NVRAM块的块索引

2)结构组成
nv block,RAM block 和 Administrative Block必须存在,ROM block为可选项。包含哪些block是在配置阶段完成,相应的NVRAM block descriptor配置完成后,包含block也随之固定。

3)Block management type管理类型

  • Native
    consists of a single NV block, RAM block and Administrative block
  • redundant
    1)consists of two NV blocks, a RAM block and an Administrative block.
    2)包含2个NV block,如果一个 NV block 块无效(如read fail),则会使用另一个有效的NV block 中的数据来恢复此无效block
    3)如果恢复失败发送错误码 NVM_E_LOSS_OF_REDUNDANCY 到DET中
  • dataset
    1)consists of multiple NV user data, (optionally) CRC areas, (optional) NV block headers, a RAM block and an Administrative block
    2)Dataset NVRAM Block中的 (NV + ROM)block 总数必须在1…255的范围内

4)NvM Block 描述符表
NvM_Cfg.c中,NvM_BlockDescriptorTable_at,包含RAM、ROM和NVBlocks的静态配置参数
描述符表的数据结构:NvM_BlockDescriptorType
在这里插入图片描述

- 5、API configuration classes

  • class 1
    不支持 NVM_BLOCK_DATASET
    在这里插入图片描述

  • class 2
    在这里插入图片描述

  • class 3
    在这里插入图片描述

- 6、Scan order / priority scheme
1)NVM module 支持基于优先级的任务处理,由NvMJobPrioritization配置确认enable/disable

2)NvMJobPrioritization配置为ON状态,则NVM在处理异步请求时会有两个Job Queue

  • high priority queue:for immediate write jobs (crash data)
  • normal priority queue:for all other jobs (including immediate read/erase jobs)

3)NvMJobPrioritization配置为OFF状态,则不支持immediate write jobs,处理顺序按先来先处理

4)NvM_ReadAll and NvM_WriteAll同时只允许一个进程操作,即此job Queue长度为1

5)正在处理NvM_ReadAll job时,不能被其他请求中断,但immediate priority的write job例外,该job将抢占正在运行的读/写 job,随后将由NvM模块恢复或重新启动被抢占的job

6)正在处理NvM_WriteAll job时,不能被其他请求中断

7)NvM_WriteAll/NvM_ReadAll 运行期间如有其他的 write/read job请求,加入到队列中等待处理,待 WriteAll/ReadAll执行完成后再行处理

8)NvM_WriteAll 可以通过调用 NvM_CancelWriteAll 来取消。调用 NvM_CancelWriteAll 后,当前正在处理的block会一直执行直到完成,但是不再执行后续的block write 操作(如果请求因完成相关的NVRAM块而过时,则允许将请求出列)

- 7、功能要求
1)对每一个异步请求,job执行完后可以使用notification来通知执行结果,此项可以配置是否启用/禁用,此callback notification由NVM模块提供
在这里插入图片描述
2)AUTOSAR架构中,只有 NvM 模块可以直接访问 non-valitile memory,其他模块不能直接访问non-valitile memory

3)NvM 模块将数据blocks从NVRAM 拷贝到RAM中,并只提供隐式(implicit)方式来访问NVRAM Block和RAM.

4)APP应用模块可以根据给定的限制(例如同步)直接访问RAM数据

5)对所有的异步请求,如果请求对应的blockID还未在队列中或者正在处理中(multitasking restrictions),NvM 模块会将其加入处理队列中

6)最高优先级的请求由NvM模块从队列中获取,并按序列化顺序执行

7)如果没有配置 default ROM data 或者 NvMInitBlockCallback并没有定义callback,那么App应用模块应提供默认初始化数据。此种情况下,应用模块必须调用NvM_GetErrorStatus()来区分第一次初始化和损坏的数据之间的区别

8)在处理NvM_ReadAll期间,NvM模块可以通过执行校验和计算来检测损坏的RAM数据,并可以通过administrative block内数据是否有效检测RAM中的数据是否有效

9)在启动阶段或者正常操作NvM_ReadAll的期间,如果NvM模块在NV block 中检测到一个不可恢复的错误,NvM模块应将默认数据(如果有配置)复制到相应的RAM block中

10)NvM 模块使用OS services,只能使用BSW Scheduler,而不能直接使用OS对象和/或相关OS services

- 8、NvM startup/shutdown
1)NvM_Init() 只能由 BSW Mode Manager(BswM)调用

2)由于ECU启动时间的严格要求,NVRAM Block的初始化不包含在NvM_Init()中,而是在NvM_ReadAll()内完成,同样RAM data block初始化也是由NvM_ReadAll() 完成。NvM_ReadAll也只能由 BswM 调用

3)NvM_Init不负责底层驱动程序的初始化和内存硬件抽象,这些由BswM来处理

4)启动阶段,BswM可以使用NvM_GetErrorStatus() (polling 模式) 或者 callback 模式 (前提启用了NvM_MultiBlockCallback )来检测NvM startup 的error/status

  • polling模式:调用NvM_GetErrorStatus检测状态,如完成且无错误返回NVM_REQ_OK,如在NVM_REQ_PENDING状态,返回NVM_REQ_NOT_OK
  • callback模式:NVM每处理完一个NVRAM block 就会回调callback函数,通知处理结果信息

5)NvM模块不以持久的方式自动存储当前使用的Dataset索引,所以SWC可以调用NvM_GetErrorStatus检查block对应的状态信息,以确定相应RAM块的有效性

6) Dataset 类型的所有NVRAM Block,SWC可以使用 NvM_SetDataIndex()设置合适的索引位置。如SWC可以将当前的索引位置存储在一个特定的NVRAM block中,可以使用NvM_GetDataIndex()来获取索引位置

7)Shutdown 由NvM_WriteAll()来实现,NvM_WriteAll也是只能被BswM调用

- 9、NvM操作
1)NvM module 使用queue方式来接收所有的异步写请求,然后根据请求的优先级逐个处理

2)一致性检查

  • 通过NV Blocks的CRC的计算来检查NVRAM block数据的一致性
  • 可以为每一个NvM block 单独配置CRC校验,相关配置参数有2个: NvMBlockUseCrc、 NvMCalcRamBlockCrc
  • 如NvMWriteBlockOnce = TRUE,则必须使得 NvMBlockUseCrc = TRUE,同时应该禁用NvMBlockWriteProt,以便在CRC检查失败时使用户能够向NVRAM block写入数据
  • 根据可配置参数NvMBlockUseCrc和NvMCalcRamBlockCrc, NvM模块应该为使用的最大CRC分配内存

3)Error recovery

  • 1、error recovery恢复方式取决于 NVRAM block management type(Native, Redundant,
    Dataset), 包含read/write 失败的错误恢复

    • read recovery
      1)加载 default values(ROM 或者 block callback),三种管理类型都适合。 ROM block对应的配置参数为NvMRomBlockDataAddress,block callback 对应的配置参数为 NvMInitBlockCallback
      2)Redundant NVRAM Block:将第二个 NV block中的数据读到RAM中
      3)ReadAll(startup)期间,如果配置了 RAM block CRC,则在NVRAM Block验证失败时,提供错误恢复
    • write recovery
      任何一种管理类型,NvM模块都应该通过执行写重试来提供写时的错误恢复
  • 2、NvM模块提供implicit、explicit
    recovery,以便在NV块的不可恢复的数据不一致的情况下,将ROM数据恢复到相应的RAM块中

  • 3、Implicit recovery
    1)在Readall,NvM_ReadBlock ,NvM_ReadPRAMBlock 期间要使得 Implicit recovery 生效,需要同时具备以下3个条件:

    • 配置了ROM(ROM block或者 callback)
    • Permanent RAM block state 或者 RAM mirror(explicit synchronization)的 state is invalid 并且 CRC 不一致(即CRC校验为 mismatch)
    • 重读 NV block 失败

    2)对于 Native 和 redundant 类型的 NVRAM block,在调用NvM_ReadBlock ,NvM_ReadPRAMBlock 时会提供implicit recovery

  • 4、explicit recovery
    NVM 模块提供两个API: NvM_RestoreBlockDefaults, NvM_RestorePRAMBlockDefaults来显示的将数据从ROM 拷贝到RAM中

4)检测写nv block状态

  • 检测nv block写操作的状态( invalid /inconsistent /not readable),由memory
    hardware abstraction来检测,并不是NvM
  • SWC模块可以使用NvM_InvalidateNvBlock来防止底层发送旧数据,保证数据一致性

5)single block request结束

  • 所有的NVRAM Block的异步请求(除NvM_CancelWriteAll())执行完后,都会更新 Administrative
    block 的 error/status状态信息

  • NVRAM Block 可以配置notification callback函数NvMSingleBlockCallback,在每个异步请求执行完后,通过callback函数通知请求结果。对于NvM_ReadAl,因为readall 是逐个读取的,每读取完一个NVRAM block, 就调用notification 通知用户结果
    在这里插入图片描述
    6)一般异步request/job 处理步骤

    • NvM同时收到多个单块请求,采用队列的形式处理
      1、如果queue满了不能加入队列,request result = E_NOT_OK
      2、已加入队列,但还没有处理完成,request result = NVM_REQ_PENDING
      3、处理完成无异常,request result = NVM_REQ_OK
    • immediate priority (crash data) 会抢占中断正常优先级的异步request/job

    7)Nv block写保护

    • NvMWriteBlockOnce = false,可以调用NvM_SetBlockProtection() 启用/禁用 写保护;NvMWriteBlockOnce =true,不能调用NvM_SetBlockProtection() 启用/禁用 写保护
    • 如果NVRAM Block 配置了 NvMWriteBlockOnce = TRUE,NvM 模块对相关联的nv memory只能写一次
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值