AutoSAR 内存管理 NVM 规范 (2)(R24-11翻译)

AutoSAR 内存管理 NVM 规范 (2)(R24-11翻译)

引用:AUTOSAR_CP_SWS_NVRAMManager.pdf

7.2 General behavior

7.2.1 功能需求

[SWS_NvM_00383] ⌈对于每个异步请求,在作业完成后向调用方发送通知应是一个可配置的选项。⌋

[SWS_NvM_00384] 上游需求:SRS_Mem_08541⌈NvM 模块应提供回调接口 [SWS_NvM_00113]。⌋

提示:NvM 模块的环境应仅通过 NvM 模块访问非易失性存储器。任何模块(NvM 模块除外)都不允许直接访问非易失性存储器。

[SWS_NvM_00038] ⌈NvM 模块仅提供访问 NVRAM 和共享内存(RAM)中块的隐式方式。这意味着,NvM 模块将一个或多个块从 NVRAM 复制到 RAM,反之亦然。⌋

[SWS_NvM_00692] ⌈应用程序根据给定的限制(例如同步)直接访问 RAM 数据。⌋

[SWS_NvM_00385] ⌈如果具有特定 ID 的块尚未排队或当前正在处理(多任务限制),NvM 模块应将所有异步“单块”读/写/控制请求排队。⌋

[SWS_NvM_00386] ⌈只要不发生队列溢出,NvM 模块应接受多个异步“单块”请求。⌋

[SWS_NvM_00155] ⌈NvM 模块应从队列中获取最高优先级请求,并按序列化顺序进行处理。⌋

[SWS_NvM_00040] ⌈NvM 模块应实现对保存在非易失性存储器中的数据的一致性/完整性检查的隐式机制

[SWS_NvM_00165]。⌋ 取决于存储器堆栈的实现,由 NvM 模块提供和/或调用的回调例程可能会在中断上下文中被调用。提示:因此,在中断上下文中提供例程的 NvM 模块必须确保其运行时间合理较短。

[SWS_NvM_00085] ⌈如果在配置时没有可用的默认 ROM 数据或 NvMInitBlockCallback 未定义回调,则应用程序应负责提供默认初始化数据。⌋ 注意:在这种情况下,应用程序必须使用 NvM_GetErrorStatus() 以便能够区分首次初始化和损坏的数据(见 10.2.3)。

[SWS_NvM_00387] ⌈在处理 NvM_ReadAll 期间,NvM 模块应能够通过执行校验和计算来检测损坏的 RAM 数据 [ECUC_NvM_00476]。⌋

[SWS_NvM_00226] ⌈在处理 NvM_ReadAll 期间,NvM 模块应能够通过测试管理块内数据的有效性来检测无效的 RAM 数据 [ECUC_NvM_00476]。⌋

[SWS_NvM_00388] ⌈在启动阶段和 NvM_ReadAll 的正常操作期间,如果 NvM 模块在 NV 块内检测到不可恢复的错误,NvM 模块应将默认数据(如果已配置)复制到相应的 RAM 块。⌋

[SWS_NvM_00332] 上游需求:SRS_BSW_00429⌈为使用操作系统服务,NvM 模块应仅使用 BSW 调度器,而不是直接使用操作系统对象和/或相关的操作系统服务。⌋

[SWS_NvM_00985] ⌈对于配置了永久性 RAM(或通过 API 参数传递的 RAM)且其 RAM(起始位置)未与 NvMBufferAlignmentValue 对齐的 NVRAM 块的所有读和写 RAM 块的操作,NvM 模块应将内部镜像用作缓冲区。⌋

7.2.2 设计说明
7.2.2.1 NVRAM 管理器启动

[SWS_NvM_00693] ⌈NvM_Init 应由 BSW 模式管理器专门调用。⌋

[SWS_NvM_00091] ⌈由于 ECU 启动时间的严格限制,NvM_Init 请求不应包含已配置的 NVRAM 块的初始化。⌋

[SWS_NvM_00157] 上游需求:SRS_Mem_00011 ⌈NvM_Init 请求不应负责触发底层驱动程序和内存硬件抽象的初始化。这也应由 BSW 模式管理器处理。⌋

