关闭

DCM模块唤醒网络是主动唤醒还是被动唤醒

发表于:2024-3-25 09:56

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:红豆沙冰    来源:焉知

  我们知道ECU的网络管理是按照AUTOSAR标准开发的话,诊断报文是无法唤醒ECU且唤醒网络的,因为CanNm状态机处于Bus-Sleep Mode的时候,因为ComM-->CanSm-->CanIf-->CanTrcv, CanDriver关闭了Can收发器和控制器,则在Bus-Sleep Mode下通信协议栈是无法收到Can报文的,诊断报文也就无法唤醒网络。但是,但CanNm处于Prepare Bus-Sleep Mode时Cantrcv和CanDriver还是没被关闭,则诊断报文是可以被通信协议栈收到的,那么CanNm处于Prepare Bus-Sleep Mode时诊断报文是可以唤醒网络的。
  那么,我们的问题来了,CanNm处于Prepare Bus-Sleep Mode时收到诊断报文唤醒网络,到底是主动唤醒还是被动唤醒了?
  这个问题的答案很容易得到,我们在CanNm处于Prepare Bus-Sleep Mode时发送诊断报文唤醒网络,看NM报文是否有快发过程就能轻易的确定是主动唤醒还是被动唤醒。
  这里直接给出答案,CanNm处于Prepare Bus-Sleep Mode时收到诊断报文唤醒网络是主动唤醒,那么为什么了?
  1.CanNm的状态机分析
  CanNm专题机从Prepare Bus-Sleep Mode切换到Nework Mode的Repeat Message State是如果是通过CanNm_PassiveStartUp()条件切换的就是被动唤醒,如果是通过CanNm_NetworkRequest()条件切换的就是主动唤醒。
  那么,DCM诊断报文使得CanNm状态机从Prepare Bus-Sleep Mode切换到Nework Mode的Repeat Message State调用的是CanNm_PassiveStartUp()还是CanNm_NetworkRequest()了?
  2.ComM的状态机分析
  CaNm处于Prepare Bus Sleep Mode时,ComM处于COMM_FULL_COM_READY_SLEEP模式,如果DCM模块收到诊断报文,则DCM模块会调用ComM_DCM_ActiveDiagnostic()这个callback函数,就会切换ComM模块状态机到COMM_FULL_COM_NETWORK_REQUESTED模式。
  ComM从COMM_FULL_COM_READY_SLEEP模式切换到COMM_FULL_COM_NETWORK_REQUESTED模式后会执行什么动作了?-- 调用Nm_NetworkRequest()函数主动唤醒网络。
  3.小结
  本文的结论容易得出,DCM模块唤醒网络是主动唤醒且是AUTOSAR规范定义的。但是,要想至下而上理清楚网络休眠和唤醒还是挺不容易的,我们需要理解CanTrcv, CanDriver, CanIf, CanNm, EcuM, ComM, Dcm这么多模块的功能及其之间的耦合关系才能真正理解。至于怎么把这么多模块理清楚还能串起来,个人是从CanTrcv开始自底向上学习各个模块,然后以报文唤醒和网络唤醒源这条线索把所有的模块给串起来的。
  你是否对车载测试感兴趣,想转行车载测试却无从下手呢?现在私聊恬恬圈/甜甜圈,或识别下方二维码,添加天天圈,了解车载测试入门吧↓↓↓
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号