电子说
前言
前面的文章我们详细分析了NvM,Fee,Fls模块以及NvM User和NvM的交互,对AUTOSAR架构下的存储协议栈应该有了一个比较深入的了解了。回头来看,站在NvM使用者的角度来看最关心的是如何使用NvM存储服务,以及使用过程中出现Error后如何快速定位和分析问题。NvM服务的使用可以参考<
缩略词:
简写 | 全称 |
DMU | Data Memory Unit |
Fls | Flash |
OPER | Flash Operation Error |
SQER | Command Sequence Error |
EVER | Erase Verify Error |
注:本公众号文章中使用了一些第三方工具和文档,若有侵权,请联系作者删除!
参考文档:
1.AURIXTC3XX_um_part1_v2.0.pdf
2. Specification of Flash EEPROM Emulation
3. Specification of Flash Driver
4.Specification of NVRAM Manager AUTOSAR CP Release 4.3.1
5.AUTOSAR架构下NVM Block连续写及Default Value问题分析
6.AUTOSAR架构下NvM模块详细分析
7.AUTOSAR架构下Fee详细分析
8.TC37x芯片FLASH基本概念介绍
9.AUTOSAR架构下Fls详细分析
10.TC3xx芯片DMU介绍
正文
1.Error自定向上分析
由于从NvM User的存储服务请求正向自定向下分析Error发生的条件和流转十分困难,我们采用自底向上的方法从底层已知Error出发向上分析Error的流转,也就是:Fls已知Error àFeeàNvMàNvM User
如下表所示,我们把自底向上分析的结果以表格的形式统计出来,通过这种方式,NvM User就能从JobResult结果查找NvM,Fee,Fls报了什么错误,也就能采用对应的应对措施。
Note:
1.该表格仅把NvM最常用的服务(读,写,擦除)可能产生的Error统计进去,像NvM Cancell这类的不常用服务没有统计进去。
2.NvM除了底层上报的错误外,本身还有很多Error处理机制,比如,调用底层接口的返回值判断等,这里错误也没有统计进去,也就是我们仅仅把NvM DMU上报的错误统计出来
3.DMU上报的Error的原因,以及对应软件的处理办法可以查看数据手册获得。具体请参考: <<TC3xx芯片DMU介绍>>
NvM User | NvM | Fee | Fls |
NvM User可以通过Block Callback获取NvM Job请求的结果, 然后根据结果执行对应的策略 |
NvM调用NvM Block配置的Callback函数JobEndCbkExtFunc_pt,传入的JobResult为NVM_REQ_NOT_OK NvM_CurrentBlockInfo_t.LastResult_t = NVM_REQ_NOT_OK |
Fee在处理Write任务时会调用Fls的Compare接口对比写入DFlash的数据和RAM缓存的数据,如果出现错误,Fee会调用NvM_JobErrorNotification Fls调用Fee_JobErrorNotification, Fee_JobErrorNotication调用FeeNvmIllegalStateNotification FeeJobResult == MEMIF_BLOCK_FAILED Note: FeeNvmIllegalStateNotification是一个Callout函数,由User实现 |
Fls执行Compare任务时发生错误,调用Fee_JobErrorNotification FlsJobResult == MEMIF_BLOCK_INCONSISTENT Note: 写入Flash的数据和RAM缓存的数据不一致 |
Fls调用Fee_JobErrorNotification, Fee_JobErrorNotification调用NvM_JobErrorNotification FeeJobResult == MEMIF_BLOCK_FAILED |
Fls擦写过程中发生了超时,调用Fee_JobErrorNotification FlsJobResult == MEMIF_BLOCK_FAILED Note: 监控擦写任务执行的时间,超时就会报错 |
||
Fls擦除过程中发生错误,调用Fee_JobErrorNotification FlsJobResult == MEMIF_BLOCK_FAILED Note: 发生OPER, EVER, SQER |
|||
Fls写数据过程发生错误,调用Fee_JobErrorNotification FlsJobResult == MEMIF_BLOCK_FAILED Note: 发生OPER, PVER, SQER错误 |
|||
Fls读数据过程发生错误,调用Fee_JobErrorNotification FlsJobResult == MEMIF_BLOCK_FAILED Note: 开启了ECC_ERROR检查,如果发生了ECC错误就会报错 |
|||
NvM调用NvM Block配置的Callback函数JobEndCbkExtFunc_pt,传入的JobResult为NVM_REQ_INTEGRITY_FAILED NvM_CurrentBlockInfo_t.LastResult_t = NVM_REQ_INTEGRITY_FAILED |
Fee在处理Read任务时发现数据不一致(比如,Block重来没有被写过)就会调用NvM_JobErrorNotification FeeJobResult == MEMIF_BLOCK_INCONSISTENT |
||
NvM调用NvM Block配置的Callback函数JobEndCbkExtFunc_pt,传入的JobResult为NVM_REQ_NV_INVALIDATED NvM_CurrentBlockInfo_t.LastResult_t = NVM_REQ_NV_INVALIDATED |
Fee在处理Read任务时发现数据是无效的就会调用NvM_JobErrorNotification FeeJobResult == MEMIF_BLOCK_INVALID |
||
NvM调用NvM Block配置的Callback函数JobEndCbkExtFunc_pt,传入的JobResult为NVM_REQ_NOT_OK NvM_CurrentBlockInfo_t.LastResult_t = NVM_REQ_NOT_OK |
Fee在处理写任务时发现写的次数已经超过该Block配置的最大写次数了就会调用NvM_JobErrorNotification FeeJobResult == MEMIF_BLOCK_FAILED |
2.数据INTEGRITY_FAILED错误示例
我们把TC3xx芯片的DFlash都擦除掉,然后通过仿真器执行重启。
Fee在处理Read任务时发现数据不一致(Block没有被写过),Fee_MainFunction会调用
NvM_JobErrorNotification通知到上层的NvM模块。
如果对应的NvM Block配置了Callback函数,NvM模块就会调用该Block的Callback函数通知到NvM_User,这样NvM User就能知道当前NvM Block的状态。
3. 总结
本文自底向上分析了存储协议栈的Error流转过程,通过本文总结的Error流转表格,我们可以方便的查找DMU操作出问题的可能原因。但是,对于NvM模块本身的一些逻辑状态上报的Error,这个表格没有统计,感兴趣的朋友可以自己再去研究。
审核编辑:彭菁
全部0条评论
快来发表一下你的评论吧 !