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


  

关键词

嵌入式、C语言、autosar、OS、BSW

平台说明

项目Value
OSautosar OS
autosar厂商vector , EB
芯片厂商TI 英飞凌
编程语言C,C++
编译器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 memory
NVMNVRAM Manager
MEMIFMemory Abstraction Interface
EAEEPROM Abstraction
EEPinternal/external EEPROM DRIVER
FEEFlash EEPROM Emulation
FLSinternal/external Flash Driver
FCFSFirst come first served

一、定义及说明

1.1 per_instance memories(PIM)

在这里插入图片描述

   定义在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 "restoreBlockDefaults"exists.
其中:
默认值会生成
在这里插入图片描述
在这里插入图片描述
   配置同步到 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 是1:1 的映射关系,包含了RAM mirror和默认 ROM 数据,其中还包含一个nv needs。

   配置同步到 Davinci cfg中则生成一个相应的NV block,如下图所示:blcok name = component名+descriptor名。
在这里插入图片描述

   可以在下图中选择写入的触发方式:轮询或者事件触发。

二、NVM 的常用现方式

   在autosar标准中,NvM模块没有指定它的用户实际如何访问RAM block。如何实现数据的准确性,实时性和完整性是用户自己的职责。

2.1 不使用PIM 不经过RTE 访问NV block

2.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 block

2.2.1 描述

在这里插入图片描述

   如上图所示,与2.1 相比,多了一个PIM(Per_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中创建SWC

在这里插入图片描述

2.2.2.3 SWC 实现

在这里插入图片描述

2.2.2.4 创建PIM

在这里插入图片描述

2.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 NVM

2.2.3 code

2.2.3.1 NvM_Cfg.c

在这里插入图片描述

2.2.3.2 Rte.c

默认值
在这里插入图片描述

2.2.3.3 CtApDemo_1.c

在这里插入图片描述
在这里插入图片描述

2.2.3.4 CtApDemo_1.h

在这里插入图片描述
nvblock ID 定义如下
在这里插入图片描述

2.3 使用NvBlockSwComponentType

2.3.1 描述

   也就是在ASCW 和NVM 之间新增一个Non-Vlolatile Memory block 类型的NvBlockSwC。RTE 中的NvBlockSwComponent用于创建RAM。

   ASWC通过Nv Port(与Sender/Receiver Port类似)将数据传给NvBlockSwC,NvBlockSwC收到数据后再通过C/S接口去调用NvM_WriteBlock API向NvM请求写数据,再由NvM写入数据到Fls或Eep。
   当ASWC需要读取NV block 数据的时候,可以让ASWC 通过C/S port 触发NvBlockSwC调用NvM_ReadBlock 获取数据并通过NV Port 传输到ASWC。
注意:
   在dirtyFlag=TRUE的情况下,NvM_WriteBlock/NvM_SetRamBlockStatus不通过C/S请求。在dirtyFlag=FALSE的情况下,所有服务都是通过C/S请求的。
   vector 中 dirtyFlag=TRUE 指定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 interface

在这里插入图片描述

2.3.2.4 配置 NV SWC

在这里插入图片描述
在这里插入图片描述
这里注意server 还是client
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3.2.5 配置demo_1 SWC

在这里插入图片描述

在这里插入图片描述
添加触发

在这里插入图片描述

2.3.2.6 在developer 中连线或者 cfg中进行port mapping

在这里插入图片描述
在这里插入图片描述

2.3.2.7 保存并同步到cfg

参照 2.2.2.7 —2.2.2.10 解决错误并生成代码。

2.3.3 Code

2.3.3.1 CtApDemo_1.c

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3.3.2 CtApDemo_1.h

在这里插入图片描述

2.3.3.3 Rte.c
2.3.3.3.1 写入顺序

在这里插入图片描述
在这里插入图片描述
调用 NvM_SetRamBlockStatus 设置mark ,下电write all 的时候写入。
在这里插入图片描述

2.3.3.3.1 读取顺序

由于是显式同步,有一个mirror,在写入的时候会提供一个副本到mirror或者上电的时候也会通过callback 从RAM block 获取一个副本。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  
  
>>>>>>>>>>>>>>>>>>>>>>>>>回到总目录<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

  • 20
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

老灰╮(╯-╰)╭

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

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

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

打赏作者

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

抵扣说明:

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

余额充值