[AutoSar]NVM模块介绍和使用说明

关键词

嵌入式、C语言、autosar

平台说明

项目Value
OSautosar 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方案。

>>>>>回到总目录<<<<<<

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老灰╮(╯-╰)╭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值