[SWS_NvM_00158] ⌈RAM 数据块的初始化应由另一个请求,即 NvM_ReadAll 完成。⌋ NvM_ReadAll 应仅由 BSW 模式管理器调用。

[SWS_NvM_00694] ⌈使用 NvM 模块的软件组件应负责检查由 NvM 模块启动产生的全局错误/状态信息。BSW 模式管理器应通过使用 NvM_GetErrorStatus [SWS_NvM_00015](保留块 ID 0)进行轮询或回调通知(可配置选项 NvM_MultiBlockCallback)来获取由启动产生的全局错误/状态信息。如果使用轮询,NVRAM 启动过程的结束应通过全局错误/状态 NVM_REQ_OK 或 NVM_REQ_NOT_OK(在启动期间为 NVM_REQ_PENDING)来检测。如果选择回调进行通知,当分配的 NVRAM 块已被处理时,软件组件应自动收到通知[SWS_NvM_00281]。⌋
注 1:如果为在 NvM_ReadAll 中处理的每个 NVRAM 块配置了回调,则 RTE 可以使用它们在早期时间点启动例如 SWCs。
注 2:为确保 DEM 在早期时间点完全运行,即其 NV 数据已恢复到 RAM,应将与 DEM 相关的 NVRAM 块配置为在 NvM_ReadAll 中首先处理的低 ID。
注 3:有关 NvM_MultiBlockCallback 的更多信息,请参见第 10.2.2 章。

[SWS_NvM_00160] 「NvM 模块不应以持久的方式自动存储当前使用的数据集索引。

软件组件应通过使用具有特定块 ID 的 NvM_GetErrorStatus [SWS_NvM_00015] 检查其负责的所有块的特定错误/状态,以确定相应 RAM 块的有效性。」
[SWS_NvM_00695] 「对于块管理类型为“NVRAM 数据集”[SWS_NvM_00006] 的所有块,软件组件应负责通过 NvM_SetDataIndex [SWS_NvM_00014] 设置适当的索引位置。例如,当前的索引位置可以由软件组件存储/维护在一个唯一的 NVRAM 块中。要获取“数据集块”的当前索引位置,软件组件应使用 NvM_GetDataIndex [SWS_NvM_00021] API 调用。」

7.2.2.2 NVRAM 管理器关闭

[SWS_NvM_00092] 「基本的关闭程序应由请求 NvM_WriteAll [SWS_NvM_00018] 来完成。」提示:NvM_WriteAll 应由 BSW 模式管理器调用。

7.2.2.3 对 NvM 模块的(准)并行写访问

[SWS_NvM_00162]上游需求:SRS_Mem_00013、SRS_Mem_00034

「NvM 模块应通过使用排队机制的异步接口接收请求。NvM 模块应根据请求的优先级串行处理所有请求。」

7.2.2.4 NVRAM 块一致性检查

[SWS_NvM_00164] 上游需求:SRS_Mem_08547、SRS_Mem_00030 【NvM 模块应提供隐式技术来检查 NVRAM 块的数据一致性 [ECUC_NvM_00476]、[SWS_NvM_00040]。】

[SWS_NvM_00571] 上游需求:SRS_Mem_08547⌈应通过对其相应 NV 块的 CRC 重新计算来对 NVRAM 块进行数据一致性检查。⌋

[SWS_NvM_00165] 上游需求:SRS_Mem_08547、SRS_Mem_00129⌈应通过内部函数的可配置选项提供数据一致性检查的隐式方式。对于每个 NVRAM 块,隐式一致性检查应是可配置的,并取决于可配置参数 NvMBlockUseCrc 和 NvMCalcRamBlockCrc。⌋
注:有关 NvMBlockUseCrc 和 NvMCalcRamBlockCrc 的更多信息,请参见第 10.2.3 章。

