关键词
嵌入式、C语言、autosar
平台说明
项目 | Value |
---|---|
OS | autosar OS , |
芯片厂商 | Infineon |
编程语言 | C,C++ |
编译器 | tasking |
技术背景
为了实现NVM的合理使用。
更新:[AutoSar]BSW_Memory_Stack_001 存储栈概述
技术难点(关注点)
NVM机制。
一 、NVM简介
1.1结构
1.2 Block Management types
1.2.1 Native NVRAM block
• NV Blocks: 1
• RAM Blocks: 1
• ROM Blocks: 0…1
• Administrative Blocks:1
结构最简单的 Bloack,以最小的资源访问 NV DATA。
1.2.2 Redundant NVRAM block
NV Blocks: 2
RAM Blocks: 1
ROM Blocks: 0…1
Administrative Blocks:1
与上一个NATIVE Block相比,增强的容错性、可靠性和可用性。如果在读取期间与 Redundant NVRAM block相关的NV Block 被认为无效,则从另一个没有失效的 NV Block 恢复。
1.2.3 Dataset NVRAM block
NV Blocks: 1…NvMNvBlockNum
RAM Blocks: 1
ROM Blocks: 0…NvMRomBlockNum
Administrative Blocks: 1
由大小相同的NV Block组成,应用程序一次只能访问这些块中的一个。配置数据集的总数(NV+ROM块)必须在1…255的范围内。通过设置 API NvM_SetDataIndex 来访问这些数据,其中0 到NvMNvBlockNum – 1表示RAM 块。NvMNvBlockNum 到 NvMNvBlockNum + NvMRomBlockNum - 1 表示 ROM 块。
二、功能概述
2.1 APP RAM 和NVM block RAM 之间的同步机制
2.1.1 Implicit和 Expliciet 的区别和优缺点。
1.在implicit中,APP和NVM读写同一个RAM,在APP调用NVM 的API写入RAM到NV中时,如果写操作没有完成,RAM中的值是不允许改变的。
优点是占用RAM小,缺点是不可控写入时机。
2.在Explicit中,APP和NVM的RAM之间有一个镜像RAM。
优点是APP可以有效的控制RAM,缺点是需要消耗额外的一块RAM。
开启配置为:
2.2 CRC 比较机制
在数据写入NV前计算当前要写入的CRC与NV中已经存在的CRC是否相同,如果相同则跳过不写入。缺点在于有的数据就上数据不相同,但是计算出来的CRC也是一样的,导致本应写入新的数据却没有写入,不建议使用该功能。
开启配置为:
2.3 错误恢复机制
2.3.1 显式恢复
调用 API NvM_RestoreBlockDefaults 从配置的ROM中恢复默认值。该恢复模式适用于所有的block management types。其中DATASET 必须提前设置索引。
2.3.2 隐式恢复
隐式恢复适用于 Native 和Redundant 类型的bloack,在Native CRC错误的时候或者Redundant 第一个 NV Block 数据无效的时候恢复。
2.4 写入验证
在数据写入NV 之后立刻读取与RAM中的进行对比,如果不同则尝试重写,DEM报错 NVM_E_VERIFY_FAILED。
开启配置为:
三、Recovery设计
3.1功能概述
3.1.1功能定义
增强软件的可靠性和错误抵抗能力。当NV中数据损坏或者无效,为空的条件下,APP能够从ROM或者备份数据中恢复。
3.1.2 设计思路
3.1.2.1.Native Block 类型
结构最简单的Block。用于存放传感器标定系数,电机相关系数等。
1.应用场景:ReadAll的时候如果检测到RAM数据不匹配或者为空,则从配置的ROM中隐式恢复到RAM。
2.实现和测试方式:
如下图配置RAM和ROM,先不勾选CRC检测,写入数据。
其中 Addressing为MenMap机制使用。
然后修改配置,加上CRC检测。
3.1.2.2.Redundant Block 类型
带有两个相同NV Bloack。
1.应用场景:在ReadAll的时候,当检测到第一个NV无效的时候会从第二个NV中加载数据到RAM。如果恢复失败会报告给DEM NVM_E_LOSS_OF_REDUNDANCY(只有两个都无效的时候)。恢复后会重建 Redundant,写回NV。当NvM_ReadBlock 时,只要有一个NV读取成功,都不会报告给DEM。在调用NvM_WriteBlock的时候优先写入那些没有被读取的NV ,并且只要有一个NV写成功,状态都会被置位NVM_REQ_OK。调用NvM_EraseNvBlock的时候必须两个NV都被擦除才算成功。在使用NvM_WriteAll 的时候,如果配置了重建Redundant,那么该Block写入保护的功能会被忽视。
小结
注意根据项目需求和功能安全相关选择合适的NV方案。