上一篇 | 返回主目录 | 下一篇

Autosar模块介绍:Memory_2(NVM

1 基本术语解释

编号 缩写 原文 解释
1 NV Non Volatile 非易失性
2 NVM NVRAM Manager 非易失性存储管理
3 Basic Storage Object —— NVRAM Block中最小组成单位,可存在于RAM/ROM/NV存储
4 NVRAM Block —— Administrative存储块以及数据存储块构成的整体
5 NV data —— 存储在非易失性存储里的数据
6 Block Management Type —— NVRAM Block的类型,取决于NVRAM Block组成的配置信息
7 NV Block Header —— 如果使能静态Block Id,则NV Block存在此额外信息
8 RAM Block Random Access Memory Block 基础存储单元,存在于RAM中
9 ROM Block(可选) Read Only Memory Block 基础存储单元,存在于ROM中
10 NV Block(必选) —— 基础存储单元,存在于EE中
11 Administrative Block(必选) —— 基础存储单元,存在于RAM中。用于管理NVRAM
12 FCFS First come first served 先来先处理

2 NVRAM Block组成关系

NVRAM Block组成关系如下图:

  • NV Block、RAM Block、ROM Block、Administrative Block为NVRAM Block组成部分
  • NV Data(用户数据)为NV Block、RAM Block、ROM Block组成部分
  • NV Block、RAM Block、ROM Block、Administrative Block为Basic Storage Object 实现

#注意事项(UML):
1、实心菱形箭头:用于表示部分与整体的关系,由组成部分指向整体
2、空心三角形箭头:用于表示类与实现之间关系,由实现指向类定义

2.1 基础Block类型

2.1.1 NV Block

  • NV Block包含三部分元素: Header(可选)、Data(用户数据)、CRC(校验数据)
  • 若存在静态ID配置,NV Block Header应该包含在NV Block前面

2.1.2 RAM Block

  • RAM Block包含三部分元素: Header(可选)、Data(用户数据)、CRC(校验数据)
  • RAM Block格式与对应的NV Block一致
  • RAM Block数据可以通过NVM Manager和应用中进行访问(从相应的NV Block中或者写入相应的NV Block)
  • RAM Block在RAM中的位置不要求连续
  • RAM Block在RAM中的位置是否固定取决于它所属的NVRAM Block的类型

    #注意事项
  • 在配置时进行数据对齐, 避免出现访问错误

2.1.3 ROM Block

  • ROM Block提供默认数据,以防NV Block中数据为空或者出现数据损坏

2.2.4 Administrative Block

  • 存在于RAM中,应包含NV Block的索引,以及包含属性/错误/状态信息在相应的NVRAM Block中
  • 管理块对于应用程序应该是不可见的,并且由NvM模块专门用于RAM块和NVRAM块本身的安全性和管理目的
  • NvM模块应使用一个属性字段来管理NV块写入保护,以保护/取消保护NV块数据字段
  • NvM模块应使用一个错误/状态字段来管理最后一个请求的错误/状

2.2 NVRAM Block类型

编号 类型 NV Block数量 RAM Block数量 ROM Block数量 Administrative Block数量
1 NVM_BLOCK_NATIVE 1 1 0-1 1
2 NVM_BLOCK_REDUNDANT 2 1 0-1 1
3 NVM_BLOCK_DATASET 1-(m < 256) 1 0-n 1

#注意事项

  • NVM_BLOCK_DATASET可能的数据集数量取决于配置参数NvMDatasetSelectionBits
  • 配置的数据集(NV+ROM块)总数必须在1 - 255之间
  • NV Block编号(0-m), ROM Block编号(m -(n + m - 1)), 如图2

3 NVM基本操作(不用看,可跳过 )

3.1 NVRAM管理启动

  • 通过EcuM模块调用NvM_Init,该模块依赖的Fls、Fee等模块也须在EcuM进行初始化(前置条件)
  • RAM Data Block初始化,通过调用NvM_ReadAll(Dem相关Block Id需设置较小,便于尽早启动Dem功能)

3.2 NVRAM管理关闭

EcuM通过调用NvM_WriteAll对NVM进行关闭

3.3 对NvM模块的并行写访问

NvM模块应通过排队机制通过异步接口接收请求,须根据其优先级连续处理所有请求

3.4 NVRAM块一致性检查

通过CRC对数据块进行校验,两个参数NvMBlockUseCrc和NvMCalcRamBlockCrc需要进行配置

3.5 错误恢复

  • 在读取时出现CRC错误时,可启动错误恢复
  • 出现读取错误时,可进行Retry
  • 或者根据Block类型进行默认数据进行加载

3.6 通过ROM数据恢复RAM块

通过ROM Block显示或隐式重置RAM Block数据

3.7 通过ROM默认数据隐式恢复RAM块

隐式恢复过程中,NV Block数据不会被修改

3.8 通过ROM默认数据隐式恢复RAM块

  • 提供NvM_RestoreBlockDefaults、NvM_RestorePRAMBlockDefaults接口进行显示恢复
  • NvM_RestoreBlockDefaults、NvM_RestorePRAMBlockDefaults将会保留未修改的NV Block数据

3.9 检测到对NV块的未完成的写操作

NV块写入监测由内存抽象模块完成

3.10 终止单个块请求

  • 所有的异步请求操作(除NvM_CancelWriteAll外)都将在Administrative block模块中进行状态显示
  • NvMSingleBlockCallback回调函数将会在所有请求(除NvM_CancelWriteAll外)结束时进入

3.11 终止多块请求

  • 通过NvM_ReadAll、NvM_WriteAll、NvM_CancelWriteAll、NvM_ValidateAll进行多个块请求
  • NvM_GetErrorStatus返回最近执行的块操作的状态信息

3.12 异步请求/作业处理的一般处理

  • NVRAM Block长度超出NvMCrcNumOfBytes配置长度,则分多次进行CRC计算
  • NvM模块应中断异步请求/作业处理,以便具有立即优先级的作业(突发数据请求)
  • 异步请求溢出,则函数返回值E_NOT_OK
  • 当异步请求进入队列成功时,返回值为E_PEQ_PENDING
  • 当异步请求执行成功时,返回值为E_PEQ_OK

3.13 NVRAM块写保护

  • NVM保护只与NV Block关联,例如,可以修改RAM Block数据,但是数据不会同步到NV Block
  • NvMWriteBlockOnce为FALSE时,可以通过NvM_SetBlockProtection函数接口进行保护的使能与禁止
  • NvMWriteBlockOnce为TRUE时,NV Block中数据只允许写入一次

3.14 NVRAM块写保护

  • List item NvMSetRamBlockStatusApi、NvMBlockUseSetRamBlockStatus将会修改RAM Block状态
  • 将数据写入NV Block之前,需要将RAM Block模块状态修改为valid/unmodified
  • RAM Block进入VALID/UNCHANGED状态
    a、NvM_ReadAll()
    b、NvM_ReadBlock
    c、NvM_WriteBlock
    d、NvM_WriteAll()
  • RAM Block进入VALID/CHANGED状态
    a、NvM_SetRamBlockStatus
    b、NvM_WriteBlock
    c、NvM_WriteAll
    d、NvM_ReadBlock
    e、NvM_RestoreBlockDefaults
    f、NvM_ReadAll
    g、NvM_ValidateAll
  • RAM Block进入 INVALID / UNCHANGED状态
    a、 NvM_SetRamBlockStatus
    b、NvM_ReadBlock
    c、NvM_ReadBlock
    d、NvM_ReadBlock
    e、 NvM_WriteBlock
    f、NvM_WriteAll
    g、NvM_InvalidateNvBlock
    h、NvM_EraseNvBlock

3.15 应用程序和NVRAM管理器之间的通信和隐式同步

数据一致性需要通过应用程序进行保证

3.15.1 写入请求(NvM_WriteBlock或NvM_WritePRAMBlock)

  • 应用程序存入RAM Block中数据须由NVM模块进行写入
  • NvM_WriteBlock、NvM_WritePRAMBlock请求将由NVM模块进行操作
  • 在状态切换称成功或者失败前,不允许对RAM Block中数据进行修改
  • 可通过轮询的方式来获取状态,或者通过异步的回调函数来获取状态信息
  • NVM操作完成后,RAM Block可以重新被修改

3.15.2 读取请求(NvM_ReadBlock或NvM_ReadPRAMBlock)

  • 应用程序提供的数据块需要通过NVM模块进行填充
  • 应用程序进行 NvM_ReadBlock请求后,将由NVM模块相关操作(RAM Block)
  • 在获取到成功或失败状态前,应用程序不能读取或写入RAM块
  • 应用程序可以使用轮询来获取请求的状态,也可以通过回调函数进行获取
  • 完成NvM模块操作后,RAM Block的新数据可被应用程序进行访问

3.15.3 恢复默认请求(NvM_RestoreBlockDefaults和NvM_RestorePRAMBlockDefaults)

nvm
nvm-sh/nvm: 是一个 Node.js 版本管理器,用于在不同的 Node.js 版本之间进行切换。它可以帮助开发者轻松管理多个 Node.js 版本,方便进行开发和测试。特点包括轻量级、易于使用、支持跨平台等。
  • 应用程序提供的数据块需要通过NVM模块进行填充
  • 应用程序发出NvM_RestoreBlockDefaults或NvM_RestorePRAMBlockDefaults请求,将控制权转移到NvM模块
  • 在获取到成功或失败状态前,应用程序不能读取或写入RAM块
  • 应用程序可以使用轮询来获取请求的状态,也可以通过回调函数进行获取
  • 完成NvM模块操作后,RAM Block及ROM Block的新数据可被应用程序进行访问

3.15.4 多块读取请求(NvM_ReadAll)

  • 应用程序可以使用轮询来获取请求的状态,也可以通过回调函数进行获取
  • 单个Block的回调函数,在完成操作时被调用

3.15.5 多块写入请求(NvM_WriteAll)

  • 应用程序在发出NvM_WriteAll请求后,将由NvM模块进行完成
  • 应用程序可以使用轮询来获取请求的状态,也可以通过回调函数进行获取

3.15.6 取消操作(NvM_CancelWriteAll)

用于取消NvM_WriteAll的请求(被挂起),且只能被EcuM模块进行调用

3.15.7 修改管理方块

若存在一个待处理的NVRAM Block,将不允许进行NvM_SetDataIndex、NvM_SetBlockProtection、NvM_SetRamBlockStatus

3.16 NVRAM块的正常和扩展运行时准备

如果NvMDynamicConfiguration设置为TRUE,并且检测到配置ID不匹配,NvMResistantToChangedSw配置为FALSE的NVRAM Block将进入扩展运行准备

3.17 应用程序和NVRAM管理器之间的通信和显式同步

通过RAM镜像实现,应用程序传递的数据通过NVM模块的回调例程进行。存在以下两个特点:

  • 应用程序可以更好地控制它们的数据,该模块知道将数据复制到NvM模块的RAM镜像时间节点。并且避免了由于并发访问导致出现数据不一致的状态
  • 需要额外的RAM空间
    a通过参数NvMBlockUseSyncMechanism进行配置显示同步使能
    b 如果没有块配置显示同步,则禁止分配镜像RAM
    c NvM模块应使用内部镜像作为读写RAM块的所有操作的缓冲区
    d NvM模块应调用NvMWriteRamBlockToNvM例程将数据从RAM块复制到RAM镜像
    e NvM模块应调用NvMReadRamBlockFromNvM例程将数据从镜像复制到RAM块

3.17.1 写入请求(NvM_WriteBlock或NvM_WritePRAMBlock)

  • 应用程序填入RAM Block中的数据需要通过NVM模块进行写入
  • 应用程序会发出NvM_WriteBlock或NvM_WritePRAMBlock请求
  • 在NvM模块调用例程NvMWriteRamBlockToNvM前,应用程序可以修改RAM Block
  • NvMWriteRamBlockToNvM被NVM模块调用,应用程序将数据复制到目标地址
  • 只有当应用程序向RAM Block后才会继续
  • 然后应用程序可以再次读写RAM块
  • 应用程序可以轮询方式获取请求的状态,也可以通过回调例程异步地进行通知

3.17.2 读取请求(NvM_ReadBlock或NvM_ReadPRAMBlock)

  • 应用程序填入RAM Block中的数据需要通过NVM模块进行写入
  • 应用程序会发出NvM_WriteBlock或NvM_WritePRAMBlock请求
  • 在NvM模块调用例程NvMWriteRamBlockToNvM前,应用程序可以修改RAM Block
  • NvMWriteRamBlockToNvM被NVM模块调用,应用程序将数从目标地址复制数据
  • 只有当应用程序向RAM Block后才会继续
  • 然后应用程序可以再次读写RAM块
  • 应用程序可以轮询方式获取请求的状态,也可以通过回调例程异步地进行通知

3.17.3 多块读取请求(NvM_ReadAll)

  • EcuM进行NvM_ReadAll请求
  • EcuM可通过轮询的方式获取请求状态,或者通过回调函数获取相应的请求状态
  • 若配置NvM_ReadRamBlockFromNvm,则在收到请求后,进入相应回调,应用程序从相应位置获取数据
  • 如果请求成功,应用程序可以通过RAM Block获取NV Block数据
  • 触发该请求后,会进入单个NV Block的回调函数

3.17.4 多块写入请求(NvM_WriteAll)

  • EcuM进行NvM_WriteAll请求,控制由NVM模块完成
  • EcuM可通过轮询的方式获取请求状态,或者通过回调函数获取相应的请求状态
  • 若配置NvM_ReadRamBlockFromNvm,则在收到请求后,进入相应回调,应用程序将数据复制到对应位置
  • 完成上述步骤后,可再次进行读取或者写入

3.18 静态块ID检查

每次块写入NV时,NVRAM将包含NV ID的NV Header存取NV Block。读取时,会将其静态Block ID与请求的Block ID进行比较,通过此方式可检测硬件错误。

  • 每次将数据写入NV Block中时,NVRAM将Block Header中的Block ID写入NV Block
  • NVRAM模块每次在读出数据时,会校验Block Header

3.19 读重新尝试

  • 读取NV Block失败后,将会重新尝试读取NVM_MAX_NUM_OF_READ_RETRIES(配置参数)次
  • 在重新尝试失败后,将会进行错误处理或者恢复操作(如冗余数据以及ROM数据等)

3.20 写入验证

如果配置了参数NVM_WRITE_VERIFICATION,在写入NV Block后会立即读回数据进行比较验证写入正常与否

  • RAM块中的原始内容与块读回之间的比较应按步骤进行,以便读取和比较的字节数不大于配置参数NVM_WRITE_VERIFICATION_DATA_SIZE指定的值
  • 如果RAM Block中的原始内容与读回的内容不一致,则向DEM报告生产码错误NVM_E_VERIFY_FAILED

3.21 比较NvM中的NV数据

为避免不必要的NV Block写操作,将会基于CRC规则进行块的比较(若未进行变更将不会进行写入)
1、NvM模块提供通过实现基于CRC的比较机制来跳过未改变数据的写入选项
2、通过配置项

3.22 NvM和BswM交互

  • 若参数BswMMultiBlockJobStatusInformation被配置,则可通过BswM_NvM_CurrentJobMode获取执行状态
  • 若参数BswMBlockStatusInformation被配置,则可通过BswM_NvM_CurrentBlockMode获取执行状态

3.23 块锁定时的NvM行为

NvM_SetBlockLockStatus接口只能被BswM模块访问,不能被RTE模块访问

  • 若保护使能,则该模块在NvM_WriteAll时将会跳过,NvM_WriteBlock、 NvM_WritePRAMBlock、NvM_InvalidateNvBlock、NvM_EraseNvBlock请求将会被拒绝
  • 将不会被NvM_SetRamBlockStatus修改相应状态

4 NVM常用操作时序

4.1 同步调用

4.1.1 NvM_Init

4.1.2 NvM_SetDataIndex

4.1.3 NvM_GetDataIndex

4.1.4 NvM_SetBlockProtection

4.1.5 NvM_GetErrorStatus

4.1.6 NvM_GetVersionInfo

4.2 异步调用

4.2.1 Asynchronous call with polling

4.2.2 Asynchronous call with callback

4.2.3 Cancellation of a Multi Block Request

上一篇 | 返回主目录 | 下一篇

阅读全文
AI总结
GitHub 加速计划 / nv / nvm
66
3
下载
nvm-sh/nvm: 是一个 Node.js 版本管理器,用于在不同的 Node.js 版本之间进行切换。它可以帮助开发者轻松管理多个 Node.js 版本,方便进行开发和测试。特点包括轻量级、易于使用、支持跨平台等。
最近提交(Master分支:2 个月前 )
572c757f - 3 年前
1d39e35b - 2 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