[SWS_NvM_00724] ⌈对于 NvMWriteBlockOnce = TRUE 的 NVRAM 块,应启用 NvMBlockUseCrc。对于 NvMWriteBlockOnce = TRUE 的 NVRAM 块,应禁用 NvMBlockWriteProt,以便在 CRC 检查失败的情况下使用户能够将数据写入 NVRAM 块。⌋

[SWS_NvM_00544] ⌈根据可配置参数 NvMBlockUseCrc 和 NvMCalcRamBlockCrc,NvM 模块应为所使用的最大 CRC 分配内存。⌋
提示:NvM 用户不应了解其 RAM 块中数据的 CRC 内存(例如大小、位置)的任何信息。

7.2.2.5 错误恢复

[SWS_NvM_00047] ⌈NvM 模块应提供错误恢复技术。错误恢复取决于 NVRAM 块管理类型 [SWS_NvM_00001]。⌋

[SWS_NvM_00389] ⌈对于每种 NVRAM 块管理类型,NvM 模块在读取时应通过加载默认值提供错误恢复。⌋

[SWS_NvM_00390] ⌈对于块管理类型为 NVM_BLOCK_REDUNDANT 的 NVRAM 块,NvM 模块在读取时应通过用默认值加载 RAM 块来提供错误恢复。⌋

7.2.2.6 带有 ROM 数据的 RAM 块的恢复

[SWS_NvM_00171]
上游需求:SRS_Mem_08549、SRS_Mem_08010
⌈在 NV 块出现不可恢复的数据不一致的情况下,NvM 模块应提供隐式和显式恢复技术,将 ROM 数据恢复到其对应的 RAM 块 [SWS_NvM_00387]、[SWS_NvM_00226]、[SWS_NvM_00388]。⌋

7.2.2.7 具有 ROM 默认数据的 RAM 块的隐式恢复

[SWS_NvM_00172]
上游需求:SRS_Mem_08010 【在隐式恢复期间,相应 NV 块的数据内容应保持不变。】

[SWS_NvM_00572] 【在启动期间(NvM_ReadAll 的一部分),对于未配置默认数据(通过参数 NvMRomBlockDataAddress 或 NvMInitBlockCallback)的每个 NVRAM 块,既不应通过 NvM_ReadBlock 也不应通过 NvM_ReadPRAMBlock 提供隐式恢复。】

[SWS_NvM_00573] 【在启动期间(NvM_ReadAll 的一部分),对于以下情况的每个 NVRAM 块,既不应通过 NvM_ReadBlock 也不应通过 NvM_ReadPRAMBlock 提供隐式恢复:
• 已配置默认数据(通过参数 NvMRomBlockDataAddress 或参数 NvMInitBlockCallback)。
• NvM 模块中的永久 RAM 块或 RAM 镜像的内容(在显式同步的情况下)状态有效且 CRC(数据)一致。】

[SWS_NvM_00574] ⌈在启动期间(NvM_ReadAll 的一部分),对于以下每种 NVRAM 块,无论是通过 NvM_ReadBlock 还是 NvM_ReadPRAMBlock,都不应提供隐式恢复:
• 已配置默认数据(通过参数 NvMRomBlockDataAddress 或参数 NvMInitBlockCallback)。
• NvM 模块中的永久 RAM 块或 RAM 镜像的内容(在显式同步的情况下)无效且 CRC(数据)不一致。
• 从 NV 的读取尝试成功。⌋

[SWS_NvM_00575] ⌈在启动期间(NvM_ReadAll 的一部分),对于以下每种 NVRAM 块,通过 NvM_ReadBlock 或 NvM_ReadPRAMBlock 应提供隐式恢复:
• 已配置默认数据(通过参数 NvMRomBlockDataAddress 或参数 NvMInitBlockCallback)。
• NvM 模块中的永久 RAM 块状态或 RAM 镜像的内容(在显式同步的情况下)无效且 CRC(数据)不一致。
• 从 NV 的读取尝试失败。⌋

[SWS_NvM_00951] 上游需求:SRS_Mem_00018 ⌈在 NvM_ReadBlock() 或 NvM_ReadPRAM-Block() 对类型为 NVM_BLOCK_NATIVE 和 NVM_BLOCK_REDUNDANT 的 NVRAM 块的请求期间,应提供隐式恢复。⌋

