一、唤醒请求
1、主动唤醒 :ECU节点有主动工作请求,通过网管报文唤醒其他节点
2、被动唤醒: ECU节点接收到其他(有主动工作请求)节点的网管报文
当主动和被动唤醒都被释放时,就需要休眠;
二、状态机
三、各模式简介及报文收发情况
NM State | substate | Send App Frame | Send Nm Frame |
BusSleep Mode | x | x | |
Network Mode | RepeatMsg state | √ | √ |
NormalOperate state | √ | √ | |
ReadySleep state | √ | x | |
PreSleep Mode | x | x |
模式详解见:https://blog.csdn.net/wteruiycbqqvwt/article/details/107618518
四、从唤醒源的角度需要注意的地方
在状态机里,网络状态从BusSleep Mode或PreSleep Mode转换到Network Mode有两种方式,函数调用上CanNm_NetworkRequest和CanNm_PassiveStartup,
CanNm_NetworkRequest是在有主动请求时,例如kl15上电,
CanNm_PassiveStartup则是收到网管报文,且没有调用CanNm_NetworkRequest时
对应的还有RepeatMsg state的两个模式,快发网管报文和正常周期发送,有主动请求时,进入重复报文状态的快发模式,(好比是领导催你干活的电话连环call,“快去干活,快去干活,快去干活”),存在被动唤醒时,进入正常周期发送网管报文,作用是告诉其他ecu,本节点已被唤醒了(被催去干活的你无奈的说“好啦,知道啦”`(*>﹏<*)′),但是如果一个节点是Passive Mode,那么节点只会接收NM报文,不会发送(纯纯苦b打工人),关于Passive Mode需要注意的是:
Autosar CANNM规范中规定对于一个节点(即一个ECU)来说,该节点内的所有网络要么都使用Passive Mode,要么都不使用Passive Mode。
五、补充
当节点只有被动唤醒:
只有被动唤醒的节点是没有对通信的“主动请求”的,可能只是被其他节点唤醒起来后有数据上的交互。所以在被NM报文被动唤醒后,从Bus-Sleep-Mode进入RepeatMsg state,而这时因为节点本身没有“ Network Requested” , RepeatMsg state停留时间满足后就会直接进入ReadySleep state,此时该节点是不会对外发送NM报文的,应用报文则正常发送;
而当节点支持主动唤醒和被动唤醒时,节点被NM报文远程被动唤醒,从Bus-Sleep-Mode进入RepeatMsg state,此时该节点需要快发NM报文后,将自己需要的参与通信的从节点唤醒,为了从节点持续维持醒着的状态,该节点在RepeatMsg state停留时间满足后就会进入NormalOperate state,持续的以正常周期向总线发送NM报文