[AutoSar]BSW_Memory_Stack_002 NVM介绍

📅 2026/8/22 12:18:39
[AutoSar]BSW_Memory_Stack_002 NVM介绍
目录关键词平台说明背景一、NVM在架构中的位置二、NVM的主要功能概述三、NVRAM block 结构四、function feature4.1 startup4.2 shutdown4.3 Error recovery4.4 Termination of a single block request4.5 Termination of a multiblock request4.6 Permanent and non-permanent RAM Blocks4.7 Data Integrity4.8 Prioritized or non-prioritized Queuing of asynchronous Requests4.9 Write Protection4.9.1 Modifiable write protection4.9.2 Write once protection4.10 Erase and Invalidate4.11 Init Block Callbacks4.12 Protect and validate NV data4.13 显示同步和隐式同步4.14 CRC Compare Mechanism4.15 Check loss of redundancy五、同步 API 和异步 API关键词嵌入式、C语言、autosar、OS、BSW平台说明项目ValueOSautosar OSautosar厂商vector EB芯片厂商TI 英飞凌编程语言CC编译器HighTec (GCC)autosar版本4.3.1回到总目录缩写描述EEPROMElectrically Erasable Programmable read only memoryNVMNVRAM ManagerMEMIFMemory Abstraction InterfaceEAEEPROM AbstractionEEPinternal/external EEPROM DRIVERFEEFlash EEPROM EmulationFLSinternal/external Flash DriverFCFSFirst come first served背景本文仅对NVM做了简单介绍只需要知道NVM提供了哪些服务和读写流程。深入介绍看后面更新链接。讲人话存储栈就是在上电的时候拷贝数据到RAM 运行中进行修改下电的时候保存或者立即保存到NV memory中。一、NVM在架构中的位置位于服务层。二、NVM的主要功能概述block 管理类型(Native, Redundant, Dataset)。CRC handling (CRC16, CRC32vector 不支持CRC8)。优先级处理包括立即(crash)数据写入。工作队列。ROM默认值(ROM默认值块Init回调)。配置ID处理。RAM block 的校验和修改。在启动的时候通过CRC重新校验RAM block。job完成回调通知。启动的时候跳过block。为SWC提供port。为DCM提供并发访问NV。为APP与NVM之间提供显示同步。为BSWM提供交互接口。三、NVRAM block 结构见1.1结构.澄清一个概念NV NVRAM 平时我们说的NV block 其实指的是NVRAM Block。写入到flash 的是 NV block。存储默认值的是ROM BLOCK。拷贝填充的目标是RAM BLOCK.存储状态信息和附加信息的是admin block。四、function feature4.1 startup1.由于ECU启动时间的严格限制NvM_Init请求不能包含已配置NVRAM块的初始化。2.ECU启动时应调用NvM_ReadAll。3.为例让DEM等依赖模块尽早使用NV应当将相关block ID 设置较高优先级0-255值越小优先级越高。4.2 shutdown1.下电的时候应该由ECUM 调用NvM_WriteAll。4.3 Error recovery见2.3 错误恢复机制.4.4 Termination of a single block request可以在下图中配置终止该block 请求时候的函数通知。4.5 Termination of a multiblock request可以在下图中配置终止该block 请求时候的函数通知。4.6 Permanent and non-permanent RAM BlocksPermanent RAM block:只能由一个APP 访问RAM block 的地址是固定的并且存储在NVM 配置中。讲人话就是在cfg中配置了RAM名字的就是永久block。non-permanent RAM Blocks由多个APP 访问RAM block 的地址不是固定的并且没有存储在NVM配置中必须提供一个指针来读写这个RAM Block。4.7 Data IntegrityNvM提供了多种策略来确保配置块的数据完整性即它可以检查从nv内存中读取的块数据是否与先前写入的数据相对应。autosar 提供了CRC MAC 来抱枕数据完整性。CRC对于每个块可以配置一个可选的CRC校验和。这个校验和可以是CRC16或CRC32。校验和将被附加到用户数据中;在NV存储器中它们将连续地存储在单个NV块中。当从rom中读取到CRC值与RAM中计算出的CRC不一致的时候将触发recovery机制。MAC对于每个块可以配置一个可选的MAC。由于NvM不实现任何MAC功能因此使用CSM模块来生成和验证MAC。生成的MAC将被附加到用户数据中并且两者都存储在nv内存中的单个块中。4.8 Prioritized or non-prioritized Queuing of asynchronous Requests读写服务都是异步服务是由NvM_MainFunction()来实现这样可以减少服务的持续时间和运行时间但是这样就造成了想要写的时候不能立即写入而是队列写入需要排队。如果配置了NvMJobPrioritization并且配置优先级为高0-255值越小优先级越高则能实现立即写入。后续单独讲job 队列和优先级关系。4.9 Write Protection4.9.1 Modifiable write protectionNVM支持对任意NV块进行写保护。API服务NvM_SetBlockProtection()用于保护和取消保护NV块。可设置初始写保护(复位后)。它将在NvM_ReadAll()期间设置。4.9.2 Write once protection有些数据只能存储一次禁止覆盖。为了实现这一点NvM为每个NvM block提供一次写入配置参数。实际的保护对用户来说是不可见的它不能被查询但是NvM将拒绝所有写/擦除请求并使对这样一个块的请求无效。4.10 Erase and InvalidateNvM_EraseNvBlock()和NvM_InvalidateNvBlock() 两个服务指定用于使NV块不可读:。NvM_InvalidateNvBlock比NvM_EraseNvBlock要快得多因为只有状态信息会失效.4.11 Init Block Callbacks初始化的时候通过回调函数提供默认值。注意在NvM_ReadAll()期间如果块配置为启用NvMUseServicePorts则不会调用初始化回调。这样做是因为在NvM_ReadAll()期间RTE尚未初始化并且回调调用可能导致DET错误。对于所有禁用NvMUseServicePorts的块回调将在NvM_ReadAll()期间无限制地调用。4.12 Protect and validate NV data在某些情况下用户可能希望在将数据写入NV RAM之前或从NV RAM读取数据之后转换数据:例如用户可能希望实现自己的CRC或MAC加密或解密和验证数据或实现旧数据检测.转换只能成对配置:要么两个回调都配置要么两个都不配置。4.13 显示同步和隐式同步见.[AutoSar]BSW_Memory_Stack_003 NVM与APP的显式和隐式同步4.14 CRC Compare Mechanism在数据写入NV前计算当前要写入的CRC与NV中已经存在的CRC是否相同如果相同则跳过不写入。缺点在于有的数据就上数据不相同但是计算出来的CRC也是一样的导致本应写入新的数据却没有写入不建议使用该功能。开启配置为4.15 Check loss of redundancy配置选项NvMCheckLossOfRedundancy可以在每个块的基础上为所有配置了数据完整性机制的冗余块启用。如果将此特性用于块则在读取请求时将检查块的两个数据实例的一致性。五、同步 API 和异步 API同步API 如下NvM_Init()NvM_SetDataIndex()NvM_GetDataIndex()NvM_SetBlockProtection()NvM_SetBlockLockStatus()NvM_SetRamBlockStatus() (for not CRC protected blocks)NvM_GetErrorStatus()NvM_GetVersionInfo()NvM_CancelJobs()NvM_CancelWriteAll()NvM_KillWriteAll()NvM_KillReadAll()异步API 如下NvM_ReadBlock()NvM_WriteBlock()NvM_RestoreBlockDefaults()NvM_EraseNvBlock()NvM_InvalidateNvBlock()NvM_SetRamBlockStatus() (for CRC protected blocks)NvM_ReadAll()NvM_WriteAll()NvM_RepairRedundantBlocks()回到总目录