7.2.2.8 具有 ROM 默认数据的 RAM 块的显式恢复

[SWS_NvM_00391] 对于使用 ROM 块数据的显式恢复,NvM 模块应提供函数 NvM_RestoreBlockDefaults 和 NvM_RestorePRAMBlockDefaults [SWS_NvM_00012],以将 ROM 数据恢复到其对应的 RAM 块。

[SWS_NvM_00392] 函数 NvM_RestoreBlockDefaults 和 NvM_RestorePRAMBlockDefaults 不应修改对应 NV 块的数据内容。

提示:应用程序应使用 NvM_RestoreBlockDefaults 或 NvM_RestorePRAMBlockDefaults 函数,在每次需要时将 ROM 数据恢复到相应的 RAM 块。

7.2.2.9 对 NV 块的不完全写入操作的检测

[SWS_NvM_00174]
上游需求:SRS_Mem_08547 「对 NV 块的不完全写入操作的检测不在 NvM 模块的范围内。这由内存硬件抽象层处理和检测。NvM 模块期望在请求时,如果所引用的 NV 块无效或不一致且无法读取,从内存硬件抽象层获取信息。软件组件(SW-C)可以使用 NvM_InvalidateNvBlock 来防止底层提供旧数据。」

7.2.2.10 单个块请求的终止

[SWS_NvM_00175] 「NvM 模块提供的所有异步请求(除了 NvM_CancelWriteAll)应在相应管理块的指定错误/状态字段 [SWS_NvM_00000] 中指示其结果。」
[SWS_NvM_00176] 「可选配置参数 NvMSingleBlockCallback 配置通过回调在异步块请求(以及 NvM_ReadAll)终止时进行通知。」
注 1:在与应用程序软件组件(SWC)的通信中,应将 ECUC 配置参数 NvMSingleBlockCallback(ECUC_NvM_00506)配置为相应的 Rte_call_

_ API。
注 2:有关 NvMSingleBlockCallback 的更多信息,请参见第 10.2.3 章。

7.2.2.11 多块请求的终止

[SWS_NvM_00393] ⌈NvM 模块应使用一个单独的变量来存储异步多块请求(NvM_ReadAll、NvM_WriteAll 包括 NvM_CancelWriteAll、NvM_ValidateAll)的结果。⌋

[SWS_NvM_00394] ⌈函数 NvM_GetErrorStatus [SWS_NvM_00015] 应结合保留的块 ID 值 0 返回异步多块请求(包括 NvM_CancelWriteAll)的最新错误/状态信息。⌋

[SWS_NvM_00395] ⌈多块请求的结果应仅表示常见的错误/状态信息。⌋

[SWS_NvM_00396] ⌈NvM 模块提供的多块请求应在每个受影响的管理块的指定错误/状态字段中指示其详细的错误/状态信息。⌋

[SWS_NvM_00179] ⌈可选配置参数 NvMMultiBlockCallback 配置在异步多块请求终止时通过回调进行通知。⌋
注:有关 NvMMultiBlockCallback 的更多信息,请参见第 10.2.2 章。

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

[SWS_NvM_00180] 「每当在请求内处理 CRC 计算时,如果所引用的 NVRAM 块长度超过由参数 NvMCrcNumOfBytes 配置的字节数,NvM 模块应分多个步骤计算 CRC。」

[SWS_NvM_00351] 「对于 CRC 计算,NvM 模块应使用由 CRC 模块发布的初始值。」[SWS_NvM_00181] 「多个并发的单块请求应可排队。」

[SWS_NvM_00182] 「NvM 模块应中断异步请求/作业处理,优先处理具有即时优先级(崩溃数据)的作业。」

[SWS_NvM_00184] 「如果对 NvM 模块上的异步函数的调用导致作业队列溢出,该函数应返回 E_NOT_OK。」

[SWS_NvM_00185] 「成功将请求排队时,NvM 模块应将相应 NVRAM 块的请求结果设置为 NVM_REQ_PENDING。」

