1、概述
下面的图指定了CanSM模块的行为状态机,该模块将用于每个配置的CAN网络。
上下文中经常出现的几个缩写解释
INDICATED:表示验证的意思,
WUVALIDATION 表示唤醒验证
BOR表示bus-off recovery
CC表示CAN Controller
注意哪些是Trigger,哪些是Guarding condition,哪些是Effect
2、状态步骤解析
2.1、Trigger :PowerOn
刚上电的时候,状态机应该处于CANSM_BSM_NOT_INITIALIZED
2.2、Trigger :CanSM_Init
如果请求使用CanSM_Init功能的CanSM模块,那么这将触发所有配置的CanSM状态机。
2.3、Trigger :T_START_WAKEUP_SOURCE
假设存在唤醒事件,CanSM_StartWakeUpSource应该被ECUM调用,当CanSM_StartWakeUpSource返回值为E_OK,CanSM的状态机应该进入T_STOP_WAKEUP_SOURCE。
2.4、Trigger :T_STOP_WAKEUP_SOURCE
假设存在唤醒事件,CanSM_StopWakeUpSource应该被ECUM调用,当CanSM_StopWakeUpSource返回值为E_OK,CanSM的状态机应该进入T_STOP_WAKEUP_SOURCE。
2.5、Trigger :T_FULL_COM_MODE_REQUEST
通过ComM调用接口CanSM_RequestComMode,假设ComM_Mode 等于
COMM_FULL_COMMUNICATION,应该触发状态机到T_FULL_COM_MODE_REQUEST状态,前提是对应的调用到对应的句柄参数。
2.6、Trigger :T_NO_COM_MODE_REQUEST
通过ComM调用接口CanSM_RequestComMode,假设ComM_Mode 等于
COMM_NO_COMMUNICATION,应该触发状态机到T_NO_COM_MODE_REQUEST状态,前提是对应的调用到对应的句柄参数。
2.7、Trigger :T_BUS_OFF
这个回调函数将CanSM通知一个特定的控制器的总线事件,它需要考虑对受影响的CAN网络的指定的总线恢复处理。此处理应是一个触发形式。
此处有一个回调函数CanSM_ControllerBusOff以供Canif使用,来通知上层已经发生了BusOff,假设工程仅仅包含XCP,个人觉得并不一定需要此模块,因为XCP的路线是CanIf –> XCP
2.8、Trigger :T_REPEAT_MAX
如果状态机CANSM_BSM(参考上图)在它的一个子状态机中重复了Canlf API来启动CAN网络的CAN控制器,而没有得到返回值E_OK,也没有得到假定的模式指示,这将触发状态机CANSM_BSM与T_REPEAT_MAX。
2.9、Guarding condition: G_FULL_COM_MODE_REQUESTED
Guarding condition 字面意思保护条件,个人理解是检测条件
G_个人理解是获取的意思。规范解释 如果最新接受的通信模式请求是CanSM_RequestComMode anSM_BSM的状态机应该获取状态信息G_FULL_COM_MODE_REQUESTED。
2.10、Guarding condition: G_SILENT_COM_MODE_REQUESTED
规范解释 如果最新接受的通信模式请求是CanSM_RequestComMode anSM_BSM的状态机应该获取状态信息G_SILENT_COM_MODE_REQUESTED。
2.11、Effect: E_PRE_NOCOM
Effect:效果
要使CanSM_BSM状态机的变为E_PRE_NOCOM的状态效果,需要调用相应的CAN网络API。BswM_CanSM_CurrentState对应的参数 Network = CanSMComMNetworkHandleRef (泛指参考参数)并且 CurrentState = CANSM_BSWM_NO_COMMUNICATION(确定参数就是这个)。
注意此处是CanSM调用BswM_CanSM.c里面的函数,如下。
2.12、Effect: E_NOCOM
CanSM_BSM状态机的效果E_NOCOM应改变内部存储的网络模式,当CAN网络是COMM_NO_COMMUNICATION。
2.13、Effect: E_FULL_COM
假设ECU尚未启动,应该在第一时间调用CanIf_SetPduMode接口,使响应的节点处于CANIF_ONLINE状态,此处呼应之前说的CanSM其实就是调用CanIf的接口讲法。
假设ECU启动,应该在第一时间调用CanIf_SetPduMode接口,使响应的节点处于CANIF_TX_OFFLINE_ACTIVE状态,此处呼应之前说的CanSM其实就是调用CanIf的接口讲法。
考虑到上述假设ECU尚未启动需求,需要对当前的网络节点调用ComM_BusSM_ModeIndication接口使其处于COMM_FULL_COMMUNICATION,
考虑到上一条需求,状态机到E_FULL_COM需要调用BswM_CanSM_CurrentState,使其当前状态CANSM_BSWM_FULL_COMMUNICATION
2.14、Effect: E_FULL_TO_SILENT_COM
要使状态机进入E_FULL_TO_SILENT_COM,第一时间处需要调用函数BswM_CanSM_CurrentState,根据代码个人理解上是通知BSWM,作为PRE_NOCOM之前的动作。
第二步调用CanIf_SetPduMode使通信处于CANIF_TX_OFFLIN,然后再调用ComM_BusSM_ModeIndication到COMM_SILENT_COMMUNICATION。
2.15、Effect: E_BR_END_FULL_COM
一般effect是与T和G同时出现的,在他们后面
E_BR_END_FULL_COM与E_FULL_COM一样。
2.16、Effect: E_BR_END_SILENT_COM
E_BR_END_SILENT_COM与E_FULL_TO_SILENT_COM一样。
2.17、Effect: E_SILENT_TO_FULL_COM
E_SILENT_TO_FULL_COM与E_FULL_COM一样。