前言
最近的项目负责网络管理部分,网路唤醒和ECU系统的休眠关系紧密,对系统的唤醒源事件感觉理解的不是很透彻,今天就来理一理AUTOSAR架构下的唤醒源事件。本文就先介绍AUTOSAR架构下EcuM模块管理的唤醒源事件,然后介绍每一个和唤醒源相关的接口函数及其适用场景,然后回答以下几个问题:
1.唤醒源有哪几种状态,每个状态之间是怎么切换的?
2.唤醒源会影响系统的下电/休眠流程吗?
3.断电系统,唤醒后没有Wakeup Sequences, 有 Wakeup validation sequence么?
正文
EcuM模块管理所有的唤醒源,每个唤醒源有四个状态:ECUM_WKSTATUS_NONE,ECUM_WKSTATUS_PENDING,ECUM_WKSTATUS_VALIDATED, ECUM_WKSTATUS_EXPIRED。ECU上电后(复位后)每个唤醒源处于ECUM_WKSTATUS_NONE状态。
从上图可以看出,唤醒源的每次状态切换都需要通过BswM_EcuM_CurrentWakeup接口通知到BswM模块。
ECUM_WKSTATUS_NONE切换到ECUM_WKSTATUS_PENDING或ECUM_WKSTATUS_VALIDATED状态:
唤醒源事件可以通过底层的AUTOSAR标准模块(如:Can Transceiver等)主动上报(需要配置Transceiver的唤醒源检测功能),也可以通过手写模块来轮询检测上报(不配置AUTOSAR标准模块的唤醒检测功能,全部统一由手写模块来管理)。无论是配置还是手写模块,统一使用EcuM_SetWakeupEvent接口上报唤醒源事件,EcuM模块根据该唤醒源是否配置了校验切换唤醒状态从ECUM_WKSTATUS_NONE切换到ECUM_WKSTATUS_PENDING或ECUM_WKSTATUS_VALIDATED状态。
ECUM_WKSTATUS_PENDING状态切换到ECUM_WKSTATUS_VALIDATED状态:
背景知识1:本地(如IGN硬线)唤醒源唤醒一般不配置(在EcuM模块中配置)唤醒源的校验(Validation),远程网络(如Can唤醒)唤醒源一般配置唤醒源检验。CAN网络唤醒需要配置CanTrcv和CanIf模块,且一般配置只有收到NM网络管理报文唤醒,也就是说,只有收到NM网络管理报文后CanIf才会设置一个有效唤醒源的标志Flag,EcuM的轮询检测可以通过CanIf_CheckValidation读取唤醒标致。
背景知识2:想分析唤醒事件是不是有效的总线唤醒源(网络管理报文),需要Ecu有正常的收发报文能力,想要收发报文,Transceiver和Controller两个模块均需要启动。一般来讲,Transceiver会在程序初始化时进入正常的工作模式,而Controller进入正常的工作模式是EcuM调用EcuM_StartWakeupSources的结果,而该接口为Callout函数,内部功能自定义实现,一般在EcuM_StartWakeupSources中调用CanSM_StartWakeupSource,CanSM模块会开启Can Controller。也就是说,在EcuM模块调用CanIf_CheckValidation校验唤醒源事件前,需要先调用EcuM_StartWakeupSources。
EcuM的Mainfunction中会轮询唤醒源状态,在检测到唤醒源状态切换为ECUM_WKSTATUS_PENDING后就会开启唤醒源状态校验: EcuM_MainFunction --> EcuM_CheckValidation --> CanIf_CheckValidation -->读取网路唤醒源标志 --> 如果唤醒源标志置位则调用EcuM_ValidateWakeupEvent,唤醒源头从ECUM_WKSTATUS_PENDING状态切换到ECUM_WKSTATUS_VALIDATED状态。
ECUM_WKSTATUS_PENDING状态切换到ECUM_WKSTATUS_EXPIRED:
EcuM的Mainfunction在轮询唤醒源状态时并没有检测到有效的唤醒源(通过CanIf_CheckValidation并没有读取到有效的唤醒标志,比如通过应用报文唤醒ECU后设置了WakeupEvent),在ValidateWakeup timer超时(Expired)后就会切换唤醒转到到ECUM_WKSTATUS_EXPIRED。
从其他状态切换到ECUM_WKSTATUS_NONE:
系统中调用调用了EcuM_ClearWakeupEvent接口后,唤醒源状态切换回ECUM_WKSTATUS_NONE。唤醒源的清除需要User去调用,如果是手写模块监控唤醒源的话,可以实时Set/Clear唤醒源,如果通过AUTOSAR标准模块管理唤醒源的话,在系统满足休眠条件前清除掉所有唤醒源,在进入Shutdown的判断条件中加上唤醒源都不为Pending/Valid的条件。
EcuM提供以下接口来获取唤醒源专题:
· EcuM_GetPendingWakeupEvents
· EcuM_GetValidatedWakeupEvents
· EcuM_GetExpiredWakeupEvents
通过以下接口操作唤醒源的状态:
· EcuM_ClearWakeupEvent
· EcuM_SetWakeupEvent
· EcuM_ValidateWakeupEvent
· EcuM_CheckWakeup
· EcuM_DisableWakeupSources
· EcuM_EnableWakeupSources
· EcuM_StartWakeupSources
· EcuM_StopWakeupSources
EcuM_GetPendingWakeupEvents
EcuM_GetValidatedWakeupEvents
EcuM_GetExpiredWakeupEvents
这三个接口用来获取唤醒源的状态,一般在BswM管理ECU状态中会使用,也就是上文所说的在ECU进入Shutdown/Sleep状态前会通过这几个接口来判断唤醒状态是不是都已经为NONE状态了。
EcuM_ClearWakeupEvent
EcuM_SetWakeupEvent
EcuM_ValidateWakeupEvent
这3个接口的分析见第2章节的分析
EcuM_CheckWakeup
这个接口为Callout函数,也就是内容由User自定义实现。这个函数只有深度休眠系统/EcuM走GoSleep Sequence才会用到,一般EcuM_CheckWakeup -> CanIf_CheckWakeup -> CanTrcv_CheckWakeup,CanTrcv_CheckWakeup函数中会检测收发器(TJA1043)的STB和ERR引脚来判断是否有总线唤醒事件,如果有的话吗,CanTrcv_CheckWakeup调用EcuM_SetWakeupEvent上报唤醒事件。如果配置了Check Wakeup Timeout的话,在EcuM_CheckWakeup函数中调用EcuM_StartCheckWakeup,启动相应WakeupSource的CheckWakeupTimer,如果唤醒源的检查是异步完成的(CheckWakeupTimer),CheckWakeupTimer参数是EcuM延迟ECU关闭的时间的初始值,一般不配置CheckWakeupTimer。
EcuM_DisableWakeupSources
EcuM_EnableWakeupSources
这两个接口为Callout函数,也就是内容由User自定义实现。这两个函数只有深度休眠系统/EcuM走GoSleep Sequence才会调用到。深度休眠系统需要在下电前把唤醒引脚配置为中断口,在休眠起来后把唤醒引脚的中断属性Disable,可以通过这两个Callout函数实现。也就是在EcuM_EnableWakeupSources函数Enbale唤醒引脚的INT功能,在EcuM_DisableWakeupSources函数中Disable唤醒引脚的INT功能。
EcuM_StartWakeupSources
EcuM_StopWakeupSources
这两个接口为Callout函数,也就是内容由User自定义实现。EcuM_Mainfunction在检测到唤醒源事件由ECUM_WKSTATUS_NONE切换到ECUM_WKSTATUS_PENDING状态时调用EcuM_StartWakeupSources。在EcuM_StartWakeupSources中一般判断唤醒源是网络唤醒源后调用CanSM_StartWakeupSource,CanSM最终会开启Can Controller,这样Can模块就能正常接收报文,为后面的EcuM_CheckValidation校验做好准备。EcuM_StartWakeupSources需要在EcuM_CheckValidation前调用,因为唤醒源校验需要Can Controller能接收报文
EcuM_Mainfunction在检测到唤醒源事件由ECUM_WKSTATUS_PENDING切换到ECUM_WKSTATUS_EXPIED状态时调用EcuM_StopWakeupSources。在EcuM_StopWakeupSources中一般判断唤醒源是网络唤醒源后调用CanSM_StopWakeupSource,CanSM最终会关闭Can Controller,这样Can模块就不能接收报文,为系统休眠做好准备。
问题1:唤醒源有哪几种状态,每个状态之间是怎么切换的?
答:唤醒源有ECUM_WKSTATUS_NONE, ECUM_WKSTATUS_PENDING, ECUM_WKSTATUS_VALIDATED, ECUM_WKSTATUS_EXPIRED四种状态,具体切换参考第2节。
问题2:唤醒源会影响系统的下电/休眠流程吗?
答:会。但是EcuM_Flex不会去check唤醒源的状态,需要我们自己把唤醒状态的条件加到ECU系统状态切换条件中去。根具体的说,在调用EcuM_GoDown/EcuM_GoHal前需要判断说有唤醒源是不是都已经NONE状态了。
问题3:断电系统,唤醒后没有Wakeup Sequences, 有 Wakeup validation sequence么?
答:有。EcuM的Wakeup validation sequence和断电系统或者深度休眠系统无关。
参考文档:
1.Specification of ECU State Manager AUTOSAR CP Release 4.4.0
推荐阅读
汽车电子嵌入式精彩文章汇总第一期:20210530-20230703
End
欢迎点赞,关注,转发,在看,您的每一次鼓励,都是我最大的动力!
汽车电子嵌入式
微信扫描二维码,关注我的公众号