[SWS_NvM_00270] 「如果 NvM 模块已成功处理作业,应将请求结果返回为 NVM_REQ_OK。」

7.2.2.13 NVRAM 块写入保护

NvM 模块应提供不同类型的写入保护,且应是可配置的。每种写入保护仅与 NVRAM 块的 NV 部分相关,即 RAM 块数据可以修改,但不能写入 NV 存储器。

[SWS_NvM_00325]
上游需求:SRS_Mem_08009⌈当 NvMWriteBlockOnce 为 FALSE 时,无论为 NvMBlockWriteProt 配置的值(True/False)如何,都允许使用 NvM_SetBlockProtection 函数启用/禁用写入保护。⌋

[SWS_NvM_00577]
上游需求:SRS_Mem_08009⌈当 NvMWriteBlockOnce 为 TRUE 时,无论为 NvMBlockWriteProt 配置的值(True/False)如何,都不允许使用 NvM_SetBlockProtection 函数启用/禁用写入保护。⌋

[SWS_NvM_00326]
上游需求:SRS_Mem_08009⌈对于所有配置为 NvMBlockWriteProt = TRUE 的 NVRAM 块,NvM 模块应启用默认写入保护。⌋[SWS_NvM_00578] ⌈NvM 模块的环境可以使用 NvM_SetBlockProtection 函数显式禁用写入保护。⌋

[SWS_NvM_00397]
上游需求:SRS_Mem_08015⌈对于配置为 NvMWriteBlockOnce == TRUE [ECUC_NvM_00072]的 NVRAM 块,NvM 模块应仅向相关的 NV 存储器写入一次,即在 NV 设备为空的情况下。⌋

[SWS_NvM_00398] ⌈对于配置为 NvMWriteBlockOnce == TRUE 的 NVRAM 块,NvM 模块不应允许使用 NvM_SetBlockProtection 函数显式禁用写入保护。[SWS_NvM_00450]⌋

[SWS_NvM_00952] ⌈对于配置为 NVM_WRITE_BLOCK_ONCE(TRUE)的块,NvM 应拒绝在首次读取请求之前提出的任何写入/擦除/无效请求。⌋

注意:在复位的情况下,来自 NvM 管理块中配置为 NVM_WRITE_BLOCK_ONCE(TRUE)的块的写保护标志将被清除。为了重新激活保护,在处理第一个写/擦除/无效请求之前,必须先读取该块,以便仅为有效且一致的块设置写保护。第一次读取请求可以作为单个块请求进行,也可以作为 NvM_ReadAll 的一部分进行。

7.2.2.14 对 RAM 块数据的验证和修改

本章应提供有关 NVRAM 管理器状态位内部处理的汇总信息。除了位于第 8.3 章的规范项目外,还应根据不同的 API 调用描述对 RAM 块状态的影响。以下图形描绘了 RAM 块的状态转换。

image-20250331071553078

由于进入和保持某种状态可能基于多种条件,若将所有条件都放在上述图表中会难以理解,因此在以下子章节中会提供更详细的解释。INVALID/CHANGED 状态未作详细说明,因为它永远无法达到(如上述图表中所述)。初始化后,RAM 块处于 INVALID/UNCHANGED 状态,直到通过 NvM_ReadAll 进行更新,这会导致其转换为 VALID/UNCHANGED 状态。在此状态下,不允许 WriteAll。如果调用 NvM_SetRamBlockStatus,则会离开此状态。如果出现 CRC 错误,RAM 块会再次变为 INVALID 状态,然后可以通过隐式或显式错误恢复机制离开该状态。错误恢复后,由于 RAM 的内容与 NVRAM 的内容不同,该块处于 VALID/CHANGED 状态。

[SWS_NvM_00344] 上游需求:SRS_Mem_08550 「如果在配置中(通过 NvMSetRamBlockStatusApi 或 NvMBlockUseSetRamBlockStatus)已禁用用于修改 RAM 块状态的 API,当在相应的 NV 块中写入数据时,NvM 模块应将 NvM 模块中的 RAM 块或 RAM 镜像(在显式同步的情况下)视为有效且已更改,即,在 NvM_WriteAll 期间,NvM 模块应将每个永久性 RAM 块写入 NV 存储器。」

