AUTOSAR EcuM学习(二)

  • 前言

    本文以一个简化的示例看下ECU唤醒休眠的执行流程,通常不同项目因需求不同流程处理都会有所不同,本示例只是其中一种,并不是标准普适的流程。假设ECU休眠采用的是MCU掉电方式,且只有两个唤醒源:CAN和KL15,当有唤醒时两者通过线“或”的关系通知LDO/SBC给MCU上电。示意图如下:

    我们把KL15硬线作为主动唤醒源,CAN作为被动唤醒源,在EcuM中需要配置这两个唤醒源(EcuMWakeupSource),比如分别命名为EcuM_WakeupSource_KL15、EcuM_WakeupSource_CAN,对于CAN唤醒源需要指定对应的ComM通道,对于McuResetReason可以不作映射,因为我们会手动设置唤醒源。

  • 主动唤醒(KL15)

    KL15硬线拉高后触发LDO/SBC给MCU上电,开始执行初始化,当执行到StartPostOs阶段BswM已经初始化完成并且可以工作时,通过唤醒源判断调用EcuM_SetWakeupEvent(EcuM_WakeupSource_KL15)设置唤醒源为KL15。

    在本示例中可以把这一步作为进入UP阶段的前提条件之一,但如果这里存在设置无效的路径,就不适合这么做,需要在更靠后(EcuM_MainFunction运行起来)的位置进行设置。

    当进入UP阶段,各模块任务开始正常执行后,APP或BSW通过ComM_RequestComMode请求ComM进入正常通信状态(FULL_COMMUNICATION),ComM继而通过CanSM_RequestComMode请求CanSM进入正常通信状态,CanSM继续通过CanIf控制CanDrv将CAN模块设置为正常工作模式,之后,ComM通过NmIf模块(Nm_NetworkRequest)请求CanNM进入NetworkMode,至此,网络通信打开完毕。

  • 休眠过程

    当APP或BSW不再有通信需求,ComM会切换到READY_SLEEP状态,在此过程中会通过NmIf模块(Nm_NetworkRelease)请求CanNM释放网络,如果外部其它节点网络均满足休眠,CanNM切换到PrepareBusSleep状态时会通知ComM,ComM继而切换到SLIENT_COMMUNICATION,并且控制CanSM也进入静默通信,CanSM通过CanIf设置CAN模块为只收不发模式,当CanNM最终进入BusSleep状态,会再次通知ComM,此时ComM会进入NO_COMMUNICATION,并且通过CanSM及CanIf将CAN通信关闭。最后,等待其它条件(如果有的话)满足后整个ECU即可进入SHUTDOWN下电流程。

  • 被动唤醒(CAN)

    CanTrcv于Standby/Sleep模式下接收到CAN报文后,通过拉高INH通知LDO/SBC给MCU上电,当初始化执行到StartPostOs阶段BswM已经初始化且可工作时,通过唤醒源判断调用EcuM_SetWakeupEvent(EcuM_WakeupSource_CAN)设置唤醒源为CAN。

    同样的,可以把CAN唤醒也作为进入UP阶段的前提条件之一,这里由于只有两个唤醒源,硬线KL15又比较好判断(通常只要初始化完IO口即可读取状态),所以采用非此即彼的逻辑来判断是否是CAN唤醒,如果想通过检测报文来设置CAN唤醒的话,那么判断时机可能要靠后,因为检测报文的话至少要等到CanSM将Can/CanTrcv打开能够正常收取报文才行。

    还记得CAN唤醒在配置的时候指定了ComM通道,这时EcuM就会通知ComM有唤醒事件发生,和主动唤醒类似,ComM通过CanSM、CanIf、CanDrv设置CAN模块工作状态,然后再通过NmIf模块(Nm_PassiveStartUp)启动CanNM。

  • 休眠过程

    休眠过程和上面主动唤醒中的休眠过程类似,主要区别是被动唤醒下CanNM处于ReadySleep状态,不会进入Normal状态,一旦其它节点停发网络报文,CanNM的网络计时器超时后便会进入PrepareBusSleep模式,进入该模式会通知ComM,ComM会通过CanSM控制CAN工作状态,等到CanNM最后进入BusSleep后,ComM就会通过CanSM关闭CAN模块。

  • 唤醒验证(WakeupValidation)

    如果KL15硬线/CAN总线上出现干扰信号,导致LDO/SBC唤醒MCU,按照上面的做法ECU会正常启动起来然后再休眠下去,如果还有启动后维持最小执行时间一说的话,整个过程的持续时间还会更长。想要过滤掉唤醒源干扰、缩短ECU活动时间的话就可以使用唤醒验证功能。

    使用唤醒验证首先需要在配置中为唤醒源指定验证超时时间,然后在启动阶段设置唤醒源(参考前面的图示),这里就不能把唤醒源作为进入UP阶段的前提条件了,因为验证需要开启任务调度执行EcuM_MainFunction。

    EcuM_MainFucntion执行期间,对前面设置的唤醒源进行验证操作,首先通过EcuM_StartWakeupSources启动验证,这一步会做一些准备动作,比如校验CAN唤醒时,这里会通过CanSM开启CAN控制器/收发器,接着开启验证计时器,执行EcuM_CheckValidation检查唤醒源,该接口会根据实际要检测的唤醒源来调用相应模块的CheckValidation,对于CAN来讲,会调用CanIf_CheckValidation,在CanIf_CheckValidation中用户需要检测相应的唤醒源是否真实存在,如果存在就通过EcuM_ValidateWakeupEvent通知EcuM,EcuM知道是有效的唤醒后会停止验证计时器,EcuM正常运行。如果不存在有效的唤醒源,当验证计时器超时后,EcuM会知道没有唤醒源存在,通过EcuM_StopWakeupSources执行一些处理动作,比如通过CanSM关闭CAN控制器/收发器,然后EcuM执行SHUTDOWN/SLEEP动作。

  • 9
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值