AUTOSAR 网络管理

网络管理

一、名词解释

AUTOSAR : AUTOmotive Open System Architecture, 汽车开放系统架构

CAN: Controller Area Network, 控制器局域网

NM : Network Management, 网络管理

NM PDU :Network Management protocol data unit, 网络管理协议数据单元

二、主动唤醒请求

1、模块上电

初始化CanNM,进入睡眠模式(Bus-Sleep Mode),如果模块内部对网络的请求,称为主动唤醒,主动唤醒节点的网络管理报文必须先于应用报文发送,以唤醒网络。

2、Repeat Message State

(1)、NM PDU Immediate Transmit State

模块进入NM PDU 快速发送状态(NM PDU Immediate Transmit State ), 必须开启或重置 NM-Timeout Timer,以及开启 Repeat Message Timer,为了快速唤醒网络, 必须 以快速周期发送网络管理报文,同时不得发送正常周期网络管理报文,所有的应用报文 必须 在第一帧快速 NM PDU 报文发送开始后延迟 Tx_Enable_Time 才能发送 。在 NM PDU 快速发送 状态下,节点 一旦接收或发送一条网络管理报文,或者 NM-Timeout Timer 超时, NM-Timeout Timer 应该立即重置。

(2)、NM PDU Normal Transmit State

当快速周期网络管理报文发送完成后,模块进入NM PDU 正常发送状态(NM PDU Normal Transmit State ),节点 必须 以正常周期发送网络管理报文。在 NM PDU 正常发送状态下,节点 一旦接收或发送一条网络管理报文,或者 NM-Timeout Timer 超时, NM-Timeout Timer 应该立即重置。节点的网络管理状态应该保持重复报文状态一段时间,一旦超时(Repeat Message Timer 超时),网络管理状态应该离开重复报文状态。在该状态下,节点的网络管理报文和应用报文 必须 能够正常发送。

3、Normal Operation State

当网络处于请求状态(Network Requested)以及Repeat Message Timer 超时,模块进入常规操作状态(Normal Operation State),在常规操作状态下,节点一旦接收或发送一条网络管理报文,或者 NM-Timeout Timer 超时,NM-Timeout Timer 应该立即重置。在该状态下,节点的网络管理报文和应用报文 必须 正常发送。

4、Ready Sleep State

(1)在常规操作状态(Normal Operation State)下,如果网络状态切换到 Network Released,则进入准备睡眠状态(Ready Sleep State)

(2)在Repeat MessageState下,如果网络状态切换到 Network Released 及Repeat Message Timer 超时,则进入准备睡眠状态(Ready Sleep State)

节点进入准备睡眠状态后, 必须 停止发送网络管理报文,所有的应用报文在 NM Timeout Timer 超时后 必须 停止发送。

在准备睡眠状态下,节点一旦接收到一条网络管理报文,NM Timeout Timer应该立刻重置。

如果有网络请求(Network Requested),则模块会进入Normal Operation State。

5、Prepare Bus-Sleep Mode

NM Timeout Timer 超时 , 节点的网络管理状态应该进入预睡眠模式(Prepare Bus-Sleep Mode)。开启 Wait Bus-Sleep Timer。

在 预睡眠模式下,总线活动静止下来(为了清空发送缓存,允许将发送队列中的报文发出) ,最终达到总线上没有活动,ECU 通信控制器状态应处于工作模式。

在该模式下,节点的网络管理报文和应用报文禁止发送 (为了清空发送缓存,允许将发送队列中的报文发出) ,但应该对总线上的报文进行 ACK应答。

节点的网络管理状态必须保持预睡眠模式一段时间,一旦超时(Wait Bus-Sleep Timer),网络管理状态应该离开预睡眠模式,进入睡眠模式。

6、Bus-Sleep Mode

预睡眠模式时间超时(Wait Bus-Sleep Timer)后,模块进入睡眠模式(Bus-Sleep Mode),当节点没有主动网络唤醒及被动唤醒请求时,ECU 通信控制器切换至睡眠模式,ECU 功耗降低至适当水平。

在睡眠模式下,节点的网络管理报文和应用报文禁止发送。同时节点在该模式下,如果检测到有效的唤醒源,节点 必须 被唤醒。

三、被动唤醒请求

1、模块上电

初始化CanNM,进入睡眠模式(Bus-Sleep Mode),如果来自总线上其他模块对该模块的网络请求,称为被动唤醒,被动唤醒的节点,发送网络管理报文和应用报文的先后顺序无特别要求。

2、Repeat MessageState

模块进入NM PDU 正常发送状态(NM PDU Normal Transmit State ), 必须开启 NM-Timeout Timer,以及开启 Repeat Message Timer,同时所有的应用报文 必须 从节点检测到唤醒请求后延迟 Tx_Enable_Time 才能发送。

在 NM PDU 正常发送状态下,节点 一旦接收或发送一条网络管理报文,或者 NM-Timeout Timer 超时, NM-Timeout Timer 应该立即重置。

节点的网络管理状态应该保持重复报文状态一段时间,一旦超时(Repeat Message Timer 超时),网络管理状态应该离开重复报文状态。在该状态下,节点的网络管理报文和应用报文 必须 能够正常发送。

