[AutoSar]BSW_Memory_Stack_006 NVM 的常用实现方式 (Per_instance/NVBlockSwComponent)

📅 2026/8/22 12:20:00
[AutoSar]BSW_Memory_Stack_006 NVM 的常用实现方式 (Per_instance/NVBlockSwComponent)
目录关键词平台说明一、定义及说明1.1 per_instance memoriesPIM1.2 Service NvBlockNeeds (SN)1.3 NVBlockSwComponent1.4 NvblockDescriptor二、NVM 的常用现方式2.1 不使用PIM 不经过RTE 访问NV block2.1.1 描述2.1.2 实现2.2 使用PIM 且经过RTE 访问NV block2.2.1 描述2.2.2 实现2.2.2.1 需求2.2.2.2 developer中创建SWC2.2.2.3 SWC 实现2.2.2.4 创建PIM2.2.2.5 创建server needs 并添加server port 映射2.2.2.6 创建10ms runnable 并添加C/S access2.2.2.7 保存后同步到 davinci cfg 并mapping2.2.2.8 选择memory block 对应的fee 或者EA2.2.2.9 server mapping2.2.2.10 F7 F8 生成 代码2.2.3 code2.2.3.1 NvM_Cfg.c2.2.3.2 Rte.c2.2.3.3 CtApDemo_1.c2.2.3.4 CtApDemo_1.h2.3 使用NvBlockSwComponentType2.3.1 描述2.3.2 实现2.3.2.1 需求2.3.2.2 创建NV interface 和NV SWC CtDemo_1并实现2.3.2.3 配置NV interface2.3.2.4 配置 NV SWC2.3.2.5 配置demo_1 SWC2.3.2.6 在developer 中连线或者 cfg中进行port mapping2.3.2.7 保存并同步到cfg2.3.3 Code2.3.3.1 CtApDemo_1.c2.3.3.2 CtApDemo_1.h2.3.3.3 Rte.c2.3.3.3.1 写入顺序2.3.3.3.1 读取顺序关键词嵌入式、C语言、autosar、OS、BSW平台说明项目ValueOSautosar OSautosar厂商vector EB芯片厂商TI 英飞凌编程语言CC编译器HighTec (GCC)autosar版本4.3.1参考文档AUTOSAR_SWS_NVRAMManager.pdf AUTOSAR_TPS_SoftwareComponentTemplate.pdf AUTOSAR_EXP_NVDataHandling.pdf AUTOSAR_SWS_NVRAMManager.pdf回到总目录缩写描述EEPROMElectrically Erasable Programmable read only memoryNVMNVRAM ManagerMEMIFMemory Abstraction InterfaceEAEEPROM AbstractionEEPinternal/external EEPROM DRIVERFEEFlash EEPROM EmulationFLSinternal/external Flash DriverFCFSFirst come first served一、定义及说明1.1 per_instance memoriesPIM定义在ASWC中理解为专属于这个ASWC 的RAM block 属于RAM。在生成代码中为(NvM_RamAddressType)Rte_CpDemo_1_PIM_seatposition/* NvMRamBlockDataAddress */1.2 Service NvBlockNeeds (SN)Service NvBlockNeeds 可以存在于ASWC或者NVBlockSwComponent。可以理解为一个标准NVRAM block 加上 在ASWC层级上 对BSW 的需求。其中NVM_AC3_SRBS_Defs 中AC3 Nvm API class 3.SRBS SetRamBlockStatus API used. Defs there is a rom default and additional operation restoreBlockDefaultsexists.其中默认值会生成配置同步到 Davinci cfg中则生成一个相应的NV block如下图所示blcok name swc名SN名。1.3 NVBlockSwComponent如下图所示通过davinci developer 创建component。NVBlockSwComponent 存在的目的有以下原因1.其他ASWC可以通过NV port 将RAM数据集中传到此component 集中处理类似于COM模块。2.为NVRAM 的fan_in 和fan_out 提供缓存。Fan_in /Fan_out 是指 多个ASWC对同一个NVblock 的读写。例如一个nvblock 为结构体结构体中有三个元素ASWC1 对元素1写同时ASWC2对元素2/元素3写。3.可以使多个ASWC 访问同一个NV block。4.可以防止RTE 的并发访问。1.4 NvblockDescriptor存在于NVBlockSwComponent中可以理解为一个完整的NVblock和NV block 是11 的映射关系包含了RAM mirror和默认 ROM 数据其中还包含一个nv needs。配置同步到 Davinci cfg中则生成一个相应的NV block如下图所示blcok name component名descriptor名。可以在下图中选择写入的触发方式轮询或者事件触发。二、NVM 的常用现方式在autosar标准中NvM模块没有指定它的用户实际如何访问RAM block。如何实现数据的准确性实时性和完整性是用户自己的职责。2.1 不使用PIM 不经过RTE 访问NV block2.1.1 描述最简单粗暴的一种方式在davinci cfg中的NVM 和FEE 手动配置NV block ASWC 直接通过NvM_Write/ReadBlock API进行访问。这种方式需要用户自行判定当前block 是否pending或者有错误。在标准中对这种方式强调过无法在多个ASWC 中访问同一个NV block但是实际上可以强制实现只需要包含头文件到相应SWC把NVRAM 当成一个全局变量使用。但是不建议这么玩因为没有经过RTE无法保护其并发访问时的数据没错误。2.1.2 实现参考[AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试2.2 使用PIM 且经过RTE 访问NV block2.2.1 描述如上图所示与2.1 相比多了一个PIMPer_instance 。ASWC 对nvblock 的操作都是通过Rte_Pim API 来实现的如Rte_Pim_writeblock。RTE不能保证访问每实例内存的数据一致性。APP 端负责访问数据的一致性。为了数据一致性。APP不应该在调用NvM_ReadBlock / NvM_WriteBlock之后立即访问NV数据应该直到它被通知(通过JobFinished回调)作业成功。perinstancemmemory在RTE中被分配为RAM块只能由该SW-C访问。因此相同的数据不能在两个或多个SW-C之间共享。在这个用例中“访问NVRAM块”不应该在多核环境中使用。2.2.2 实现2.2.2.1 需求创建一个ASWC CtApDemo_1一个10ms 的runnable操作一个PIM_seatposition 的PIM 和NvBlockNeed_seat_position 的needs。2.2.2.2 developer中创建SWC2.2.2.3 SWC 实现2.2.2.4 创建PIM2.2.2.5 创建server needs 并添加server port 映射2.2.2.6 创建10ms runnable 并添加C/S access添加AC3_SRBS 后可在10ms runnable 中添加invoke C/S 口。2.2.2.7 保存后同步到 davinci cfg 并mapping在davinci cfg 较老版本中需要手动进行memory mapping。而在较新版的软件中直接配置自动同步就行如下图所示2.2.2.8 选择memory block 对应的fee 或者EA一般这儿会出现unrelated 的block需要手动解决链接到FEE。2.2.2.9 server mapping确保ASWC 中的服务mapping到了NVM。2.2.2.10 F7 F8 生成 代码包括 RTE OS FEE NVM2.2.3 code2.2.3.1 NvM_Cfg.c2.2.3.2 Rte.c默认值2.2.3.3 CtApDemo_1.c2.2.3.4 CtApDemo_1.hnvblock ID 定义如下2.3 使用NvBlockSwComponentType2.3.1 描述也就是在ASCW 和NVM 之间新增一个Non-Vlolatile Memory block 类型的NvBlockSwC。RTE 中的NvBlockSwComponent用于创建RAM。ASWC通过Nv Port与Sender/Receiver Port类似将数据传给NvBlockSwCNvBlockSwC收到数据后再通过C/S接口去调用NvM_WriteBlock API向NvM请求写数据再由NvM写入数据到Fls或Eep。当ASWC需要读取NV block 数据的时候可以让ASWC 通过C/S port 触发NvBlockSwC调用NvM_ReadBlock 获取数据并通过NV Port 传输到ASWC。注意在dirtyFlagTRUE的情况下NvM_WriteBlock/NvM_SetRamBlockStatus不通过C/S请求。在dirtyFlagFALSE的情况下所有服务都是通过C/S请求的。vector 中dirtyFlagTRUE 指定RTE是否应该控制NvM函数的调用以便对可能修改的RAM进行写入和/或状态控制块代码见最后一节。建议使用显示同步也就是有一个RAM mirror的。使用这种方式可以实现多个ASWC 对同一个NV block 的读写也能保护RTE 的并发访问并抱枕数据的一致性。2.3.2 实现2.3.2.1 需求创建一个CtNvProcess 名称的 NVcomponent SWC 用于CtApDemo_1来存放 window_position 的数据用于控制车窗位置。包含属性为CtApDemo_1 每10ms存放一次数据。显式同步下电写入上电读取没有ROM block开启dirty flag true。2.3.2.2 创建NV interface 和NV SWC CtDemo_1并实现2.3.2.3 配置NV interface2.3.2.4 配置 NV SWC这里注意server 还是client2.3.2.5 配置demo_1 SWC添加触发2.3.2.6 在developer 中连线或者 cfg中进行port mapping2.3.2.7 保存并同步到cfg参照 2.2.2.7 —2.2.2.10 解决错误并生成代码。2.3.3 Code2.3.3.1 CtApDemo_1.c2.3.3.2 CtApDemo_1.h2.3.3.3 Rte.c2.3.3.3.1 写入顺序调用 NvM_SetRamBlockStatus 设置mark 下电write all 的时候写入。2.3.3.3.1 读取顺序由于是显式同步有一个mirror在写入的时候会提供一个副本到mirror或者上电的时候也会通过callback 从RAM block 获取一个副本。回到总目录