电子说
前言
最近遇到一个CAN报文超时Notification不上报导致ECU不休眠的偶发问题,本文分享解决问题的思路及影响报文超时上报的机制,希望能给各位读者一点启发。
参考文档:
1. Specification of Communication AUTOSAR Release 4.3.0
本文使用的AUTOSAR配置工具为:Vector公司的Davinci
正文
1.问题描述
背景:ECU下电的两个必要条件是:本地硬线IGN == IgOff && CAN报文中的点火信号等于IgOff,如果包含点火信号的CAN报文丢失,则判断该报文是否Timeout。
问题场景描述
初始状态:IgOn,CAN报文中点火信号等于IgOn
执行动作:IgOff,直接拔掉CAN工具(等同于所有报文掉线)
问题表现:偶发ECU不能休眠下电
初步分析:ECU不能下电时的Log中显示,IgOff后点火信号一直还是IgOn且没有收到点火信号所在报文的Timeout标志。
进一步分析:点火信号所在报文的超时标志是在Com模块配置的PDU的Signal的Callout函数中置位的,也就是说问题发生的时候报文超时的Callout没有被调用。
所以该问题的直接原因就是:IGN信号所在的报文偶发报文丢失不上报Timeout。
2.尝试的复现办法
按照上诉步骤尝试20次复现问题,无论是从ECU表现(ECU休眠,电流接近为0)来看还是Debug断点调试(报文Timeout的Callout进入)来看都是正常的,无法复现问题……
思考:是不是下电流程或者某种机制导致Com的超时判断不再运行导致的,而且这个机制有效的时候正好在超时判断之前就会导致这个问题。如果是这样的话,我们把报文的超时时间配置更大,这个问题应该就会必现。
把超时时间配置为10 S,果然这个问题必现了 !
3.原因分析
Step 1: 先看下正常的ComTimeoutNotification的调用栈(方便分析是哪里出问题导致的)。
正常情况下,Com_MainFunctionRx_ComMainFunctionRx à Com_MainFunctionRxInternal à Com_RxDlMon_MainFunctionRx à Com_RxDlMon_CallTimeOutNotifications调用各个Notification
全部0条评论
快来发表一下你的评论吧 !