汽车电子学习笔记—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模块都应该通过执行写重试来提供写时的错误恢复
- read recovery
-
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只能写一次
- NvM同时收到多个单块请求,采用队列的形式处理