[SWS_NvM_00345] 上游需求:SRS_Mem_08550 「如果在配置中(通过 NvMSetRamBlockStatusApi 或 NvMBlockUseSetRamBlockStatus)已禁用用于修改 RAM 块状态的 API,从 NV 块读取数据时,NvM 模块应将 RAM 块视为无效,即,在 NvM_ReadAll 期间,如果相应配置,NvM 模块应将每个 NVRAM 块复制到 RAM。」

[SWS_NvM_00696] 上游需求:SRS_Mem_08550 「在块读取尝试不成功的情况下,应用程序有责任在下一次写入尝试之前提供有效数据。」

[SWS_NvM_00472] 上游需求:SRS_Mem_08541 「如果 RAM 块成功复制到 NV 存储器,之后 RAM 块状态应设置为“有效/未修改”。」

7.2.2.14.1 有效/未更改状态 VALID / UNCHANGED

此状态意味着 RAM 块的内容要么与相应 NV 块的内容相同,要么 - 如果应用程序已访问 RAM 块 - 潜在的更改尚未指示。对于 DATASET 块,这些条件适用于上次处理的实例的 RAM 内容。此外,最后的块操作成功,并且该块未应请求而无效。
要进入有效/未更改状态,至少必须发生以下情况之一:

  1. NvM_ReadAll() 成功读取该块

  2. NvM_ReadBlock 成功完成该块的读取

  3. NvM_WriteBlock 成功完成该块的写入

  4. NvM_WriteAll() 成功写入该块

在以下情况下,有效/未更改状态得以保留:
• 对 BlockID 的最后一次读或写成功(无错误且未检索默认数据)
并且
• 自上次读或写以来,应用程序未指示 RAM 块的潜在更改

7.2.2.14.2 有效/已更改状态 VALID / CHANGED

此状态意味着 RAM 块的内容可能与相应的 NV 块的内容不同。对于 DATASET 块,此条件适用于上次处理的实例的 RAM 内容。此外,该块的最后一次操作成功,并且该块未应请求而失效。块所有者可以发出信号,表示该块的 RAM 内容可能已更改,从而导致块状态变为有效/已更改。
要进入有效/已更改状态,至少必须发生以下情况之一:

  1. 针对该块调用 NvM_SetRamBlockStatus 并将其设置为 TRUE
  2. 针对该块调用 NvM_WriteBlock
  3. NvM_WriteAll 也将处理该块
  4. 针对该块调用 NvM_ReadBlock 时提供默认数据
  5. 针对该块调用 NvM_RestoreBlockDefaults 并成功完成
  6. 处理该块时 NvM_ReadAll 提供默认数据
  7. NvM_ValidateAll 成功处理该块

当以下情况时,“有效/已更改”状态会被保留:
• 块所有者已表明随机存取存储器(RAM)块可能发生更改
或者
• 在最后一次读取时为该块检索到了默认数据(隐式或显式)

7.2.2.14.3 无效/未更改状态 INVALID / UNCHANGED

此状态意味着 NV 块无效。对于 DATASET 块,这意味着对于处理的最后一个实例,NV 块的内容无效。
要进入无效/未更改状态,至少必须发生以下情况之一:

  1. 针对该块调用 NvM_SetRamBlockStatus 时传入 FALSE

  2. NvM_ReadBlock 表明用户针对该块请求无效

  3. NvM_ReadBlock 表明该块的数据已损坏(如果配置了 CRC)

  4. NvM_ReadBlock 表明该块的静态 ID 错误(如果已配置)

  5. 针对该块的 NvM_WriteBlock 操作未成功完成

  6. 针对该块的 NvM_WriteAll 写入操作未成功

  7. 针对该块的 NvM_InvalidateNvBlock 成功完成

  8. 针对该块的 NvM_EraseNvBlock 成功完成