其他模式同主动唤醒请求的3456。

注意:有效的网络管理报文:是指该报文的 ID 范围在$620 到$63F 之间。

四、代码实现仅供参考

void NM_Machine_State(void)                                                                                                      {                                                                                                                                                                 switch(NM_State)                                                                                                                          {                                                                                                                                                              case  NM_UNINI:                                                                                                                          {                                                                                                                                                               NM_Initall();                                                                                                                                   NM_State = NM_INI;                                                                                                                     break;                                                                                                                                    }                                                                                                                                                     case  NM_INI:                                                                                                                               {                                                                                                                                                            if(WakeupSource == NetWakeUp)                                                                                                {                                                                                                                                                               NM_State = NM_REAPT;                                                                                                               NM_SubState = NM_SUBNORMAL;                                                                                             ResetNMTimeOutTimer();                                                                                                    }                                                                                                                                                     else if(WakeupSource == HwWakeUp)                                                                                         {                                                                                                                                                          NM_State = NM_REAPT;                                                                                                              NM_SubState = NM_SUBFAST;                                                                                                    ResetNMTimeOutTimer();                                                                                                         }                                                                                                                                                    if(!NM_INI_Parameter.NM_Time_Out)                                                                                          {                                                                                                                                                            NM_State = NM_SLEEP;                                                                                                        }                                                                                                                                                    break;                                                                                                                                      }                                                                                                                                                    case  NM_REAPT:                                                                                                                        {                                                                                                                                                               if(NM_MSG_RXindication)                                                                                                            {                                                                                                                                                            ResetNMTimeOutTimer();                                                                                                              NM_MSG_RXindication = 0;                                                                                                    }                                                                                                                                                      if(NM_INI_Parameter.NM_Reapt_Time)                                                                                        {                                                                                                                                                             switch(NM_SubState)                                                                                                                    {                                                                                                                                                               case NM_SUBFAST:                                                                                                                     {                                                                                                                                                               if(NM_INI_Parameter.NM_Fast_Transmit_Count)                                                                          {                                                                                                                                                      }                                                                                                                                                     else                                                                                                                                                 {                                                                                                                                                             NM_SubState = NM_SUBNORMAL;                                                                                     }                                                                                                                                                    break;                                                                                                                                   }                                                                                                                                                  case NM_SUBNORMAL:                                                                                                                {                                                                                                                                                              break;                                                                                                                                    }                                                                                                                                                    default :                                                                                                                                           {                                                                                                                                                              break;                                                                                                                                   }                                                                                                                                             }                                                                                                                                               }                                                                                                                                                   else                                                                                                                                                  {                                                                                                                                                               if(WakeupSource == NetWakeUp)                                                                                                  {                                                                                                                                                            NM_State = NM_READYSLEEP;                                                                                            }                                                                                                                                                     else                                                                                                                                                 {                                                                                                                                                            NM_State = NM_NORMAL;                                                                                                   }                                                                                                                                            }                                                                                                                                                      break;                                                                                                                                     }                                                                                                                                                   case  NM_NORMAL:                                                                                                                      {                                                                                                                                                              break;                                                                                                                                    }                                                                                                                                                     case  NM_READYSLEEP:                                                                                                             {                                                                                                                                                              if(NM_MSG_RXindication)                                                                                                           {                                                                                                                                                             ResetNMTimeOutTimer();                                                                                                            NM_MSG_RXindication = 0;                                                                                                   }

                   if(NM_INI_Parameter.NM_Time_Out)                                                                                            {                                                                                                                                                      }                                                                                                                                                    else                                                                                                                                                  {                                                                                                                                                              NM_State = NM_PRESLEEP;                                                                                                }                                                                                                                                                     break;                                                                                                                                       }                                                                                                                                                    case  NM_PRESLEEP:                                                                                                                  {                                                                                                                                                               if(NM_INI_Parameter.NM_WBS_Time)                                                                                         {                                                                                                                                                     }                                                                                                                                                    else                                                                                                                                                {                                                                                                                                                               NM_State = NM_SLEEP;                                                                                                      }                                                                                                                                                     if(NM_MSG_RXindication)                                                                                                             {                                                                                                                                                           NM_State = NM_REAPT;                                                                                                               NM_SubState = NM_SUBNORMAL;                                                                                             NM_Initall();                                                                                                                                   NM_MSG_RXindication = 0;                                                                                                   }                                                                                                                                                     break;                                                                                                                                       }                                                                                                                                               case  NM_SLEEP:                                                                                                                         {                                                                                                                                                                if(NM_MSG_RXindication)                                                                                                            {                                                                                                                                                             NM_State = NM_REAPT;                                                                                                               NM_SubState = NM_SUBNORMAL;                                                                                             NM_Initall();                                                                                                                                   NM_MSG_RXindication = 0;                                                                                                  }                                                                                                                                                     break;                                                                                                                                    }                                                                                                                                                    default:                                                                                                                                           {                                                                                                                                                            break;                                                                                                                                     }                                                                                                                                                 }                                                                                                                                                  }

你可能感兴趣的:(AUTOSAR 网络管理)