AutoSAR NvM 问题分析

文章目录

  • 前言
  • 一、上电NvM_ReadAll
  • 二、下电NvM_WriteAll
  • 三、DET检测


前言

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内容如下
AutoSAR NvM 问题分析_第1张图片

你可能感兴趣的:(AutoSAR学习笔记,mcu,单片机)