[AutoSar]BSW_Memory_Stack_005 NVM 队列与优先级


  

关键词

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

平台说明

项目Value
OSautosar OS
autosar厂商vector , EB
芯片厂商TI 英飞凌
编程语言C,C++
编译器HighTec (GCC)
autosar版本4.3.1

在这里插入图片描述
  
  
>>>>>>>>>>>>>>>>>>>>>>>>>回到总目录<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

  
  

缩写描述
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

一、同步和异步

  在NVM的API中,分为同步和异步调用两类,见五、同步 API 和异步 API.
同步指的是请求之后必须等到响应结果后才能向下继续执行。如:NvM_Init
在这里插入图片描述
  异步是指当SWC发出请求后,该请求进入NWM或者ECUM队列(NVM_MainFunction.ECUM_MainFunction.),不需要等待请求结果就能继续向下执行、,后续可通过查询状态API获取执行结果。

1.1 NvM_WriteBlock

在这里插入图片描述
  如上图所示,当SWC请求写block后,该NVRAM block 控制权交由NVM模块。该请求进入job队列,该NVRAM block 状态变为PENDING状态,直到该请求在队列中执行完成(失败或成功)。通过NvM_GetErrorStatus可以轮询得到执行状态,返回NVM_REQ_OK则表示执行完成并且成功。当然,也可以通过end job 回调获取状态,只需要开启下面的选项:
在这里插入图片描述

1.2 Cancellation of a Multi Block Request

  如下图所示,在EcuM 请求write_ALL后,NVRAM block 控制权交由NVM模块,请求进入job 队列。当
cancelwrite 请求发起后,NVM 会将在队列中被pending 的block 操作完成,但是队列中的下一个block则不会处理,被终止掉。如果配置了NvMMultiBlockCallback![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/12f61a98706440e5b78d38017e8971d7.png),
则会在终止writeall后产生回调,可以在回调中查询状态。

在这里插入图片描述

二、扫描顺序/优先级方案

  在异步队列处理请求中,也有优先级的划分。如果在配置中没有开启
NvMJobPrioritization,进入请求队列中的请求就会按照FCFS(First come first served) 的顺序处理。
  在执行write_block 的时候,即使选择了immediate ,一旦没有选择NvMJobPrioritization = true,实际上也是排队进行的。如果想要实现尽快写入block,则需要在NvMJobPrioritization = true的同时,配置NvMBlockJobPriority = 0,(0-255,0 (immediate priority) until 255 (lowest priority))。
  一旦开启了NvMJobPrioritization = true,就会有两个队列来处理请求。其中一条队列用于处理immediate write jobs,另一个队列用于处理其他job(including immediate read/erase jobs).队列大小在NvMSizeImmediateJobQueue和NvMSizeStandardJobQueue中配置。
  注意

  • 如果block 在队列处于 pending状态,这个时候再对此ID BLOCK 请求,则会报NVM_REQ_PENDING DET 错误。
  • 当immediate job 打断 write_all/read_all 的时候,immediate job 执行完成后会由NVM 模块恢复被打断的队列。处理immediate job ,write_all/read_all 不会被其他请求打断。
  • 对同一个block 的请求不能同时排队,例如如果对一个Block 的read 请求已经进入队列,那么对这个block 的erase 则不能进入队列。
  • 只有high priority (0)可以通过API NvM_EraseNvBlock 擦除。

在这里插入图片描述
  
  
>>>>>>>>>>>>>>>>>>>>>>>>>回到总目录<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

  • 16
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

老灰╮(╯-╰)╭

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

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

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

打赏作者

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

抵扣说明:

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

余额充值