AutoSAR NvM 问题分析


前言

NvM模块在开发阶段还是很简单的,配置项并不太多,但因为随着NvM版本的迭代,遇到问题还是很难调查解决的,协议栈是没有问题的。
根源:各家配置工具对NvM协议的架构不同和相关的配置项介绍模糊不够具体,导致我们对配置的理解不够透彻,导致配置项选错,出现了一些奇怪的问题。


一、上电NvM_ReadAll

NvM_ReadAll行为受2个配置参数 NvMDynamicConfigurationNvMResistantToChangedSw的影响。
配置:NvmCompiledConfigID若与上次NvM布局不一致,则新版本NvmCompiledConfigID需与旧版本保持不一致
布局不一致:新的block增加,旧的block长度发生变化或删除旧的block。
代码判断逻辑:
首先检查NvmCompiledConfigID,看从NV Block中读出的ID和现在配置的ID(RAM中)是否一致:
一致,认为没有发生配置变更,正常加载所有NVRAM Block。readall结束。
不一致,认为发生了配置变更,首先检查配置参数 NvMDynamicConfiguration:
NvMDynamicConfiguration = FALSE,配置已变更,不会读取NV Block中的值到RAM,使用默认数据(ROM或InitBlockCallback)加载RAM Block(具体过程待定,要结合NvM模块的具体实现);
NvMDynamicConfiguration = TRUE,对于每一个 NVRAM Block,查看参数 NvMResistantToChangedSw:
NvMResistantToChangedSw = FALSE,不管 RAM Block是否有效,都将忽略NV Block中的值,使用默认数据(ROM或InitBlockCallback)加载RAM Block;
NvMResistantToChangedSw = TRUE,将 NV Block中的数据加载到RAM中,NvM模块会像没有发生配置变更一样处理 NvM_ReadAll()。

二、下电NvM_WriteAll

NvMSetRamBlockStatusApi = FALSE,则 NvM_WriteAll() 会将所有 NVRAM Block 的RAM的内容拷贝到 NV Block中。
为了提高 NvM_WriteAll() 的速度,
第一种方法:我们可以将那些只有 RAM Block的内容发生变化的 NVRAM Block写到 NV Memory中,这就需要配置 NvMSetRamBlockStatusApi = TRUE。这种场景下,每当 RAM中的内容发生变化时,用户就需要调用 NvM_SetRamBlockStatus(BlockID, TRUE),从而告诉 NvM 模块在 NvM_WriteAll()时要处理该 NVRAM Block。
第二种方法:配置NvMBlockUseCRCCompMechanism = TRUE,如果运行期间没有更新RAM中的NV data,则不需要执行实际的写入操作。则NvM会提供基于CRC的比较机制跳过写入操作,以此来避免不必要的写操作。风险:如果RAM中的内容的确改变了,但是CRC未变,则基于CRC的比较机智将会跳过实际的写入操作,因而导致变化的内容没有写到NV memory中。

三、DET检测

配置NvMDevErrorDetect = TRUE,可以快速检测出大部分错误,省去了大部分的调试时间,具体Error code内容如下
在这里插入图片描述

  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值