存储协议栈的Error流转过程分析

电子说

1.2w人已加入

描述

前言

前面的文章我们详细分析了NvM,Fee,Fls模块以及NvM User和NvM的交互,对AUTOSAR架构下的存储协议栈应该有了一个比较深入的了解了。回头来看,站在NvM使用者的角度来看最关心的是如何使用NvM存储服务,以及使用过程中出现Error后如何快速定位和分析问题。NvM服务的使用可以参考<>一文,本文就来自低向上的分析AUTOSAR架构下存储协议栈的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,这个表格没有统计,感兴趣的朋友可以自己再去研究。

        审核编辑:彭菁

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分