Autosar模块介绍:Memory_2(NVM)

Autosar模块介绍:Memory_2(NVM
- 1 基本术语解释
- 2 NVRAM Block组成关系
- 3 NVM基本操作(~~不用看,可跳过~~ )
-
- 3.1 NVRAM管理启动
- 3.2 NVRAM管理关闭
- 3.3 对NvM模块的并行写访问
- 3.4 NVRAM块一致性检查
- 3.5 错误恢复
- 3.6 通过ROM数据恢复RAM块
- 3.7 通过ROM默认数据隐式恢复RAM块
- 3.8 通过ROM默认数据隐式恢复RAM块
- 3.9 检测到对NV块的未完成的写操作
- 3.10 终止单个块请求
- 3.11 终止多块请求
- 3.12 异步请求/作业处理的一般处理
- 3.13 NVRAM块写保护
- 3.14 NVRAM块写保护
- 3.15 应用程序和NVRAM管理器之间的通信和隐式同步
-
- 3.15.1 写入请求(NvM_WriteBlock或NvM_WritePRAMBlock)
- 3.15.2 读取请求(NvM_ReadBlock或NvM_ReadPRAMBlock)
- 3.15.3 恢复默认请求(NvM_RestoreBlockDefaults和NvM_RestorePRAMBlockDefaults)
- 3.15.4 多块读取请求(NvM_ReadAll)
- 3.15.5 多块写入请求(NvM_WriteAll)
- 3.15.6 取消操作(NvM_CancelWriteAll)
- 3.15.7 修改管理方块
- 3.16 NVRAM块的正常和扩展运行时准备
- 3.17 应用程序和NVRAM管理器之间的通信和显式同步
- 3.17.1 写入请求(NvM_WriteBlock或NvM_WritePRAMBlock)
- 3.17.2 读取请求(NvM_ReadBlock或NvM_ReadPRAMBlock)
- 3.17.3 多块读取请求(NvM_ReadAll)
- 3.17.4 多块写入请求(NvM_WriteAll)
- 3.18 静态块ID检查
- 3.19 读重新尝试
- 3.20 写入验证
- 3.21 比较NvM中的NV数据
- 3.22 NvM和BswM交互
- 3.23 块锁定时的NvM行为
- 4 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_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




更多推荐
所有评论(0)