目录
概述:
本篇我们一起看下基于CAN通信的网络管理状态机跳转过程详解,跳转过程中会调用到的常用接口。如需了解唤醒方式可看上一篇AutoSAR网络管理的唤醒方式(主动和被动)。
一、状态迁移详解
网络管理包括三个模式:Bus-Sleep Mode、Network Mode和Prepare Bus-Sleep Mode.
- Bus-Sleep Mode(BSM)
状态机处于睡眠状态,一般有两个状况:
- ECU在刚被唤醒上电进行初始化,程序还没运行到处理网络管理状态迁移的时候。
- 程序运行到下电之前,ECU准备进入休眠的时候。
检查错误帧,如果收到了错误帧则说明进入BSM
- Network Mode
网络模式是节点正常运行时处于此模式,包括三个子状态:Repeat Message State、Normal Operation State和Ready Sleep State。
- Repeat Message State(RMS)
ECU被唤醒后首先且必须经过Repeat Message State,该模式下会启动T_Repeat_Message重复消息定时器,且在进入网络模式时T_NM_Timeout计时器也启动了。
Repeat Message就是重复发送NM报文,在上一篇AutoSAR网络管理的唤醒方式(主动和被动)所提到的主动唤醒和被动唤醒的情况下要重复发送NM报文。
-
当ECU有主动唤醒需求(网络通信需求)时,ECU醒来且需要整车其它节点快速唤醒配合工作,在该情况下,ECU需要重复快速发送NM报文去唤醒其它节点。
-
当ECU有被动唤醒需求时,被总线上其它ECU节点的NM报文唤醒后,在该情况下,ECU需要发送几帧NM报文告诉其他节点我已经被唤醒了。
总的来说,在Repeat Message State状态停留的时间比较短,在T_Repeat_Message(根据客户需求定制)在超时后就需要跳转到Normal Operation State或Ready Sleep State。在Repeat Message State状态下,ECU一旦接收或发送一条NM报文,或者T_NM_Timeout超时,则T_NM_Timeout立即重置。
- Normal Operation State(NOS)
在正常运行状态中,节点要周期发送网络管理报文,发送周期为CanNmMsgCycleTime。节点网络此时处于正常工作状态。
在正常运行状态中,定时器T_NM-Timeout如果超时了要被重启。
从Repeat Message State跳转到Normal Opearation State:
- 当ECU主动唤醒进入Repeat Message State且T_Repeat_Message定时器超时,主动请求还未释放时,状态跳转到NOS。
- 当ECU被动唤醒进入Repeat Message State且在T_Repeat_Message超时前检测到主动请求,则在定时器超时后状态跳转至NOS。
从Ready Sleep State跳转到Normal Opearation State:
- 当处于RSS时检测到主动请求,状态跳转至Normal Opearation State 。
从NOS跳转到RMS: 接收到总线上NM报文的Byte1的Bit0置1时,就需要把状态跳转至RMS。
从NOS跳转到RSS:ECU进行网络释放。
注意:
- “主动请求”,当ECU处于休眠状态可被主动请求唤醒;当ECU已经处于唤醒的状态时,也是时刻在检测主动请求的。
- “网络释放”,就是这个ECU释放主动请求。
- Ready Sleep State(RSS)
当节点不再需要进行网络通讯时,应用层会调用“CanNm_NetworkRelease()”函数,释放网络,节点进入准备睡眠状态,停发网络管理报文,但要保持应用报文的发送。
从RSS跳转到NOS: 在RSS状态下,如果ECU有主动唤醒请求,可以调用CanNm_NetworkRequest()函数使节点重新回到正常运行状态。
从RSS跳转到RMS: 当节点处于RSS状态时,如果收到总线上Byte1的Bit0置1的NM报文,也会强制重新进入RMS状态。
从RSS跳转到PBSM: 当节点未接收到NM报文时间超过了T_NM_Timeout时间,ECU进入预睡眠模式。
T_NM_Timeout时间=最后一帧应用报文发出的时间 - 最后一帧网络报文发出的时间
- Prepare Bus-Sleep Mode(PBSM)
总线预睡眠状态,在这个状态下ECU停发应用报文和NM报文,但是接收NM报文且需要对总线上的报文进行ACK应答。进入该状态时,将启动T_Wait_Bus_Sleep定时器,当时间参数到达后超时,进入睡眠状态。
从PBSM跳转到RMS:检测到唤醒源,ECU自身有网络通信请求或收到其它节点的NM报文。
从PBSM跳转到BSM:未检测到唤醒源,T_Wait_Bus_Sleep超时。
WAIT_BUS_SLEEP = 第一帧错误帧的出现时间 - 最后一帧应用报文发出的时间
欢迎大家一起讨论。