在以下情况下,无效/未更改状态将被保留:
• 当时块的状态未知(早期初始化,直到 ReadAll 或针对给定块的首次操作请求)
或者
• 该块被检测为已损坏或具有错误的静态 ID
或者
• 该块上的最后一次成功操作是无效操作
或者
• 当前读取失败且没有默认数据
或者
• 该块上的最后一次成功操作是擦除操作

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

为了最大程度减少锁定/解锁开销或其他同步方法的使用,应用程序与 NvM 模块之间的通信必须遵循以下所述的严格步骤顺序。这确保了应用程序与 NvM 模块之间的可靠通信,避免了 RAM 块中的数据损坏,并保证了适当的同步。
这种访问模型假定在与 RAM 块的通信中涉及两方:应用程序和 NvM 模块。

[SWS_NvM_00697]⌈如果多个应用程序正在使用同一个 RAM 块,确保 RAM 块的数据完整性并非 NvM 模块的职责。在这种情况下,应用程序必须同步对 RAM 块的访问,并必须保证在 NVRAM 操作期间不会对 RAM 块进行不适当的访问(详情见下文)。特别是如果多个应用程序通过使用(不同的)临时 RAM 块共享一个 NVRAM 块,应用程序之间的同步会变得更加复杂,这也不由 NvM 模块处理。在使用回调作为通知方法的情况下,可能会出现例如某个应用程序收到通知,尽管该请求并非由该应用程序发起的情况。所有应用程序都必须遵守以下规则。⌋

7.2.2.15.1 写请求(NvM_WriteBlock 或 NvM_WritePRAMBlock)

[SWS_NvM_00698]
上游要求:SRS_Mem_00013⌈在应用程序与 NVRAM 管理器之间进行隐式同步的写请求期间,应用程序必须遵守以下规则:

  1. 应用程序使用必须由 NvM 模块写入的数据填充一个 RAM 块。
  2. 应用程序发出 NvM_WriteBlock 或 NvM_WritePRAMBlock 请求,这会将控制权转移给 NvM 模块。
  3. 从现在起,在请求的成功或失败通过信号或轮询得出之前,应用程序不应修改该 RAM 块。在此期间,可以读取 RAM 块的内容。
  4. 应用程序可以使用轮询来获取请求的状态,或者可以通过回调函数异步获取通知。
  5. 在 NvM 模块操作完成后,该 RAM 块可重新用于修改。
7.2.2.15.2 读取请求(NvM_ReadBlock 或 NvM_ReadPRAMBlock)

[SWS_NvM_00699]
上游要求:SRS_Mem_00013⌈在应用程序与非易失性随机存取存储器(NVRAM)管理器之间进行隐式同步的读取请求期间,应用程序必须遵守以下规则:

  1. 应用程序提供一个随机存取存储器(RAM)块,该块必须由 NvM 模块侧的 NVRAM 数据填充。
  2. 应用程序发出 NvM_ReadBlock 请求,该请求将控制权转移到 NvM 模块。
  3. 从此刻起,在请求成功或失败被信号通知或通过轮询得出之前,应用程序不应读取或写入该 RAM 块。
  4. 应用程序可以使用轮询来获取请求的状态,或者可以通过回调函数获得通知。
  5. 在 NvM 模块操作完成后,RAM 块可获取新数据供应用程序使用。⌋

[SWS_NvM_00700] 上游需求:SRS_Mem_08548⌈在应用程序与非易失性随机存取存储器(NVRAM)管理器之间进行恢复默认请求的隐式同步期间,应用程序必须遵守以下规则:

  1. 应用程序提供一个随机存取存储器(RAM)块,该块必须由 NvM 模块侧的只读存储器(ROM)数据填充。

  2. 应用程序发出 NvM_RestoreBlockDefaults 或 NvM_RestorePRAM-BlockDefaults 请求,这会将控制权转移到 NvM 模块。

  3. 从现在起,在请求成功或失败的信号通过轮询得出之前,应用程序不应读取或写入该 RAM 块。

  4. 应用程序可以使用轮询来获取请求的状态,也可以通过回调函数得到通知。

  5. 在 NvM 模块操作完成后,RAM 块可提供 ROM 数据供应用程序使用。

