ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

【AUTOSAR CP】ComM模块解读

【AUTOSAR CP】ComM模块解读 前言ComM(Communication Manager)是BSW的一个组件。它是一个通信资源管理模块该模块封装了对底层服务的控制上层无需关心底层的通信细节只需要通过ComM下发Full Com或者No Com的模式请求。ComM模块控制的是与通信相关的基础软件模块即XXSMXXNM而不是软件组件SWC或者运行实体Runnable。ComM模块从Bsw/Dcm/SWC等收集总线通信访问请求并且仲裁协调这些请求。通过下图可以看到ComM模块在Autosar架构中的系统服务层。ComM模块的功能目标简化用户对通信协议栈的使用包括网络管理的处理。协调一个ECU上多个独立软件组件的总线通信协议栈的可用性允许发送和接收信号。用户无需知道硬件细节只需通过ComM请求通信模式即可实现对通道的开关。提供API接口用来禁用信号发送来防止ECU唤醒总线通信。通过对每一个通道进行状态机管理来实现ECU一个或者多个通信总线的管理。ComM通过调用BusSM来实现具体总线的状态管理。提供强制ECU进入无通信模式的选项。通过为请求通信模式用户分配所有的资源来简化资源管理。例如当有一个用户请求通信时将会检查是否允许通信并且ECU防止下电。为了更好的理解这个模块下面将会从原理和实战的角度拆解ComM模块原理将结合Autosar规范进行解读实战将会在ETAS工具链上进行拆解。模块依赖性上图为ComM模块和其他模块的交互图下面进行具体说明。RTE每一个用户都可以请求通信模式。RTE将用户的请求传递给ComM然后将通信模式指示从ComM传递给用户。EcuM负责验证唤醒事件并且当唤醒事件验证通过时发送指示给ComM模块。EcuM模块和BswM模块会一起决定和执行允许通信和Ecu下电。BswM该模块通过模式仲裁和模式控制来执行APP模式管理和整车模式管理。如果在BswM的动作列表中配置了ComM请求后用户可以通过BswM实现对ComM的请求。如果在BswM的动作列表中配置了Com_IpduGroupControlBswM将会控制PDU Group的通信。NvMComM使用NvM来存储和读取非易失性数据。NvM在上电或者reset之后必须初始化。在ComM初始化之前需要先完成NvM的初始化因为ComM初始化的时候需要确保NvM可用然后可以读出NvM中的非易失性数据。当ComM逆初始化的时候需要将非易失性数据写入NvM。Dcm该模块负责诊断PDU的调度。DcmM通过DCM_ActiveDiagnostic调用请求使ComM进入COMM_FULL_COMMUNICATION通信模式。Dcm不提供API接口启动或者停止报文发送和接收但是确保通信能力符合ComM模块的通信模式要求。LinSM该模块根据ComM的模式然后相应的控制Lin总线的实际状态。ComM模块向LIN状态管理器请求通信模式LIN状态管理器将通信模式映射为总线状态。CanSM该模块根据ComM的模式然后相应的控制Can总线的实际状态。ComM模块向Can状态管理器请求通信模式Can状态管理器将通信模式映射为总线状态。NmComM使用Nm来同步网络中通信能力的控制。Det提供有关开发、运行时和瞬态错误的报告。Com该模块被用来分配PNC使用Com的状态信息。ComM通道状态机在进行ComM通道状态机拆解之前先要介绍一下ComM的几种通信模式请求总共有COMM_NO_COMMUNICATION/COMM_SILENT_COMMUNICATION/COMM_FULL_COMMUNICATION三种通信模式。对于用户而言只允许请求COMM_NO_COMMUNICATION和COMM_FULL_COMMUNICATION两个通信模式。COMM_SILENT_COMMUNICATION模式仅用于ComM和Nm同步使用无法用于用户请求。COMM_FULL_COMMUNICATION模式下对应的通道允许收发COMM_NO_COMMUNICATION模式下对应的通道不允许收发COMM_SILENT_COMMUNICATION模式下只收不发。具体描述可以看下图。下图为ComM通道的状态机跳转可以看到除了上面提到的三个模式外另有四个子状态COMM_FULL_COM_NETWORK_REQUESTED/COMM_FULL_COM_READY_SLEEP/COMM_NO_COM_REQUEST_PENDING/COMM_NO_COM_NO_PENDING_REQUEST。下面将逐个解释三个模式及四个子状态的跳转过程。COMM_NO_COMMUNICATION模式ComM初始化完成之后将会默认进入该模式的COMM_NO_COM_NO_PENDING_REQUEST子状态此时不会通知BswM或者RTE模式变更因为RTE还未完成初始化。ComM将会调用BusSMCanSMLinSM来关闭总线收发功能。在该模式下ComMNmVariant配置参数为FULL时ComM将会请求Nm模块通过函数Nm_NetworkRelease()释放Nm。COMM_NO_COM_NO_PENDING_REQUEST子状态在该子状态下如果用户请求COMM_FULL_COMMUNICATION模式并且通信禁止被禁用。ComM状态将会立即切换到COMM_NO_COM_REQUEST_PENDING子状态。在该子状态下如果配置参数ComMNmVariantFULL|LIGHT|NONE并且DCM通过函数ComM_DCM_ActiveDiagnostic()提示DCM被激活ComM状态将会立即切换到COMM_NO_COM_REQUEST_PENDING子状态。在该子状态下函数ComM_EcuM_WakeUpIndication()被调用后并且ComMSynchronousWakeUpFALSE则该通道状态将会被切换到COMM_NO_COM_REQUEST_PENDING子状态。如果该通道为管理通道则引用的被管理通道的状态机也要切换到COMM_NO_COM_REQUEST_PENDING子状态。如果配置参数ComMSynchronousWakeUpTRUE则所有通道都有切换。在该子状态下NM模块通过ComM_Nm_RestartIndication()进行重启ComM状态将会立即切换到COMM_NO_COM_REQUEST_PENDING子状态。在该子状态下ComM_EcuM_PNCWakeUpIndication()被调用后并且参数ComMSynchronousWakeUpFALSE ComMPncSupportTRUEPNC所在的通道将会被切换为COMM_NO_COM_REQUEST_PENDING子状态。如果ComMSynchronousWakeUpTRUE ComMPncSupportTRUE所有通道将会被切换为COMM_NO_COM_REQUEST_PENDING子状态。COMM_NO_COM_REQUEST_PENDING子状态在该子状态下如果CommunicationAllowedTRUE则ComM模式将会切换到COMM_FULL_COMMUNICATION子状态。在该子状态下如果没有有效的COMM_FULL_COMMUNICATION请求子状态将会被切换回默认子状态COMM_NO_COM_NO_PENDING_REQUEST。COMM_SILENT_COMMUNICATION模式在进入该模式后ComM通道状态机应该关闭发送的能力保持接收的能力。通过调用BusSM模块的函数XXSM_RequestComMode()实现上述功能入参为COMM_SILENT_COMMUNICATION。在该模式下用户请求模式为COMM_FULL_COMMUNICATION并且通信禁止被禁用ComM通道状态机应该将状态切回COMM_FULL_COMMUNICATION。在该模式下如果参数配置ComMNmVariantFULL|LIGHT|NONE并且ComM_DCM_ActiveDiagnostic()被调用那么通道状态机应该将状态切回到COMM_FULL_COMMUNICATION。在该模式下如果NM模块通过函数ComM_Nm_BusSleepMode()显示当前进入Bus Sleep状态那么通道状态机将会切入COMM_NO_COMMUNICATION。在该模式下如果NM模块通过函数ComM_Nm_NetworkMode()通知ComM模块那么ComM模块应该切换到COMM_FULL_COMMUNICATION模式的COMM_FULL_COM_READY_SLEEP子状态下。COMM_FULL_COMMUNICATION模式在进入该模式后通道模式默认会进入COMM_FULL_COM_NETWORK_REQUESTED子状态但是如果是从COMM_SILENT_COMMUNICATION进入该模式那么通道状态将会进入COMM_FULL_COM_READY_SLEEP子状态。在进入该模式后ComM通道状态机应该打开发送和接收的能力。通过调用BusSM模块的函数XXSM_RequestComMode()实现上述功能入参为COMM_FULL_COMMUNICATION。在该模式下如果NM模块通过函数ComM_Nm_BusSleepMode()显示当前进入Bus Sleep状态那么通道状态机将会切入COMM_NO_COMMUNICATION。在该模式下如果参数配置ComMNmVariant LINSLAVE并且BusSM通过函数ComM_BusSm_BusSleepMode()显示进入BusSleep模式那么通道状态机应该将状态切回到COMM_NO_COMMUNICATION。在该模式下如果参数配置ComMNmVariant FULL|PASSIVENM模块通过函数ComM_Nm_PrepareBusSleepMode()通知ComM此时进入prepare bus sleep状态那么通道模式将会切入到COMM_SILENT_COMMUNICATION模式。COMM_FULL_COM_NETWORK_REQUESTED子状态在进入该子状态时如果参数配置ComMNmVariantLIGHT|NONE那么ComMTMinFullComModeDuration将会被启用防止在COMM_FULL_COMMUNICATION模式下频繁切换状态。在该子状态下如果是从COMM_NO_COM_REQUEST_PENDING子状态切入并且触发条件是EcuM模块通过函数ComM_EcuM_WakeUpIndication()或者ComM_EcuM_PNCWakeUpIndication()那么ComM模块应该Nm_PassiveStartup()对相应的通过进行被动唤醒。如果被唤醒的是管理通道则Nm_PassiveStartup()入参为管理通道。在该子状态下如果配置参数ComMNmVariantFULLDCM模块通过函数ComM_DCM_ActiveDiagnostic()请求COMM_FULL_COMMUNICATION模式ComM模块应该调用函数Nm_NetworkRequest()向NM发起请求。在该子状态下如果配置参数ComMNmVariantFULL用户通过函数ComM_DCM_ActiveDiagnostic ()请求COMM_FULL_COMMUNICATION模式ComM模块应该调用函数Nm_NetworkRequest()向NM发起请求。在该子状态下如果配置参数ComMNmVariantLIGHT|NONE同时满足以下几个条件ComMTMinFullComModeDuration已经超时也就是说允许状态跳转无用户调用ComM_RequestComMode()请求COMM_FULL_COMMUNICATION模式DCM模块不调用ComM_DCM_ActiveDiagnostic()那么ComM通道状态将会切入COMM_FULL_COM_READY_SLEEP子状态。在该子状态下如果配置参数ComMNmVariantLINSLAVE并且无用户调用ComM_RequestComMode()请求COMM_FULL_COMMUNICATION模式那么ComM通道状态将会切入COMM_FULL_COM_READY_SLEEP子状态。在该子状态下如果DCM模块不调用ComM_DCM_ActiveDiagnostic()通信禁止被请求那么ComM通道状态将会切入COMM_FULL_COM_READY_SLEEP子状态ComMTMinFullComModeDuration定时器停止。COMM_FULL_COM_READY_SLEEP子状态在该子状态下如果配置参数ComMNmVariantLIGHT那么ComMNmLightTimeout将会被启用。当ComMNmLightTimeout超时后ComM通道状态将会切入到COMM_NO_COMMUNICATION模式。在该子状态下如果用户请求COMM_FULL_COMMUNICATION并且通信限制被禁用ComM通道状态将会切回到COMM_FULL_COM_NETWORK_REQUESTED。在该子状态下如果配置参数ComMNmVariantFULL|LIGHT|NONEDCM模块通过函数ComM_DCM_ActiveDiagnostic()通知ComM模块ComM通道状态将会切回到COMM_FULL_COM_NETWORK_REQUESTED子模式。在该子状态下如果配置参数ComMNmVariantLIGHT并且ComM_RequestComMode(COMM_FULL_COMMUNICATION)/ComM_DCM_ActiveDiagnostic()被调用请求切换到COMM_FULL_COM_NETWORK_REQUESTED状态应取消ComMNmLightTimeout定时器。上面为针对状态机进行的状态切换过程拆解下面针对通信限制作如下三个方面的扩展说明唤醒功能禁用通过调用函数ComM_PreventWakeUp()忽略用户请求禁止总线唤醒。强制休眠用户通过函数ComM_LimitChannelToNoComMode或ComM_LimitECUToNoComMode强制某个ComM通道进入COMM_NO_COMMUNICATION模式此时ComM将会调用函数Nm_NetworkRelease释放网络管理。DCM模块通过函数ComM_DCM_ActiveDiagnostic()激活ComM通道之后调用上面的函数ComM_LimitChannelToNoComMode或ComM_LimitECUToNoComMode都无法使通道被限制通信DCM具有最高优先级。时序图Can总线唤醒下图为在ComM通道进入COMM_FULL_COMMUNICATION模式后的时序图在进入FULL COM后ComM通过函数CanSM_RequestComMode()请求CanSM打开Controller通道通信之后CanSM将模式通过函数ComM_BusSM_ModeIndication()反馈给ComM。如果是主动唤醒ComM调用函数Nm_NetworkRequest()通知NM将模式切换为CANNM_NETWORK_REQUESTED_E。如果是被动唤醒ComM调用函数Nm_PassiveStartUp()通知NM。Can被动唤醒下图为Can被动唤醒的时序图当EcuM/NM模块通过函数ComM_EcuM_WakeUpIndication()/ComM_EcuM_PNCWakeUpIndication()/ComM_Nm_RestartIndication()/ComM_Nm_NetworkStartIndication()通知ComM模块有唤醒事件ComM的子状态将会从COMM_NO_COM_NO_PENDING_REQUEST切到COMM_NO_COM_REQUEST_PENDING同时等待CommunicationAllowed被置为TRUE之后ComM通过函数CanSM_RequestComMode()打开Controller的通道此时子状态切换到COMM_FULL_COM_NETWORK_REQUESTED。针对NM Variant的不同配置值对NM的请求不同如果是Full或Passive则请求Nm_PassiveStartUp()如果是None或Light此时无网络管理功能因此启动ComMTMinFullComModeDuration定时器。Can主动唤醒下图为主动唤醒的时序图在ComM处于COMM_NO_COM_NO_PENDING_REQUEST子状态下如果有用户通过函数ComM_RequestComMode()请求COMM_FULL_COMMUNICATION模式或者DCM模块通过函数ComM_DCM_ActiveDiagnostic()通知ComM此时处于激活状态ComM的状态将会切为COMM_NO_COM_REQUEST_PENDING子状态同时等待Communication Allowed被置TRUE调用函数CanSM_RequestComMode()将Controller通道打开之后ComM模式将会切为COMM_FULL_COM_NETWORK_REQUESTED子状态之后就是根据NM Variant的配置结果执行对应的操作。如果是FULL/Passive则向NM请求状态如果是None/Light则开启定时器ComMTMinFullComModeDuration。Can网络关闭下图为Can网络关闭的时序图当没有用户请求通信和诊断激活或者禁止通信函数ComM_LimitChannelToNoComMode()被调用此时ComM的子状态将会切到ComM_READY_SLEEP然后调用函数Nm_NetworkRelease()释放NM的状态然后根据NM的状态进行状态跳转。当NM通过函数ComM_Nm_PrepareBusSleepMode()通知ComM此时NM的状态已经切为Prepare Bus Sleep时ComM会将状态切为COMM_SILENT_COMMUNICATION然后ComM通过函数Rte_Ports_UserMode_P()[n].Switch_currentMode()BswM_ComM_CurrentMode()将状态通知各个用户之后当NM通过函数ComM_Nm_BusSleepMode()通知ComM此时NM已经进入Bus sleep则ComM将模式切为COMM_NO_COMMUNICATION然后通过函数CanSM_RequestComMode()将通道关闭最后就是将模式状态通过函数Rte_Ports_UserMode_P()[n].Switch_currentMode()BswM_ComM_CurrentMode()将通知各个用户让用户执行后续操作。以上为ComM组件在Can主动唤醒Can被动唤醒Can网络关闭的时序图对于在ComM中的PNC管理由于使用场景较少笔者目前也未使用过待后续有深刻理解后再进行更新。ETAS工具链实战ComM模块配置ComMGeneral下图为ComM的通用配置可以看到大部分是和Pnc相关的重点关注ComMTMinFullComModeDuration/ComMModeLimitionEnable这两个在上面原理部分已经介绍。ComMConfigSet下面为ComM的channel的配置也就是对应的通道可以看到有EthernetClusterCANXCP等通道其中ComMNMVariant的配置将会决定ComM从COMM_FULL_COMMUNICATION到COMM_NO_COMMUNICATION的切换方式图中配置是FULL那么就要结合NM的状态变化来进行ComM模式跳转ComMNMLightTimeout在此配置下不生效ComMNMLightTimeout在ComMNMVariantLight下才会生效。ComMUserPerChannel关联的是和该通道的用户也就是后面的ComMUser。ComMUser下图为ComMUser Id。Components上面的ComM在配置完成后进行Bsw GenerateComM将会自动生成ComM的服务组件如下图所示。在上面基础上可以新建组件ASW_NM作为用户对ComM通道进行模式请求如下图所示将ASW_NM组件和ComM组件进行关联如下图所示代码生成最后生成代码总结以上为笔者关于ComM组件的原理和ETAS实战部分仅供参考如有不对的地方欢迎指教。
返回列表