7.2.2.15.4 多块读取请求(NvM_ReadAll)

此请求仅可由 BSW 模式管理器在系统启动时触发。此请求使用启动所需的数据填充所有已配置的永久性 RAM 块。如果请求失败或仅部分成功处理请求,NVRAM 管理器会将此情况通知 DEM 并向 BSW 模式管理器返回错误。DEM 和 BSW 模式管理器必须决定采取进一步的措施。这些步骤超出了 NvM 模块的范围,并在 DEM 和 BSW 模式管理器的规范中进行处理。[SWS_NvM_00701] 「在多块读取请求期间,应用程序必须遵守以下规则,以实现应用程序与 NVRAM 管理器之间的隐式同步:
BSW 模式管理器发出 NvM_ReadAll。

  1. BSW 模式管理器可以使用轮询来获取请求的状态,或者可以通过回调函数获得通知。
  2. 在 NvM_ReadAll 期间,在完全处理完一个 NVRAM 块后,将调用单个块回调(如果已配置)。这些回调使 RTE 能够单独启动每个 SW-C。」
7.2.2.15.5 多块写入请求(NvM_WriteAll)

此请求仅应由 BSW 模式管理器在系统关闭时触发。此请求将所有已修改的永久性 RAM 块的内容写入 NV 存储器。通过仅在 ECU 关闭期间调用此请求,BSW 模式管理器可以确保在操作结束之前,没有软件组件能够修改 RAM 块中的数据。这些措施超出了 NvM 模块的范围,在 BSW 模式管理器的规范中进行处理。

[SWS_NvM_00702] 在应用程序与 NVRAM 管理器之间进行多块写入请求的隐式同步期间,应用程序必须遵守以下规则:

  1. BSW 模式管理器发出 NvM_WriteAll 请求,该请求将控制权转移到 NvM 模块。
  2. BSW 模式管理器可以使用轮询来获取请求的状态,或者可以通过回调函数得到通知。
7.2.2.15.6 取消操作(NvM_CancelWriteAll)

此请求会取消待处理的 NvM_WriteAll 请求。这是一个异步请求,可被调用以终止待处理的 NvM_WriteAll 请求。[SWS_NvM_00703]⌈NvM_CancelWriteAll 请求仅应由 BSWMode 管理器使用。⌋

7.2.2.15.7 管理块的修改
出于管理目的,每个配置的 NVRAM 块都包含一个管理块(参考第 7.1.3.4 章)。

[SWS_NvM_00704] 如果对于一个 NVRAM 块存在待处理的单块操作,则在待处理任务完成之前,应用程序不允许调用任何修改管理块的操作,例如 NvM_SetDataIndex、NvM_SetBlockProtection、NvM_SetRamBlockStatus 。

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

本小节旨在对 NVRAM 块的正常和扩展运行时准备进行简短总结。关于启动期间 NVRAM 块处理的详细行为在第 8.3.3.1 章中进行了规定。

根据两个配置参数 NvMDynamicConfiguration 和 NvMResistantToChangedSw,NVRAM 管理器在启动期间,即在处理请求 NvM_ReadAll() 时,应有不同的表现。

如果 NvMDynamicConfiguration 被设置为 FALSE,NVRAM 管理器应忽略存储的配置 ID(见 SWS_NvM_00034),并继续进行 NVRAM 块的正常运行时准备。在这种情况下,应检查 RAM 块的有效性。如果检测到 RAM 块内容无效,则应检查 NV 块的有效性。检测到有效的 NV 块应被复制到其分配的 RAM 块。如果检测到无效的 NV 块,则应加载默认数据。

如果 NvMDynamicConfiguration 被设置为 TRUE 并且检测到配置 ID 不匹配,则应为那些配置为 NvMResistantToChangedSw(FALSE) 的 NVRAM 块执行扩展运行时准备。在这种情况下,无论分配的 RAM 或 NV 块的有效性如何,都应加载默认数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

艾格北峰

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

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

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

打赏作者

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

抵扣说明:

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

余额充值