AUTOSAR ComM模块详解分析
1. 基础概念与架构
通信管理器模块(Communication Manager,下称 ComM)是经典 AUTOSAR 基本软件(Basic Software, BSW)中的系统服务模块,负责封装和管理底层通信服务。作为资源管理者,ComM 统筹 ECU 上多个通信总线通道的使用,通过为每个通信通道实现一个独立的状态机来控制通信能力。ComM 收集来自各“用户”(Users)的总线通信请求,并协调这些请求,从而简化上层对总线通信栈的使用。用户不需要了解底层硬件细节(例如具体使用哪一路总线通道),只需请求所需的通信模式,ComM 就会根据配置自动打开或关闭相应通道以满足请求。
ComMUser(通信用户)是 AUTOSAR 定义的 ComM 请求者抽象,可以是一个应用软件组件 (SW-C) 或 Runnable、BswM 规则、甚至 DCM 等模块。每个 ComMUser 通常映射一类通信需求,ComM 将这些用户请求转换为对特定通信通道的控制。例如,诊断管理模块 DCM 就作为一个 ComMUser,通过调用 ComM_DCM_ActiveDiagnostic()
接口来请求全通信模式(Full Communication)以保证诊断通信畅通。需要注意,ComM 内部还存在一个特殊的“系统用户”(System User),用于在无显式请求时发出默认通信请求,或在特定条件下覆盖普通用户请求,以确保系统通信需求(如关键故障时强制下线)。
ComMChannel(通信通道)是 ComM 管理的基本单元,对应于 ECU 上每一个物理通信总线(如一个 CAN 网络、一条 LIN 总线等)。每个 ComMChannel 都配置有自己的通信状态机和参数,用于管理该通道的通信模式和网络管理交互。ComMChannel 通常关联到底层的总线状态管理模块(Bus State Manager,例如 CanSM、LinSM 等)以及网络管理模块(NM)。一个 ComMChannel 可以被分配到一个或多个 ComMUser(即多个用户可能请求同一通道),也可以与一个或多个 部分网络集群(Partial Network Cluster, PNC)相关联。在配置上,一个用户可以直接控制一个通信通道,也可以通过控制某个 PNC 来间接影响多个通道,但标准规定不应将同一用户同时直接绑定通道和绑定 PNC(实际工具可能不报错但应避免这样的配置)。
图 1:AUTOSAR 部分网络集群(PNC)的逻辑概念示意图。实线黑线表示物理总线(如 CAN)将 ECU A、B、C、D 相连。然而在功能上,可将 ECU A 和 B 分为一组(PNC1),ECU B、C、D 分为另一组(PNC2)。这样物理总线被划分成两个虚拟的小组,每组内的节点要么同时处于唤醒状态,要么同时休眠。PNC(Partial Network Cluster,部分网络集群)提供了一种根据功能将网络中的节点划分子网的机制,实现“需要时一起唤醒,不需要时一起沉睡”,从而达到精细的节能控制。
部分网络集群 (PNC) 是 AUTOSAR 为支持局部网络管理引入的概念,它将整车网络按功能划分为若干逻辑子集,使得某功能相关的ECU只在需要时才唤醒通信。PNC 本质上是虚拟的“局部网络”:同一 PNC 内的所有 ECU 要同时处于通信活跃或同时休眠,从而在保证功能的前提下关闭无关ECU的通信以节省能耗。例如,在图1所示的示例中,PNC1 包含 ECU A 和 B,两者相关功能需要同步;PNC2 包含 ECU B、C、D,是另一功能组。通过 PNC 机制,ECU B 参与了两个 PNC,可根据不同功能需求灵活决定自身通信状态。需要强调的是,PNC 并不等同于物理分网,而是建立在网络管理报文中的PN信息位上,由各节点协同管理的逻辑概念。
ComM 模块在AUTOSAR系统架构中的位置和交互关系如图2所示。ComM 位于服务层,向上通过 RTE 提供接口供用户调用,向下通过接口调用各总线的状态管理(如 CanSM 等)和网络管理(如 CanNm 等)模块,以控制总线的通信状态。同时,ComM 也与 ECU 状态管理器 (EcuM)、基本软件模式管理器 (BswM) 等模块交互:EcuM在系统唤醒时会验证唤醒源并通知 ComM;BswM 则接受 ComM 的通信状态指示,并可根据策略请求 ComM 改变通信模式或控制信号的发送。ComM 还利用 NVRAM 管理器 (NvM) 存储抑制状态、PNC 动态映射等非易失数据,使用 默认错误追踪器 (Det) 报告开发期错误,以及依赖 调度器 (SchM) 周期调用其主函数 (ComM_MainFunction
)。这些模块依赖关系总结如下:
- RTE(运行时环境):将应用层(SW-C或脚本)的通信模式请求传递给 ComM,通过 Mode Switch 或 Client/Server 接口向上报告 ComM 模式状态。
- EcuM(ECU 状态管理):在ECU收到唤醒源后进行验证,并调用
ComM_EcuM_WakeupIndication()
或ComM_EcuM_PNCWakeUpIndication()
通知 ComM 有效唤醒事件。EcuM 还负责整体启动和休眠流程管理,协调ComM在休眠阶段的行为。 - BswM(基本软件模式管理):接收 ComM 通道状态和 PNC 状态变化的指示(ComM 调用
BswM_ComM_CurrentMode
和BswM_ComM_CurrentPNCMode
通知)。BswM 可基于配置策略请求 ComM 切换通信模式(BswM 也可被配置为一个 ComMUser 来请求模式)。另外,在采用 EcuM-Flex 模式时,BswM 还负责通知 ComM 当前通信是否被允许,即控制 ComM 的 CommunicationAllowed 状态(通常通过BswM_AllowComm
机制)。 - Bus State Manager(总线状态管理,例如 CanSM、LinSM 等):ComM 通过调用如
CanSM_RequestComMode(Channel, mode)
等接口请求底层总线进入指定模式(No Communication/Silent/Full)。总线状态管理模块实际执行对物理总线控制器的启停操作,并在完成后通过回调ComM_BusSM_ModeIndication(Channel, mode)
通知 ComM 当前总线通信状态。 - NM(网络管理):ComM 与网络管理模块协同,实现全车网络的同步唤醒和休眠。对于 全变体网络管理(NM Variant = Full),ComM 在请求 Full Communication 模式时,会调用如
CanNm_NetworkRequest()
使本节点网络管理报文定期发送,从而唤醒网络。当总线进入总线休眠或准备休眠状态时,网络管理模块通过回调(如ComM_Nm_NetworkMode
/BusSleep
/PrepareBusSleep
等)告知 ComM,对应通道状态机再进行状态转换。此外,ComM 和 NM 通过交换 PNC 位图(PNC bit vector)实现部分网络的请求状态传播,这部分在后续章节详述。 - 其他模块:DCM 作为 ComMUser 发出诊断会话需要 FullComm 的请求;NvM 存储 ComM 抑制标志、计数器以及动态PNC映射等配置持久信息;Det 则用于在开发阶段捕获如未初始化调用、参数错误等问题(ComM 内部定义了各API对应的服务ID和错误码,通过 Det 上报错误)。
通过以上架构,总结 ComM 的设计初衷主要有几点:
- 多通道通信管理:ComM 为每个物理通信总线(通道)配置独立状态机,统一协调多个通道的开启/关闭,从而屏蔽应用对多通道并存的复杂性。应用只需请求通信模式,ComM 会相应地请求各总线管理模块改变状态。
- 简化网络管理处理:ComM 封装了网络管理(NM)的交互细节,例如网络唤醒请求、总线休眠同步等,让上层无需直接操作 NM。同时 ComM 提供抑制网络唤醒和强制无通信模式的接口,可以在故障或特殊情况下防止不必要的网络活动。
- 资源共享与防休眠:当有任一 ComMUser 请求 Full Communication 时,ComM 会确保相关通道保持唤醒,不进入休眠;在通信进行时还能防止 EcuM 提前关闭ECU电源,从而保证通信过程完整。换言之,ComM 协调多个独立软件部件对总线通信资源的访问,避免冲突并防止因某些部件未请求而导致其他需要通信的部件被迫下线。
- 支持部分网络:ComM 提供 PNC(部分网络)扩展,可选地允许用户请求维持某一组ECU的通信不休眠。通过 PNC 机制,实现跨网络的唤醒控制和节能(例如只唤醒涉及某功能的ECU),详细原理在第四章阐述。
综上,ComM 在架构上扮演着通信模式仲裁者和网络管理协调者的角色:向上统一接受通信请求,向下合理驱动各总线通讯,并结合网络管理策略(PNC、网络唤醒等)优化整车通信行为。
2. 接口与服务函数详解
ComM 模块对外提供了一组API接口和RTE通信端口,用于初始化、模式请求、状态查询以及抑制控制等功能。每个接口的用法、调用关系及服务ID等规范详见AUTOSAR SWS。下面按照功能分类对主要接口进行详解:
2.1 初始化与主函数
- _ComM_Init(const ComM_ConfigType ConfigPtr)_* – 初始化接口。用于初始化通信管理器,必须在启动时调用。ConfigPtr 指向 ComM 的配置数据结构,一般由配置工具生成(包含所有通道、用户、PNC配置和定时参数等)。调用该函数将:
- 校验参数有效性(ConfigPtr 非空等),无效则报告
COMM_E_PARAM_POINTER
开发错误。 - 将 ComM 内部状态标记为已初始化(COMM_INIT),并初始化内部数据(如通道状态、PNC状态、计时器等)为默认值。
- 读取 NvM 块(如配置了)以恢复上次关机时保存的抑制状态、PNC动态映射信息等。
服务ID: ComM_Init 的服务ID通常定义在 ComM_cfg.h 中(如
COMM_INIT_SERVICE_ID
)。根据 AUTOSAR 规范约定,它是一个唯一的 hex 常数,用于 DET 错误报告识别该服务。例如在某版本中 ComM_Init 的 Service ID 为 0x01(十六进制)。 - 校验参数有效性(ConfigPtr 非空等),无效则报告
- ComM_DeInit(void) – 反初始化接口。可选调用,用于将 ComM 恢复未初始化状态。典型实现中,会将所有通道置为 No Communication 模式并停止 ComM 的周期调度。如未明确需要,一般很少调用此接口。调用后再使用 ComM 需重新 Init。
- ComM_MainFunction_xxx(void) – 主状态机函数。ComM 根据配置可能有一个或多个主函数(如每个通道一个,或合并在一个函数中)。必须由 SchM(调度器)或 OS 定期调用它们(典型周期10ms),用于驱动 ComM 内部的状态机和计时器运行。主函数会检查用户请求变化、定时器超时、网络管理状态并触发相应状态转换。调度频率应满足 ComM_NmLightTimeout 等参数的时间精度要求。如果某通道未配置 NM,则其状态机也在主函数内处理直至进入通讯就绪或休眠。
- _ComM_GetVersionInfo(Std_VersionInfoType versionInfo)_* – 版本信息查询。用于获取 ComM 模块的版本号等信息,一般用于验证库版本。versionInfo 返回包括模块ID、Vendor ID、AR规范版本和软件版本。调用前需确保 ComM 已初始化,否则会报告
COMM_E_UNINIT
错误。
2.2 通信模式请求与查询
- ComM_RequestComMode(ComM_UserHandle user, ComM_ModeType mode) – 请求通信模式。这是 ComM 最核心的API之一,由“用户”调用,用于请求或释放通信能力。第一个参数是 ComMUser 标识(在配置中定义,每个User有唯一ID或句柄),第二个参数是请求的模式:
COMM_FULL_COMMUNICATION
全通信模式:请求开启通信(发送和接收均可)。如果成功,ComM 会确保相关通道最终进入 Full Communication状态,使总线消息可收发。COMM_NO_COMMUNICATION
无通信模式:请求关闭通信。不再发送(也不接收)应用消息。ComM 将协调进入总线休眠。- (注:COMM_SILENT_COMMUNICATION 静默模式属于内部模式,用户不可通过此API直接请求。)
用户调用 ComM_RequestComMode 后,ComM 内部将记录该用户的请求状态,并与其他用户请求综合决定通道状态机的目标模式。例如,当任意一个绑定到通道A的用户请求Full时,通道A应保持唤醒;只有当所有用户都不要求通信时,通道才能进入无通信休眠。
调用关系上,应用SW-C通常通过 RTE 的 Client-Server 端口调用此函数。例如 RTE 生成的接口可能为Rte_Call_<ComMUser>_RequestComMode(FULL_COMMUNICATION)
。而 BswM 也可以作为 ComMUser 在特定场景调用该函数,典型用例如接收到开关信号后请求ComM上线通信。
服务ID: ComM_RequestComMode 的 Service ID 常见为 0x03(取决于版本)用于错误报告。如果 ComM 尚未初始化调用此函数,会报告
COMM_E_UNINIT
;如果参数非法(如无效的用户ID或模式)则报COMM_E_WRONG_PARAMETERS
。 - _ComM_GetCurrentComMode(ComM_UserHandle user, ComM_ModeType mode)_* – 查询当前通信模式。用于获取特定用户所对应通道当前所处的模式。通过输出参数 mode 返回
COMM_FULL_COMMUNICATION
/COMM_NO_COMMUNICATION
/COMM_SILENT_COMMUNICATION
之一。需要注意,Silent模式作为内部状态,一般只有当通道正处于关闭过程(Ready Sleep)时查询才可能获得。调用此接口可让应用知道当前通信是否可用,从而决定后续动作(如是否发送某些信号)。若 ComM 未初始化直接调用,则同样会报COMM_E_UNINIT
错误。 - _ComM_GetMaxComMode(ComM_UserHandle user, ComM_ModeType mode)_* – 查询最大允许模式。这个接口返回给定用户在当前限制条件下所允许的最高通信模式。如果没有抑制,通常返回 FULL_COMMUNICATION;如果该用户或通道正被限制为 No Communication(见下文抑制),则返回 COMM_NO_COMMUNICATION。应用可以通过对比当前模式和最大模式判断是否有抑制生效。
- ComM_ModeSwitch通知接口:ComM 通过 RTE 提供 Mode Switch 接口(如
ComM_CurrentMode
),用于向绑定该接口的 SW-C 发送通信模式状态的切换通知。例如,某SW-C可以订阅 ComMUser 对应的 CurrentMode,当通道状态变化时RTE会调用SW-C的 ModeSwitch indication,让应用感知模式变化。这种方式常用于让应用层知道总线何时上线或下线,可以执行相应逻辑(如启动/停止发送周期消息等)。
2.3 通信抑制与禁止唤醒
ComM 提供了一系列接口来实现通信抑制功能,即在特殊情况下限制或禁止通信,以避免干扰或节能目的。这些抑制状态通常由故障处理SW-C或诊断服务发起,并影响 ComM 的模式决策:
- ComM_PreventWakeUp(NetworkHandle channel, boolean status) – 总线唤醒抑制控制。当 status=TRUE 时,设置指定通道禁止由本ECU的请求唤醒总线。典型场景如某传感器ECU故障时可能无意发送消息导致网络唤醒,此时SW-C可调用该接口防止该通道被激活。PreventWakeUp 状态通常存储在 NvM 中以在重启后保持。一旦某通道设置了唤醒抑制,则用户对该通道请求 Full Communication 将被 ComM 拒绝,即 ComM 会返回
COMM_E_MODE_LIMITATION
错误。当故障解除后,应调用 ComM_PreventWakeUp(..., FALSE) 清除抑制,恢复正常通信能力。 - ComM_LimitChannelToNoComMode(NetworkHandle channel, boolean status) – 通道无通信模式限制。当status=TRUE时,强制将指定通道限制在 COMM_NO_COMMUNICATION 模式。即使有用户请求Full Comm,ComM也不会执行(相当于忽略用户请求)。这一接口可用于在特定场景下(如节能模式或紧急情况)暂时关闭整个通道的通信功能。类似地,还有 ComM_LimitECUToNoComMode(boolean status) 可一次性限制整个ECU上所有通道的通信。需要注意,限制生效期间,对应用户请求会被拒绝或挂起,并可能返回
COMM_E_MODE_LIMITATION
状态给调用者。解除限制需要再次调用接口设置FALSE。另有配置项 ComMModeLimitationEnabled 控制该功能是否启用。 - _ComM_GetInhibitionStatus(NetworkHandle channel, ComM_InhibitionStatusType status)_* – 查询抑制状态。通过此接口可以获知某通道当前有哪些抑制激活。返回的 status 是按位标志,包括 ComMNoWakeUp(禁止唤醒)和 ComMLimitToNoCom(限制无通信)两位。如果相应位为1表示该抑制有效。应用或调试时可用此信息判断为何通信无法上线。
- ComM_ResetInhibitionCounter() / ComM_ReadInhibitionCounter() – 抑制计数器复位/读取。这些接口是可选的测试接口,用于记录和控制“被抑制的 FullComm 请求次数”。某些项目可能需要统计有多少次用户请求因抑制而未能成功上线通信。ComM 可配置启用一个计数器,每当因为抑制拒绝FULL请求时+1。通过 Read接口可以读取计数,通过 Reset接口清零。这些接口通常用于诊断服务或调试。
注意:通信抑制功能在激活诊断会话时会被临时忽略。也就是说,当 DCM 指示处于活动诊断(ComM_DCM_ActiveDiagnostic)时,为确保诊断通信可靠,ComM 将暂时解除唤醒抑制和模式限制,优先保证通信上线满足诊断需求。诊断会话结束(ComM_DCM_InactiveDiagnostic)后,再恢复之前的抑制状态。因此,当遇到通信在诊断模式下意外上线的情况,这是设计使然,用于保证诊断工具的通信。
2.4 诊断通信相关接口
- ComM_DCM_ActiveDiagnostic(NetworkHandle channel) – 诊断激活通知。DCM模块在进入某些活动诊断会话时调用此函数,通知 ComM 当前通道需要保持 Full Communication,用于诊断通信。ComM 接收到该指示后,会将对应通道标记为“诊断活动”,通常视同有一个内部用户请求全通信,从而保持通道不休眠。同时,如上所述,会暂时忽略通信抑制限制,以免影响诊断。典型情况下,DCM 在进入编程或扩展会话时调用 ActiveDiagnostic,在退出时调用 InactiveDiagnostic。
- ComM_DCM_InactiveDiagnostic(NetworkHandle channel) – 诊断停止通知。当诊断会话结束或不再需要保持总线唤醒时调用。ComM 接收后清除通道的诊断活动标志。如果此时没有其他用户请求该通道,且无其他唤醒保持因素,ComM 可能允许通道进入休眠。需要注意的是,如果应用曾通过 ComM_RequestComMode 请求保持通信,则即使诊断结束也不会立刻下线。
这些接口确保了诊断 ECU在执行重要会话(如刷写)时不会因为节能策略而中断通信。同时也避免诊断消息被通信抑制策略阻断。
2.5 部分网络(PNC)相关接口
为了支持部分网络集群(PNC)的状态管理,ComM 与 NM 模块之间以及ECU内部定义了一系列接口和信号:
- _ComM_Nm_UpdateEIRA(uint8 Channel, const uint8 EIRA_BitVector)_* – 更新外部和内部请求数组。该接口由网络管理模块(如 CanNm)在收到新的 EIRA 位图时调用,通知 ComM 某通道的外部+内部请求状态。EIRA(External and Internal Request Array)是长度为 PN位数的比特数组,每一位对应一个PNC,表示当前网络中针对该PNC的综合请求状态(包括其他ECU的请求和本ECU内部请求)。当某ECU收到网络管理报文,其中包含PNC信息(User Data)时,CanNm 提取出这些比特,形成 EIRA,然后调用 ComM_Nm_UpdateEIRA 将数据传给 ComM。ComM 会据此更新内部记录的“外部请求”状态,并驱动相应 PNC 状态机的转换(例如某PNC的某位从0变1表示有新的外部请求,则该PNC应转入 FULL_COMMUNICATION)。
- _ComM_Nm_UpdateERA(uint8 Channel, const uint8 ERA_BitVector)_* – 更新外部请求数组。在 网关ECU 的场景下使用。ERA(External Request Array)表示外部请求状态,不含本ECU的内部请求。对于充当PNC网关的ECU,其连接的每个网络都有一个ERA。当网关ECU在一个网络上收到PN请求,需要将该请求“镜像”转发到另一网络时,会调用 ComM_Nm_UpdateERA,将ERA位图提供给 ComM。ComM 将ERA与本地IRA合并计算新的EIRA,再在必要时向其他网络发送PNC请求。简单来说,UpdateERA用于通知ComM“来自其他网络的PNC请求”,从而触发网关功能。非网关的ECU通常不使用ERA,只有EIRA即可满足需求。
- ComM_EcuM_WakeUpIndication(NetworkHandle channel) – 总线唤醒指示。当 ECU 检测到某通信通道有硬线唤醒或网络报文唤醒事件,并由 EcuM 验证为有效唤醒源后,EcuM 调用此接口通知 ComM。ComM 据此知道该通道有唤醒发生,即使本地没有用户请求,也应进入通信模式(通常通过 BswM 逻辑最终会触发 ComM_RequestComMode 由系统用户请求FullComm)。如果该通道关联了一个或多个 PNC,ComM 也将相应更新PNC状态(可能进入 FULL_COMMUNICATION 或 READY_SLEEP 等,具体取决于配置的同步唤醒策略)。
- ComM_EcuM_PNCWakeUpIndication(PNCHandle PncId) – PNC唤醒指示。用于通知 ComM 某个 Partial Network Cluster 被作为唤醒源触发了(OpenAPI TC10 定义)。当 EcuM 检测到唤醒源属于某PNC时调用。ComM 会将对应 PNC 状态机切换到 FULL_COMMUNICATION(标记为本地请求),并通过更新 IRA/EIRA 确保相关通道被唤醒。如果该PNC涉及网关,还需进一步通过ERA转发。
- _ComM_GetCurrentPNCMode(PNCHandle PncId, ComM_PncModeType PncMode)_* – 查询 PNC 当前模式。类似于查询通道模式,用于获取指定 PNC 的当前状态。PncMode 返回 COMM_PNC_FULL_COMMUNICATION 或 COMM_PNC_NO_COMMUNICATION 等,以及可能的子状态(REQUESTED, READY_SLEEP 等)。这接口通常由 BSW 管理层或诊断使用,以了解某功能组的网络状态。
- ComM_RequestPncMode(PNCHandle PncId, ComM_PncModeType mode) – 请求 PNC 模式。部分高版本标准中可能定义,用于本地请求一个PNC唤醒或休眠。相当于由系统某处代表一组功能发出请求,ComM 接收后会向所有相关通道发PNC请求(通过 Com_SendSignal 发送ERA/EIRA)或者撤销请求。实际上,AUTOSAR更建议通过 ComM_RequestComMode 由用户关联PNC的方式控制PNC,因此直接提供RequestPncMode的用法不多见。
- ComM_PncReleaseInactive() – PNC释放通知(可选接口):当一个PNC长时间无请求达到超时时,ComM 可调用此接口通知其它模块(如 BswM)PNC已进入休眠。这通常配合同步PN关断(Synchronized PNC Shutdown)使用。
信号接口:除了上述函数式接口,ComM 与 COM 模块还通过配置专用信号进行 PNC 信息交换。当 PN 功能启用时,需要在 COM 配置 PNC开关信号,典型包括:
- ERA_Rx_Signal / EIRA_Rx_Signal:接收信号,由 PduR 从网络管理报文提取后送入 COM。的描述表明,网络管理消息User Data被作为PDU送至 PduR,再拆成 ERA 和 EIRA 信号,存入缓冲区供 ComM 读取。
- ERA_Tx_Signal / EIRA_Tx_Signal:发送信号,ComM 更新PNC状态后,通过调用
Com_SendSignal
写入这些信号,供网络管理报文的User Data发送。例如ComM在某PNC有本地请求时,会设置相应 EIRA 信号的bit位=1,然后NM模块组装报文发送给网络上其他ECU。
ComM 通过 COM 的标准接口 Com_ReceiveSignal()
读取 ERA/EIRA 接收信号中的PNC位,并通过 Com_SendSignal()
更新ERA/EIRA发送信号。BswM 则监视 ComM 的 PNC状态指示,并控制相关 PDU 组的使能/禁止。例如,当某PNC从无通信转为通信激活时,BswM 可以打开该PNC对应的一组I-PDU(这些I-PDU承载该功能相关的应用信号),从而恢复通信;当PNC休眠时则关闭这些I-PDU组以节能。这一机制通常称为“信号组激活”:利用 BswM 根据 ComM状态执行 Com_IpduGroupControl
等操作,实现按PNC动态地启停一组消息传输。
图 2:PNC信息在网络中传递的数据流示意图。网络管理报文(CanNm)User Data中携带PNC位图。接收端ECU首先经由 CanIf 和 CanNm 处理报文,若检测到控制位向量(CBV)的 PNI位=1,则表示报文中包含有效的PNC信息;否则PNC位图被视为无效,上层当作未收到该PNC请求。当PNC信息有效时,NM通过 PduR 将NM报文的 User Data 提供给 COM 层,并拆分为 EIRA 和 ERA 信号存入缓冲。随后 ComM 调用 Com_ReceiveSignal
读取这些信号,更新内部 PNC请求状态,并调用 BswM_ComM_CurrentPncMode
通知 BswM 该PNC激活。对于网关节点,ComM 还会将收到的ERA通过 ComM_Nm_UpdateERA
转发到其他网络,并使用 Com_SendSignal
设置本网络ERA发送信号,以在该网络的NM报文中通告PNC请求。这样,实现了跨总线的部分网络请求传播。
2.6 服务ID与错误代码
AUTOSAR 规范为 ComM 的每个接口都分配了唯一的服务ID(Service ID)常量,用于在调用 Det_ReportError 时标识是哪一个API出错。例如,典型地 ComM_RequestComMode
的 Service ID = 0x03,ComM_GetCurrentComMode
= 0x04,ComM_PreventWakeUp
= 0x0F 等(具体值可查阅对应 SWS)。这些 Service ID 在 ComM 开启开发错误检测(ComMDevErrorDetect)时会随错误码一起上报。
常见的开发错误(Det Error Code)包括:
COMM_E_UNINIT
:模块未初始化就调用了API。如调用 RequestComMode 前未调用 ComM_Init。COMM_E_NOT_INITED
:请求获取的对象(通道/PNC)未初始化。在部分接口中使用。COMM_E_WRONG_PARAMETERS
:参数错误。如无效的 ComMUser ID、模式参数越界等。COMM_E_NO_PERMISSION
:无权限执行操作,典型如用户请求被抑制时返回。COMM_E_MODE_LIMITATION
:模式限制导致操作未执行(例如唤醒被禁止或NoCom限制生效时请求Full会返回此状态作为Std_ReturnType的扩展)。COMM_E_BUSY
:上一个类似操作尚未完成,新的请求被拒绝(不常用)。
运行时错误(Det Runtime Error)示例:
COMM_E_ERROR_IN_PROV_SERVICE
:底层提供的服务出错,如请求CanSM模式返回失败。COMM_E_BYTE_QUEUE_FULL
:内部消息队列满(在特殊实现里)。COMM_E_T_REPEAT_MAX
:NM重复报文超时(与PNC有关)。
通过阅读 Det 日志,可以诊断出很多配置或调用时序问题。如看到 COMM_E_MODE_LIMITATION,往往意味着某通道正被限制通信,或ComMCommunicationAllowed为FALSE导致的拒绝。
2.7 接口调用关系概览
下面整理 ComM 与各模块之间主要接口的调用方向:
- 上层(SW-C 或 BswM 等) -> ComM:
ComM_RequestComMode
/ComM_GetCurrentComMode
/ComM_PreventWakeUp
/ComM_Limit*
/ComM_DCM_ActiveDiagnostic
等,由应用或其他BSW触发,请求ComM执行动作。
- ComM -> 下层(BusSM, NM等):
CanSM_RequestComMode
,LinSM_RequestComMode
等:ComM根据需要调用总线状态管理请求进入某通信模式。CanNm_NetworkRequest
/CanNm_NetworkRelease
:ComM在需要显式启动或停止网络管理报文发送时调用(取决于NM配置)。Com_SendSignal(ERA/EIRA)
:ComM在PNC状态变化时调用,将PNC请求位更新到COM信号,由NM周期发送。
- 下层 -> ComM:
ComM_BusSM_ModeIndication(Channel, Mode)
:BusSM通知ComM通道硬件已进入某模式(用于同步ComM状态)。ComM_Nm_NetworkMode/Bussleep/PrepareSleep(Channel)
:NM通知ComM网络管理状态改变(进入网络模式或总线休眠等)。ComM_Nm_UpdateEIRA/ERA
:NM提供PNC位图更新。ComM_Nm_PncLearningBitIndication(PncId)
:当启用动态PNC映射学习时,NM通知ComM某PNC学习位触发(标识出新的PNC成员ECU),ComM 将通过 ComM_PnLearningRequest 进一步处理映射更新。- 以及 EcuM 的
ComM_EcuM_WakeUpIndication
/ComM_EcuM_PNCWakeUpIndication
如前所述。
总的来说,ComM 对外接口提供了通信模式请求/通知、抑制控制、PNC处理等功能,涵盖了通信管理的大部分场景。接口之间的调用关系确保了来自各方的请求可以被采纳并转化为对总线的控制,同时将底层总线和NM的事件反馈给上层应用,实现闭环控制。
3. 与 COM / NM 模块的协作机制
ComM 的功能与通信栈中 COM 模块和网络管理(NM)模块的协同是紧密相关的。它通过与 NM 的交互实现网络的同步管理,通过 COM 实现部分网络请求的信号传递。下面分别说明:
3.1 与网络管理(NM)的协作
AUTOSAR 网络管理模块负责总线的休眠唤醒协议,而 ComM 则负责根据用户需求和网络状态来驱动 NM 动作。两者通过一系列调用进行合作:
- 网络唤醒:当应用请求通信或检测到唤醒事件时,ComM 需确保网络管理启动。如果某通道的 NM 配置为Full Variant,ComM 在决定通道需要 Full Communication 时会调用
<Bus>Nm_NetworkRequest()
请求进入网络模式。这会使NM模块开始发送网络管理报文,通知总线其他ECU该节点醒来。以 CAN 为例,调用CanNm_NetworkRequest
将把该节点从 Bus-Sleep状态切换到准备唤醒,其NM报文进入 Repeat Message发送阶段。一旦网络上至少有一个节点Request,NM协议规定整个集群将进入 Network Mode,所有节点保持唤醒。 - 总线休眠:当所有用户都不再需要通信时,ComM 将让通道进入休眠流程。对于配置了NM的通道,ComM 首先调用
<Bus>Nm_NetworkRelease()
表示本节点不再需要维持网络。如果该节点是最后的Request者,那么NM将在Repeat Message计时结束后广播出准备休眠状态,其它节点收悉后也相继停止通信。网络管理随后触发 Bus-Sleep 程序,例如发送一段准备睡眠 (Prepare Bus Sleep) 报文然后停止发送。最终当NM检测总线上规定时间无活动,进入 Bus-Sleep状态并通知ComM。 - 状态同步:ComM 通过 NM 的回调接口获知网络状态变化,从而同步自身状态机:
- 当NM进入 Network Mode 时,调用
ComM_Nm_NetworkMode(Channel)
,ComM将对应通道标记为网络已唤醒。如果此前有用户请求,该通道状态机会从 “请求中” 转为 COMM_FULL_COMMUNICATION 正常通信状态。 - 当NM进入 Prepare Bus Sleep(准备休眠)时,调用
ComM_Nm_PrepareBusSleep(Channel)
,ComM则将通道从 FullComm 转入 Ready Sleep 子状态(静默通信准备关闭)。此时通信停止发送但仍可接收必要消息。 - 当NM最终到达 Bus-Sleep 时,调用
ComM_Nm_BusSleepMode(Channel)
,ComM 随即把通道状态转为 COMM_NO_COMMUNICATION,表示通信完全关闭。ComM 会相应通知CanSM进入 No Communication模式,关闭控制器发送接收。
通过上述机制,ComM 的通道状态机与NM的网络状态机保持同步,保证整个网络按协议规则有序地唤醒和休眠。
- 当NM进入 Network Mode 时,调用
- NM Variants 支持:ComM 针对不同的 NM 算法变体(Full, Light, Passive 等)有不同处理逻辑。例如:
- Full: 如上所述,ComM 完整参与网络请求/释放流程。
- Light: ComM 不主动NetworkRequest,而是在有通信时保持发送应用消息,由NM被动唤醒(无PN信息转发功能)。
- Passive: 本节点不发送NM报文,仅监听其他节点的NM状态。此时ComM不会调用NetworkRequest,而是依赖外部唤醒指示和应用确认。
- None: 无NM存在时,ComM 只能简单地控制总线驱动(BusSM),无法同步其他ECU,所以休眠唤醒协调需依赖EcuM或其他方式。
ComM 配置参数 ComMNmVariant 指定每个通道的 NM 类型,不同类型下 ComM 是否调用 Nm接口、如何进入Silent模式等都会有所差异。
3.2 与通信模块(COM)的协作
COM 模块位于PDUR之上,为应用提供信号/PDU层的通信服务。ComM 与 COM 直接交互主要体现在部分网络PNC信息的传输上,以及PDU组控制的配合。
- PNC信号收发:当 PN 功能启用时,网络管理报文中的PNC位需要通过 COM 层传递给 ComM 或由 ComM 发送出去(因为网络管理报文本身也通过Com发送)。具体流程如图2所示:
接收方向:其他ECU发送的NM报文进入本ECU后,CanNm在内部解析出ERA/EIRA比特向量,通过 PduR 将其交给 COM 作为信号更新。ComM 周期性调用Com_ReceiveSignal(ERA_Rx_Signal)
和Com_ReceiveSignal(EIRA_Rx_Signal)
获取最新的PN位状态。然后 ComM 更新内部ERA/EIRA并做出响应:- 如果某PNC位从0变为1,表示有新的外部请求,则ComM的该PNC状态机将转入 COMM_PNC_FULL_COMMUNICATION(或REQUESTED子状态)。ComM 同时调用
BswM_ComM_CurrentPncMode(PncId, FULL_COMM)
通知模式管理。BswM 随即执行相应策略,如使能该PNC相关的PDU组。PDU组(I-PDU Group)是在 COM 配置中预先定义的一组报文集合,可由 BswM 动态开关。当PNC激活时,BswM 会开启对应组使能这些报文发送;当PNC休眠时,关闭组以停止发送。通过这种方式,实现按PNC控制应用消息的发送(通常关闭休眠ECU的非必要消息)。 - 如果PNC位从1变0,表示外部请求消失。ComM 将相应PNC状态机进入准备休眠(Prepare Sleep)并启动PNC定时器等待一段稳定期。若在定时器超时后仍无新请求,则进入 PNC_NO_COMMUNICATION 状态并通知 BswM 关闭PDU组。
发送方向:当本地有PNC请求变化(例如某用户请求了一个PNC唤醒),ComM 会更新内部IRA/EIRA位图,然后调用Com_SendSignal(EIRA_Tx_Signal)
等将改变提交给 COM。COM 将该变化映射到Network Management PDU的User Data,比方说把相应PNC位设为1。随后在下一个周期发送的NM报文中,这些位就反映出来,被网络上其他ECU接收。为了通知网关ECU上的其他网络,ComM 也可能调用Com_SendSignal(ERA_Tx_Signal)
发送ERA位。总之,通过COM的信号缓冲,ComM将PNC请求注入到NM消息中去。
- 如果某PNC位从0变为1,表示有新的外部请求,则ComM的该PNC状态机将转入 COMM_PNC_FULL_COMMUNICATION(或REQUESTED子状态)。ComM 同时调用
- 通信控制与PDU组:BswM根据 ComM 提供的通道状态和PNC状态来控制 COM 层的通信。这包括两方面:
- 通道级别:在某些架构下,BswM 需要根据 ComM 通道模式决定整个通讯矩阵的状态。例如在 ECU 刚启动时,如果ComM通道尚未FullComm,BswM可以保持所有输出I-PDU组禁能状态,避免车辆在不应通信时发送消息。只有当 ComM指示通道达到 FULL_COMMUNICATION,BswM才打开I-PDU组。
- PNC级别:如前述,BswM 配置规则使能/禁能PNC关联的I-PDU组。例如PNC#5包含的报文组,在PNC#5未激活时保持禁发,一旦激活立即启用发送。
此外,BswM 本身也可以作为 ComMUser 请求通信模式(特别是在 EcuM-Flex场景下,BswM决定CommunicationAllowed时)。因此,COM、ComM、BswM三者共同实现了通信信号的按需激活:COM负责具体信号的传输,ComM决定整体通信模式和PNC激活,BswM根据策略使能/禁能信号传输。
3.3 ERA/EIRA 位图交互详解
ERA/EIRA 是部分网络管理中非常重要的概念,用于在网关ECU上传递PNC请求信息:
- IRA(Internal Request Array):仅包含本ECU内部(本地ComM用户)对各PNC的请求集合。
- ERA(External Request Array):表示该 ECU 所连接某一个总线上来自其他ECU的PNC请求集合。对于具有网关功能的ECU,每个启用PNC的总线通道都有一个ERA。ERA由该通道NM报文接收到的PNC位直接得出。
- EIRA(External and Internal Request Array):综合了ERA和IRA的请求集合。通常EIRA是ERA和IRA按位“或”的结果,表示当前总线上“任一ECU(包括自身)”对PNC的请求情况。
在终端节点(非网关ECU)上,由于没有跨总线转发需求,可仅配置EIRA即可满足:终端ECU并不需要区分请求来源,直接关注综合请求360doc.com。而在网关ECU上,需要区分开:该ECU从一个总线收到ERA后,要根据策略决定是否转发到另一个总线。这种转发有两种:
- 主动网关(Active):网关ECU负责在其他总线上主动发送该PNC请求,维持各子网同步。ComM在Active网关模式下会将ERA请求“镜像”回源通道和转发到目的通道。
- 被动网关(Passive):网关ECU仅在自身或更高级PNC协调者要求时才转发,不主动传播外来请求。这样,被动通道收到的ERA不会再发回同一通道,也不会传播给其他通道,除非顶级协调触发。
ERA/EIRA 机制保证了PNC位置信息在系统中统一:每个PNC在网络报文中占据固定的bit位,所有ECU在相应位上传递该PNC的请求状态。ComM 使用这些位图,结合自身用户请求,决策PNC状态。当PNC在全车范围内无请求时,所有相关ECU的EIRA该位都会最终归零,各节点即可进入该PNC的休眠。
需要特别注意 PNI位(Partial Network Indicator):这是NM控制位向量CBV中的一位,指示后续User Data中PNC信息是否有效。PNI=1表示当前NM报文携带PN请求信息,PNI=0则表示没有PN相关信息。因此,如果某ECU发送NM报文但忘记置PNI=1,即使User Data里PNC位有1,接收端也会忽略当作无请求。这通常由NM模块自动处理,但在配置PN功能时要确保所有PN相关NM节点开启了PNI位支持(如CanNm参数 PassiveModeEnabled 等)。实际问题中,“PNC唤醒无效”经常归因于PNI位未正确设置:例如某ECU配置了PNC但 PassiveModeEnabled错误地为TRUE,导致其即便检测到PNC请求也不拉高PNI,从而别的ECU没有收到唤醒意图。解决方法是检查NM配置,使能PNI且确保PNC ID一致,才能实现跨ECU的PNC正常唤醒。
4. PNC 机制原理与动态映射说明
本节深入解析 部分网络集群(PNC) 的工作原理,以及 AUTOSAR在新版本中引入的 动态 PNC-通道映射 特性。
4.1 部分网络(Partial Networking)的原理
Partial Networking(局部网络通信)是为提高车辆网络能效而提出的概念。传统网络管理要么整个总线唤醒、要么整体休眠,而 Partial Networking 允许在一条总线上只唤醒需要的ECU,让不相关的ECU保持休眠,从而节省能耗。AUTOSAR 通过 PNC 实现该机制,即把总线内的ECU按功能划分为若干 PNC组,各组独立控制:
- 每个 PNC 在整个系统内分配一个唯一的 PNC ID,范围通常0-255。PNC ID通过NM User Data中的bit位传递360doc.com。例如某CAN网络支持48个PNC,则NM报文User Data的48个位对应PNC0~PNC47。
- 一个 ECU 可以参与多个 PNC,也可以不参与任何PNC。如果ECU不在某PNC内,它可忽略该PNC位的信息。
- 当需要某PNC对应的功能时,相关ECU(或上位策略)会发出PNC请求,于是网络管理消息中该PNC位被置1广播。所有ECU接收到后,各自ComM更新EIRA,如果自己属于该PNC且配置允许被动唤醒,则从休眠进入通信。
- 当PNC相关的功能不再需要时,相应请求撤销,PNC位归0。若整个网络该PNC位都为0一段时间,ComM会让PNC状态进入准备休眠并最终休眠,同时通过NM发送 “PNC shut down” 消息(在同步关断扩展下)通知大家一起停发。
概括地说,PNC就像CAN总线上的“小团体”:团体里任一成员需要通信,整个团体就被唤醒;团体里没有人需要时,所有成员都休眠。这提高了针对特定功能场景的能量管理效率。例如:导航系统相关ECU可以归为一个PNC,当导航开启时唤醒这些ECU通信,关闭导航时这些ECU的通信也一起休眠,不影响车上其它网络功能。
在实现上,PNC引入了三个状态(正如ComM PNC状态机):
- COMM_PNC_NO_COMMUNICATION:PNC休眠状态。此时该PNC相关ECU不应发送除NM必要报文外的通信。
- COMM_PNC_FULL_COMMUNICATION:PNC激活状态。其中又细分:
- COMM_PNC_REQUESTED:本ECU或本ECU所在主动网关有请求导致的激活。本ECU需要保持通信并发送PNC请求给别的ECU。
- COMM_PNC_READY_SLEEP:由于远程ECU的请求导致本ECU被动激活。当远程请求消失后,该状态表示本ECU已做好准备休眠,可以立即休眠或等待超时。
- COMM_PNC_PREPARE_SLEEP:PNC准备休眠过渡状态,在同步关断机制中使用,由 ComMPncPrepareSleepTimer 控制保持一小段时间以等待同步消息。
典型场景分析:
- 主动唤醒节点:假设ECU本身需要某功能(如车门模块检测到开门),它所属PNC为满足功能应该唤醒通信。此时ECU上的SW-C通过 ComM 请求与该PNC绑定的通道FullComm,ComM置IRA位=1并调用 Com_SendSignal 发送EIRA,从而NM报文PNC位=1、PNI=1广播出去。其他ECU收到后发现PNC位1且PNI=1,标记EIRA=1进入 FULL_COMM。这种情况下,本ECU的PNC状态直接从 NO_COMM 进入 REQUESTED 子状态,然后FullComm。
- 被动唤醒节点:指ECU自身无需求,但被他人唤醒。例如某从节点没有任何SW-C请求通信,但收到别的ECU发来的PNC位=1的NM报文(PNI=1),则ComM把该PNC状态设为 READY_SLEEP(因为它自己没有主动请求,只是被动被叫醒)。如果配置允许被动立即全通信(ComMSynchronousWakeUp),也可能直接进入 FULL_COMM。。否则通常等应用确认后再 FullComm。
- PNC休眠:当PNC相关请求全部消失后,ComM启动PNC准备休眠计时(如 ComMPncPrepareSleepTimer)。在同步关断支持时,顶级PNC协调器会发送 “PNC ShutDown” 帧,各节点收到后立刻进入 PREPARE_SLEEP 子状态,然后同时超时转 NO_COMM,同步关闭通信。如果无同步机制,则各节点各自计时超时转 NO_COMM,可能时间上稍有差异。
需要说明 PNC与通道的关系:一个PNC可以涉及一个或多个通信通道(跨多个总线),但一个PNC至少要绑定一个通道才能发生实际作用。ComM 配置里用 ComMPncEnabled 开关指定哪些通道支持PNC。若某通道未启用PNC,则其上报文不会带PN位,PNC对该通道无影响。通常一个PNC对应一个功能场景,涉及一组ECU,这组ECU可能横跨多个总线(例如动力系统的PNC可能包括动力CAN和底盘CAN上的ECU)。通过在每个相关通道配置同一个PNC ID,即可实现跨总线的同步唤醒。
4.2 PNC 网关与多协调
PNC网关是指连接两个或多个带PNC网络的ECU,它需要在不同网络间转发PNC请求。例如,一个ECU连着CAN1和CAN2,两侧都有PNC配置,当CAN1上某PNC请求唤醒,这个ECU应把该请求传播到CAN2上相应PNC位,反之亦然,以确保两个总线相关ECU同步醒/睡。
AUTOSAR ComM 支持两种网关类型:
- 主动协调(COMM_GATEWAY_TYPE_ACTIVE):网关ECU主动汇总各侧请求并在另一侧发布。例如上例中,CAN1收到PNC#n=1,网关ECU的ComM在CAN2侧的ERA位也置1并发送NM报文通知CAN2网络唤醒。同时它自己IRA也记录请求。
- 被动协调(COMM_GATEWAY_TYPE_PASSIVE):网关ECU本身不主动在另一侧发布请求,仅当更高级(如车上中央协调ECU)要求时才镜像。这意味着来自被动侧的ERA不会原样转回,从而避免循环唤醒风暴。但是需要有顶级主动节点统一协调。
网关的配置通过 ComMChannel 的 ComMGatewayType 参数来设置。在Active模式下,同一PNC在不同总线间请求会互相“镜像”,而Passive模式下请求不返回来源总线。为了防止多个主动协调者冲突,AUTOSAR允许存在多个顶级PNC协调器(例如每个分区一个),但需要在设计上合理分配,使得最终只有预期的ECU在主动转发PN信息,其他网关尽量被动。
4.3 动态 PNC-to-Channel 映射
AUTOSAR R20-11之后,引入了动态 PNC映射(Dynamic PNC-to-Channel mapping)这一可选特性。传统上,哪个ECU属于哪个PNC是在配置时静态决定的。然而在一些应用中(比如网关新插入子网,或者车辆拓扑变化),希望运行过程中学习新的PNC成员关系。动态映射支持在运行中更新PNC与通道的关联。
工作原理:当启用 ComMDynamicPncToChannelMappingSupport 后,ComM 会监控PNC Learning请求。具体而言,网络管理报文中预留了一位“PNC Learning Bit”,当某ECU检测到未知PNC通信时,可以发送该bit触发学习过程。其他ECU(尤其网关)收到带Learning Bit的报文后,通过调用 ComM_Nm_PncLearningBitIndication(PncId)
通知 ComM。ComM 记录需要学习的PNC号,并调用上层配置的 ComM_PncLearningRequest(PncId, Channel)
请求增加映射。
车辆开发者可以在 ComM_PncLearningRequest 钩子中实现具体策略:例如查询某配置表,确认该PNC可以动态分配给本通道,然后调用 ComM API(可能是内部接口)来更新映射。更新后,ComM 通过NvM将新映射持久化,以便下次开机继续有效。这个过程类似于网关ECU在运行中“学会”某未知PNC其实涉及自己的某个通道,于是将它纳入管理范围。
应用场景:动态PNC映射常用于可插拔网络或配置更新场景。例如车上增加了新ECU或新功能,它使用了一个以前未定义的PNC ID。如果其他ECU支持动态映射,它们可以学习到这个ID属于哪个功能并在以后识别处理。又如OTA升级后新增PNC配置,老的ECU通过学习也可适配。而对于固定拓扑的车辆,动态映射不是必需的,通常关闭以减少复杂性。
需要指出,动态映射涉及安全及一致性问题:为了避免误学习错误PNC,AUTOSAR规定了严格的触发条件和确认机制,并建议在车辆认证阶段对PNC拓扑做充分验证。启用动态映射后也应确保定期或在车厂服务站检查ECU中的映射表,防止异常情况。
4.4 同步部分网络关闭
同步关断(Synchronized PNC Shutdown)是AUTOSAR为缩短部分网络关闭延迟而提供的机制。正常情况下,当最后一个PNC请求消失,各ECU可能在不同时间检测到,从而各自计时一段T\PncTimeout才休眠,导致整个PNC完全休眠时间分散。同步关断通过引入PNC关断消息使所有节点几乎同时进入休眠准备:
- 当PNC的顶级协调者(通常车上中央网关)检测到该PNC所有请求源都归零,它不会立即等待计时,而是立即发送一帧NM报文,其中PNC位全0且PNI=1,并将CBV中的特殊“S”标志位置1表示Shutdown。
- 其他网关ECU(中间协调者)一旦收到这帧带Shutdown标志的NM报文,立刻停止本地计时,并转发一帧相同的Shutdown报文到下级网络。这样Shutdown指令在很短时间传遍所有相关网络。
- 所有ECU收到Shutdown消息后,直接进入 PNC_PREPARE_SLEEP 子状态,无需等待超时。各节点同步进入Ready Sleep,很快PNC位将停止发送。
- 由于各节点同时不再发送PNC请求,也不会再突然出现新的请求,因此每个ECU可以在极短超时时间后进入PNC_NO_COMMUNICATION,而不会发生误判。
通过同步关断,过去可能需要数秒的PNC关闭通知可以缩短到几十毫秒内,使应用层感知到PNC无通信更及时,从而快速关闭相关功能,达到进一步节能效果。ComM 配置参数 ComMSynchronizedPncShutdownEnabled 控制该特性,通常网关ECU启用,普通ECU被动接受即可。
5. 工具配置实战(Vector DaVinci 与 EB tresos)
在AUTOSAR工程中,ComM 的配置通常通过专业配置工具完成。以下结合 Vector DaVinci Configurator(经典平台配置工具)和 EB tresos Studio 简要介绍 ComM 的配置要点及差异。
5.1 Vector DaVinci Configurator 配置要点
(1)基础设置:在 DaVinci Configurator 的 ECU 配置中,添加 ComM 模块配置。首先在 ComMGeneral 中配置全局开关,例如:
- ComMDevErrorDetect:开发错误检测开关,调试阶段建议Enable以捕获错误。
- ComMPncSupport:是否启用部分网络(PNC)支持。需要PNC功能则设置为True,并确保相关NM也支持PN。
- ComMModeLimitationEnabled、ComMWakeupInhibitionEnabled:是否启用通信抑制功能,对应LimitNoCom和Wakeup抑制。如果需要使用相应API则Enable。
- ComMNmVariant(全局默认):可以在每个通道Override。一般默认FULL,如果某通道无NM可设NONE等。
(2)ComMChannel 配置:为每个物理网络通道创建一个 ComMChannel 容器。例如典型的有 ComMChannel_Can0
,ComMChannel_Can1
等。每个通道关键配置包括:
- ComMChannelId:通道ID,通常从0开始编号,主要用于索引。
- ComMAssociatedBusSM:关联的总线状态管理模块实例(如 CanSM_Channel_0)。工具通常通过选择相应CanSM或LinSM配置条目来绑定。
- ComMNmVariant(通道级):覆盖全局NM类型。如某通道没有NM则设NONE,有NM则FULL/Light等。
- ComMPncEnabled:此通道是否支持PNC。勾选后可在该通道下配置 ComMPncRefs 等。
- ComMChannelUsers:引用使用此通道的 ComMUser 列表。DaVinci一般不需要手动填写,它会根据 ComMUser 配置自动关联谁用了这个通道。
- ComMBswMIndication:是否使能 ComM 向 BswM 通知该通道状态变化的开关。如果使用BswM来管理通信模式和PDU组,应Enable。
- ComMCommunicationAllowed(仅EcuM-Flex情形出现):默认为TRUE表示通信允许。如果EcuM-Flex模式下,由BswM动态控制Allowed状态,则此参数初值可设False并由BswM切换。
配置示例:对于一个有PNC的CAN通道,ComMChannel配置ComMPncEnabled=True,并列出关联的PNC Ref列表(DaVinci里在PNC配置处选择,此处可能自动填充)。若该通道充当PNC网关,需要设置 ComMGatewayType(Active/Passive)。
(3)ComMPnc 配置:当全局启用了PNC,在ComM下会有 PartialNetwork列表。在DaVinci中,您需要添加每个PNC的配置:
- ComMPncId:PNC ID,对应NM报文bit位置。
- ComMPncSignal:如果需要Tool自动生成ERA/EIRA信号及PDUs,可在此引用至 Com 信号(Vector通常通过MICROSAR Com配置同步生成,不需手动在ComM填)。
- ComMPncChannelRefs:该PNC涉及的通信通道列表。将PNC分配到哪些ComMChannel。
- ComMPncUserRefs:该PNC关联的用户列表。如果某PNC由应用直接请求控制(而非仅被通道关联被动触发),则可在此挂接一个或多个ComMUser。当这些User请求FullComm时,将被解释为请求PNC唤醒。
- ComMPncGatewayEnabled:是否为网关PNC。在Active网关场景需Enable,使能ERA镜像逻辑。
- ComMPncDeadline 等:可能还有PNC准备休眠超时时间配置等,在Tool中一般有缺省。
(4)ComMUser 配置:定义通信用户。DaVinci会根据SWC的RTE接口或者BswM需求让您创建User。例如:
- ComMUserId:用户ID,由工具赋值或手填唯一值。
- ComMUserName:可读名称,例如 User_DCM, User_Telematics 等。
- ComMUserRequestedChannels:列出该用户控制的通道集合。
- ComMUserRequestedPncs:列出该用户控制的PNC集合。
通常一个User要么请求一个或多个通道,要么请求一个PNC,不会两者都有。配置工具可能不强制,但应遵循标准避免冲突。例如,DCM作为诊断用户,可以直接关联车上所有通道,这样调用一次RequestComMode(FULL)就能唤醒整个车方便诊断(这是一种配置策略);而另一些如某功能SWC可能只关联特定一个PNC,由ComM负责映射到背后的通道集。
(5)RTE接口:配置完User后,DaVinci会在 RTE接口(SysService部分)生成对应的 ports:
- 一个 Client-Server Interface
ComMCommunication
下有RequestComMode
和GetCurrentComMode
操作。每个User对应一个 R-Port,SWC可通过它调用上面两个操作请求/查询通信模式。 - 一个 Mode-Switch Interface
ComMMode_<User>
,SWC可以提供一个 Mode Receiver Port 来接收 ComM提供的模式通知。ComM会在内部状态变化时通过 RTE Mode Switch将新的模式发送给连接的SWC。
DaVinci 通常自动生成这些接口,无需手工添加代码,只要在SWC中实现相应端口并连线即可。
(6)特殊配置:
- 若使用 EcuM Flex 模式,需要在 BswM 配置中添加允许通信的规则,调用 BswM_AllowCommunication 切换 ComM 通道的 CommunicationAllowed 状态。从ComM这边确保 ComMCommunicationAllowedInitial = FALSE,以便等待BswM信号。
- 若需要统计FullComm被抑制计数,需在 ComMGeneral 打开 ComMInhibitionCounterEnabled,并配置NvM块用于存储该计数值(Vector可能自动生成NvM配置)。
- ComM 主函数调度:DaVinci会在 OS配置中引入ComM_MainFunction_x任务,默认周期根据配置(一般10ms)。确保调度周期与ComMTMinFullComModeDuration等参数协调。
5.2 EB tresos Studio 配置要点
使用 EB tresos 配置 ComM 时,界面和名称可能与Vector略有不同,但概念一致。
(1)基础模块启用:在 tresos 的 ECUC 配置树中,找到 ComM 模块,启用它。通常需要先导入对应的 ARXML模板。勾选 ComMPncSupport 等全局开关参数。
(2)通道与用户配置:Tresos 将配置参数按照AUTOSAR命名呈现:
- Channels 列表:添加
ComMChannel
条目,每个里面配置 ComMChannelId、ComMNmVariant 等参数(值同Vector)。通道与总线模块的连接通常通过参数如 ComMComMNetworkHandleRef(引用至对应的 CanIf 或 FlexRayIf 通道句柄)。需确保这个引用正确,ComM才能调用总线驱动。 - Users 列表:添加
ComMUser
条目。包括 ComMUserId,Name,以及子节点 ComMUserNeeds(其中勾选该用户需要FullComm、NoComm等模式请求能力)等。在 ComMUser对应的 Reference 子项中,关联其控制的 Channel或PNC。Tresos可能要求添加 ComMUserToChannelMapping 子节点,在里面把User和Channel关联。也可能有 ComMUserToPncMapping 用于User-PNC关联。
(3)PNC配置:在 PartialNetwork 下添加 Pnc配置:
- ComMPncIdentifier(PNC ID)、ComMPncName等,Tresos可填写。
- ComMPncChannelMapping:子节点列表,把本PNC关联的Channels都列出来(引用ComMChannel)。
- ComMPncUserMapping:列出本PNC关联的Users(如有)。
- ComMPncGatewayEnabled等:直接勾选。
- ComMPncSignalRef / ComMPncComSignalKind:Tresos允许配置指向具体COM信号的引用,以及这是ERA还是EIRA信号。通常有两个信号Ref:一个用于Rx(EIRA)一个用于Tx(ERA),分别标识该PNC的信息在COM中的信号。
需要注意配置 ComMPncGatewayType:Tresos可能在每个Channel下而非PNC下配置网关类型(即标记某通道为Active/Passive)。因为网关性质是通道属性(该通道在PNC上下文是主动还是被动)。
(4)BswM 交互:在 Tresos BswM 配置中,需添加 ComM 通道状态和PNC状态的通知:
- 添加 ComM Indication规则,比如 “BswM_ComMIndication_Channel1”,选择当ComM Channel1进入 FullComm时,执行相应动作(如 enable PDU group X)。Tresos提供的动作类型包括控制Com和CanIf等。
- 添加 PNC Mode Indication规则,例如当 PNC3 模式为 FULL时,Enable 某些 I-PDU组;当为 NO_COMM时Disable。要使ComM通知BswM,需要在ComMChannel里 ComMBswMIndicator = TRUE,以及 ComMPncIndicator(如有该参数)= TRUE。
(5)DCM 与 ComM:Tresos中 DCM 模块会有参数“DCMComMChannelIdRef”等,用于指定调用 ComM_DCM_ActiveDiagnostic 的通道。需确保配置正确,使能DCM和ComM协作。通常Tresos生成的 RTE会在DCM进入诊断会话时自动调用 ComM_DCM_ActiveDiagnostic。
(6)NvM 集成:如果用了抑制持久化或PNC学习,需要配置 NvM 块:
- ComMGlobalNvMBlockId:存储全局状态(如ECU抑制标志、计数器)。
- ComMPncNvMBlockId:可能用于存储PNC动态映射表等。
(7)验证与生成:配置完成后,用工具自带的Consistency Check检查是否有未配置引用或冲突。例如User没有关联Channel会警告,PNC无通道映射也会有提示。修正后生成配置代码(ComM_Cfg.h/.c等),并集成到工程。
5.3 配置示例模板
以下是一个简化的 ComM 配置示例(伪ARXML格式):
<ComMConfig>
<!-- 通用配置 -->
<ComMGeneral ComMPncSupport="true" ComMNmVariant="FULL"
ComMModeLimitationEnabled="true" ComMWakeupInhibitionEnabled="true"/>
<!-- 通道配置 -->
<ComMChannels>
<ComMChannel Name="CAN_Channel_0" ComMChannelId="0" ComMNmVariant="FULL" ComMPncEnabled="true" ComMGatewayType="ACTIVE">
<ComMComMNetworkHandleRef dest="CanSM">CAN_Channel_0</ComMComMNetworkHandleRef>
<ComMChannelUsers> <!-- 引用使用该通道的用户 --> </ComMChannelUsers>
</ComMChannel>
<ComMChannel Name="LIN_Channel_1" ComMChannelId="1" ComMNmVariant="NONE" ComMPncEnabled="false">
<ComMComMNetworkHandleRef dest="LinSM">LIN_Channel_1</ComMComMNetworkHandleRef>
...
</ComMChannel>
</ComMChannels>
<!-- PNC配置 -->
<ComMPncVector>
<ComMPnc Name="PNC_DoorLock" ComMPncId="5" ComMPncGatewayEnabled="true">
<ComMPncChannelRefs>
<ComMPncChannelRef dest="ComMChannel">CAN_Channel_0</ComMPncChannelRef>
<ComMPncChannelRef dest="ComMChannel">LIN_Channel_1</ComMPncChannelRef>
</ComMPncChannelRefs>
<ComMPncUserRefs>
<ComMPncUserRef dest="ComMUser">User_DoorModule</ComMPncUserRef>
</ComMPncUserRefs>
<ComMPncSignalRxRef dest="ComSignal">RxSignal_PNC5_EIRA</ComMPncSignalRxRef>
<ComMPncSignalTxRef dest="ComSignal">TxSignal_PNC5_ERA</ComMPncSignalTxRef>
</ComMPnc>
</ComMPncVector>
<!-- 用户配置 -->
<ComMUsers>
<ComMUser Name="User_DCM" ComMUserId="0">
<ComMUserChannels>
<ComMUserChannelRef dest="ComMChannel">CAN_Channel_0</ComMUserChannelRef>
<ComMUserChannelRef dest="ComMChannel">LIN_Channel_1</ComMUserChannelRef>
</ComMUserChannels>
</ComMUser>
<ComMUser Name="User_DoorModule" ComMUserId="1">
<ComMUserPncs>
<ComMUserPncRef dest="ComMPnc">PNC_DoorLock</ComMUserPncRef>
</ComMUserPncs>
</ComMUser>
</ComMUsers>
</ComMConfig>
上述模板展示了两种用户:User_DCM 直接绑定两个通道(CAN0和LIN1,可能表示诊断用户需要唤醒整个车的CAN和LIN网络);User_DoorModule 绑定了PNC "DoorLock"(ID=5),由ComM内部映射到CAN0和LIN1通道。当门锁模块请求通信时,ComM会将PNC5对应的CAN0和LIN1唤醒,但该用户无需知道具体通道细节。配置中的其他参数如ComMChannel和ComMPnc的细节需根据具体项目进行调整。
6. 常见问题与误区排查
尽管 ComM 提供了统一的通信管理接口,在实际项目中仍经常遇到配置或使用上的问题。下面列举几个典型问题、可能原因及排查思路:
6.1 通信“不上线”(ECU无法进入 Full Communication)
现象:ECU 上应用请求通信后,相关总线并未激活通信。比如请求后收不到任何消息,ComM 状态机停留在 “No Communication” 或 “Network Requested” 状态,迟迟不进入 Full Communication。
可能原因分析:
- 未调用 RequestComMode:首先确认应用是否真正调用了
ComM_RequestComMode(FULL_COMMUNICATION)
。有些情况下应用可能错误地只调用了ComM_GetCurrentComMode
进行判断却忘记发起请求,导致ComM没有被要求上线。 - ComMCommunicationAllowed = FALSE:在 EcuM-Flex 配置下,ComM默认通信可能被标记为不允许,必须等待 BswM 的允许信号。若 BswM 没有及时调用
ComM_CommunicationAllowed()
(或等效机制)解除限制,ComM 将一直停留在 No Comm Request Pending 状态,即使用户请求也不真正触发总线唤醒。解决方法是在系统上电时,由 BswM 根据条件尽早允许通信,或者配置 ComMCommunicationAllowed 初始为TRUE绕过该机制。 - 总线唤醒抑制未清除:如果某通道先前调用过
ComM_PreventWakeUp(TRUE)
(或NvM恢复了抑制状态),则ComM会禁止用户唤醒总线。此时调用 RequestComMode会直接返回 E_NOT_OK 或 COMM_E_MODE_LIMITATION 而不执行。排查方法:调用ComM_GetInhibitionStatus
查看 ComMNoWakeup 位是否为1。如是,则需要在适当时机调用ComM_PreventWakeUp(FALSE)
解除抑制。 - 通道模式限制:类似地,如果 ComM_LimitChannelToNoCom(TRUE) 曾被设置,ComM 会强制通道保持无通信。此限制通常通过NvM保留。检查方法同上,看 InhibitionStatus 的 NoComm 位,或观察Det错误(请求Full时可能报 LIMITATION)。解决是在确保条件允许时调用 LimitChannelToNoCom(FALSE)。
- BswM 模式逻辑问题:BswM 可能配置了在某些模式下不允许通信。如果BswM误判条件没有触发Allow通信,则ComM被悬置。比如在Ignition Off模式BswM限制通信,导致即使点火On标志出现也没及时切换。需要检视BswM模式表逻辑。
- NM配置问题:若 ComMNmVariant=FULL,但 NM模块未正确初始化或参数不匹配,也会造成无法上线。例如,有案例是NM报文未发送出(PNI位没设,或UserData未配置长度),导致对端未响应,从而ComM等待超时。可通过CANoe等监测NM报文是否有发送以及字段正确。
- BusSM不同步:ComM 调用了 CanSM_RequestComMode,但如果 CanSM 未进入 FullCommunication(也许因为CAN故障或者未初始化),ComM也不会进入Full。此时ComM状态可能卡在 COMM_REQUEST_PENDING。应检查总线控制器状态和错误。
- 优先级反转:如果有多个用户请求,其中一个用户请求NoComm另一个请求Full,按标准FullComm优先。但错误配置可能出现BswM或SWC逻辑在不恰当时机请求NoComm覆盖了FullComm请求。需要梳理请求时序,确保无冲突。
排查建议:
- Det错误日志:查看是否有 COMM_E_MODE_LIMITATION 等错误上报。有则按错误含义排查抑制或限制原因。
- ComM状态跟踪:通过 RTE的 ComM_CurrentMode 反馈或者调试接口看 ComM 通道的 internal state(许多ComM实现有内部状态可供调试输出)。确认停在哪个子状态,如 Ready Sleep 表示可能Allowed为FALSE等。
- 网络抓包:用分析仪看该ECU是否发送NM Network Request报文。如果没有发送,说明ComM根本没触发NM,可重点看ComM侧原因;如果发送了报文但网络没起来,看看PNI等字段及对端ECU行为,可能是对端未响应导致又退回BusSleep,这种多为配置不一致问题。
6.2 PNC 唤醒无效
现象:某功能对应的PNC应该唤醒ECU,但实车测试时未效果。例如按下车门解锁,期望动力总线ECU被唤醒(因为门锁PNC涉及动力CAN)却没有通信。
可能原因:
- PNI位未置:如前所述,PNC请求依赖NM报文的PNI标志。如触发PNC请求的一端ECU没将PNI=1,则其他ECU完全忽略该PNC位。很多情况下这是罪魁祸首。应检查触发方ECU的NM配置:NmPassiveModeEnabled等参数需正确,确保发送PN请求时PNI=1。针对性测试:触发动作后抓取NM报文,查看Byte1的位6(标准CAN NM中PNI位)是否=1。
- PNC ID不一致:如果各ECU对同一功能使用了不同PNC ID,会造成混乱。例如ECU A把门锁功能配置为PNC5,ECU B错误配置为PNC6,则A发PNC5=1,B监听PNC6,自然无反应。解决是统一配置数据库,确保跨ECU的PNC ID一致,且NM UserData长度覆盖这些ID位。
- 被动网关限制:假如唤醒信号需要跨网关,但网关配置为Passive类型,那么来自一侧的PNC请求不会自动转发到另一侧。导致另一侧ECU收不到请求而不唤醒。这可能需要改成Active网关,或者通过中央协调ECU发送WakeUpIndication来唤醒另一侧。要区分是所有ECU都不醒还是只有跨网部分不醒,以判断是不是网关的问题。
- ComMSynchronousWakeUp配置:ComM有参数 ComMSynchronousWakeUp 控制当某通道收到Wakeup时,是否同时将相关PNC也标记唤醒。如果该参数=FALSE,可能出现通道Wake了但PNC状态仍NO_COMM,需要等待应用调用 Request。某些系统期待PNC自动激活而没有,则需考虑打开同步唤醒或让BswM调用 ComM_RequestComMode(PNCUser)。
- 无PNC使能:检查相关ECU的ComMPncEnabled和ComMPncSupport是否打开。有时候配置遗漏,导致ECU其实并未参与PNC,此时当然不会响应PNC位。比如门锁ECU PNC Support关了,那它不会理会PNC位。
- Wakeup源校验:EcuM 对网络唤醒需要 CheckWakeup。如果PNC唤醒没有被EcuM认为有效(比如EcuM未配置该PNC作为WakeupSource),则 EcuM 可能不通知 ComM。这种情况下ECU继续睡眠。解决是在EcuM配置中添加PNC wakeup source并与相应通道关联。
- 时序问题:如果PNC请求到达时ECU尚未初始化完ComM,也可能被忽略。要确保ECU上电时序中 ComM/NM 初始化早于可能的PNC请求。尤其网关ECU要更早起来,否则来不及转发首个请求报文。
排查建议:
- 用CANalyzer/CANoe记录网络管理报文,在触发PNC事件时看相关字节位变化和PNI位。确认消息格式正确。
- 对比各ECU配置的 PN相关参数,包括 PncId,PNCActivationBits 等,检查是否一致。
- 在涉及EcuM的系统,可在EcuM日志或通过调试看 EcuM是否调用了
ComM_EcuM_WakeUpIndication
或PNCWakeUpIndication
。如果没有,八成是唤醒源未被识别配置。 - 查看ComM Inhibition Status,确认没有Wakeup被抑制(虽然Wakeup抑制主要影响本地产生请求,对外部请求不影响,但如果问题ECU本身也需要发请求而被抑制就麻烦)。
6.3 BswM 未触发相应动作
现象:ComM 状态变化后,期待的 BswM 行为没有发生。例如PNC激活后应打开某PDU组但没打开,或通道下线后应关闭某诊断报文但仍在发。
可能原因:
- ComM未通知BswM:检查 ComMChannel 和 ComMPnc 的 ComMBswMIndication 开关是否打开。如果关闭,ComM不会调用
BswM_ComM_CurrentMode
或CurrentPNCMode
,BswM自然无法感知变化。解决是在配置中Enable这些指示。 - BswM 配置遗漏:BswM 需要相应的规则来处理 ComM通知。如果ComM发出了通知但BswM没有配置规则或动作,那也等于无效。比如PNC模式通知来了但没有任何BswM规则匹配PNC3 FULLCOMM,则什么都不会发生。需在BswM中添加对应规则并实现所需动作(如调用Com_EnablePduGroup)。
- BswM 未初始化/启动顺序:如果BswM 比 ComM 晚初始化,可能错过初始状态通知。根据规范BswM应该在ComM之前Init,并注册回调。所以检查启动顺序,如果顺序不对需要调整(通常BswM_Init在ComM_Init前)。
- 逻辑冲突:BswM 复杂规则可能导致冲突,如多个规则都在控制同一PDU组,或某状态反复切换造成动作被快速打开又关闭。需仔细梳理BswM配置确保唯一性和正确的优先级。
- ComMUser配置的问题:有时BswM通过作为ComMUser直接请求模式(例如Limiting通信),可能导致自己的指示又没处理过来,形成死锁。例如BswM请求NoComm后自己等待ComM通知FullComm再开PDU组,这种逻辑就矛盾。要避免BswM同时作为用户和监视者时的循环依赖。
排查建议:
- 在调试环境下断点观察 ComM 是否调用了相应的 BswM接口(可以在 BswM_ComM_CurrentMode stub里加断点)。没调用就是ComM问题,调用了而BswM未动作就是BswM问题。
- 打印或监控 BswM 内部模式值变化,看有没有收到 ComM 发来的模式值。如果有但没触发动作,说明BswM配置没有匹配该模式值,需调整配置。
- 检查 PDU组状态:通过 COM 提供的状态查询(如Com_IsPduGroupEnabled)确认问题PDU组是否真的没变化,排除是上层误解。
6.4 其他常见误区
- Silent Communication用途:很多初学者困惑 COMM_SILENT_COMMUNICATION 模式。它其实用于总线关闭前的同步阶段,在CAN等总线,当准备休眠时会进入Silent使节点不再发送仅接收,以避免干扰别人关机。应用不能主动请求Silent(ComM接口不提供),因此不要尝试让SW-C请求静默模式。
- FullComm不等于通信一定有消息:Full Communication仅表示可以收发,但不代表一定有数据流。如果应用没有发送报文,Bus虽然上线也可能空闲。这常被误解为“通信没起来”。判断通信是否上线应以ComM模式和NM状态为准,而非是否收到了某应用消息。
- ComMUser != 通信ID:切勿将 ComMUser 混淆为 RTE的Mode Declaration。ComMUser是配置实体,有自己的ID,用于ComM内部。RTE传参时不显式传User(已绑定在接口上)。因此应用不需要知道具体User ID,只需要调用自己端口即可。
- 多个用户请求的裁决:ComM自动裁决最高通信需求。例如一个用户请求Full,另一个请求NoComm,结果通道还是Full(除非Limited模式强制NoComm)。这一裁决在ComM内部实现,无需应用干预。但应用要意识到自己的请求可能被别的用户延长通信时间,例如某模块以为发送完成可以NoComm,但因为另一个模块仍在通信,所以通道保持Full。这不是故障,是设计如此。
- 异步时序:ComM_RequestComMode并不会立即生效,它只是设置标志,真正转到FullComm可能要等待BusSM和NM完成。这期间稍有延迟,所以应用在请求后最好通过 ComM_GetCurrentComMode或ModeSwitch确认真的上线,再开始发送大量数据,以免数据发出时总线还未准备好。
7. 附录
7.1 术语中英对照表
术语 | 英文 (缩写) | 说明 |
---|---|---|
通信管理器 | Communication Manager (ComM) | AUTOSAR 模块,负责ECU通信模式管理 |
通信模式 | Communication Mode | 决定通信能力的模式:Full, Silent, No Communication 等 |
全通信模式 | Full Communication (COMM_FULL_COMMUNICATION) | 允许发送接收的模式,正常通信状态 |
静默通信模式 | Silent Communication (COMM_SILENT_COMMUNICATION) | 仅接收不发送,用于网络准备关闭 |
无通信模式 | No Communication (COMM_NO_COMMUNICATION) | 不发送不接收,通信关闭状态 |
通信通道 | Communication Channel | 代表一条物理总线的抽象,在ComM中作为管理单元 |
通信用户 | ComM User | 请求通信的实体,可能是SW-C、BswM等 |
系统用户 | System User | ComM内部的特殊用户,用于默认请求/覆盖请求 |
部分网络集群 | Partial Network Cluster (PNC) | 按功能分组的一组ECU,需同时唤醒休眠 |
内部请求数组 | Internal Request Array (IRA) | 每个通道上的本地PNC请求比特集合 |
外部请求数组 | External Request Array (ERA) | 每个带网关通道的外部PNC请求集合 |
外部和内部请求数组 | External and Internal Request Array (EIRA) | 综合外部+内部PNC请求的集合 |
网络管理 | Network Management (NM) | 管理网络总线休眠唤醒的协议 |
基本软件模式管理 | Basic Software Mode Manager (BswM) | 管理BSW各模块模式交互的模块 |
ECU 状态管理 | ECU State Manager (EcuM) | 管理ECU启动、关断和唤醒的模块 |
默认错误追踪 | Default Error Tracer (Det) | AUTOSAR错误报告模块 |
总线状态管理 | Bus State Manager (CanSM/LinSM/FrSM) | 控制某总线通讯状态的模块,由ComM调用请求 |
调度器 | Scheduler (SchM) | 调度周期任务(如ComM_MainFunction)的机制 |
诊断通信管理 | Diagnostic Communication Manager (DCM) | AUTOSAR诊断模块,可作为ComM用户请求通信 |
唤醒抑制 | Wake-up Inhibition | 防止ECU主动唤醒网络的抑制状态 |
模式限制 | Mode Limitation | 强制限制为No Communication的状态 |
PNI 位 | Partial Network Indicator (PNI bit) | NM报文控制位,指示PNC信息有效性 |
PNC 网关 | PNC Gateway | 连接多个网络转发PNC请求的ECU |
主动/被动网关 | Active/Passive Gateway | 主动转发或被动不转发PNC请求的网关类型 |
同步关断 | Synchronized PNC Shutdown | 协调各ECU同步关闭PNC的机制 |
动态PNC映射 | Dynamic PNC Mapping | 运行期学习更新PNC与通道关联的特性 |
7.2 配置模板示例
(参考第5章给出的伪代码或ARXML片段,此处可列出关键配置片段供读者参考,例如ComMGeneral及ComMChannel的典型设置,略)
7.3 ComM API参考索引
以下列出 AUTOSAR ComM 模块主要的API函数及用途(按功能分类):
- 初始化与配置:
ComM_Init(ConfigPtr)
– 初始化ComMComM_DeInit()
– 反初始化(可选)ComM_GetVersionInfo(verInfo)
– 获取版本信息
- 主运行:
ComM_MainFunction_xxx()
– ComM主状态处理循环(周期调用)
- 模式请求与状态:
ComM_RequestComMode(User, Mode)
– 用户请求通信模式ComM_GetCurrentComMode(User, *Mode)
– 查询用户当前模式ComM_GetMaxComMode(User, *Mode)
– 查询用户当前允许的最高模式
- 抑制控制:
ComM_PreventWakeUp(Channel, True/False)
– 设置/清除总线唤醒抑制ComM_LimitChannelToNoComMode(Channel, True/False)
– 设置/清除通道通信限制ComM_LimitECUToNoComMode(True/False)
– 设置/清除整个ECU通信限制ComM_GetInhibitionStatus(Channel, *Status)
– 获取通道抑制状态标志ComM_ReadInhibitionCounter(*Counter)
– 读取抑制计数器ComM_ResetInhibitionCounter()
– 重置抑制计数器
- 诊断相关:
ComM_DCM_ActiveDiagnostic(Channel)
– 通知进入活动诊断会话ComM_DCM_InactiveDiagnostic(Channel)
– 通知退出诊断会话
- PNC相关:
ComM_GetCurrentPNCComMode(PncId, *PncMode)
– 获取PNC当前模式状态- (一些实现也提供 ComM_RequestPncMode 等,但在规范中通常通过User请求PNC)
ComM_Nm_UpdateEIRA(Channel, EIRA_Bits)
– 网络管理通知EIRA更新ComM_Nm_UpdateERA(Channel, ERA_Bits)
– 网络管理通知ERA更新(PNC网关用)ComM_EcuM_WakeUpIndication(Channel)
– ECU唤醒源通知ComM_EcuM_PNCWakeUpIndication(PncId)
– ECU PNC唤醒通知
- 内部回调(由其他模块调用):
ComM_BusSM_ModeIndication(Channel, Mode)
– 总线状态改变指示ComM_Nm_NetworkMode(Channel)
/ComM_Nm_PrepareBusSleep(Channel)
/ComM_Nm_BusSleepMode(Channel)
– NM状态指示ComM_Nm_PncLearningBitIndication(PncId)
– PNC学习位指示(动态映射)
每个接口均在AUTOSAR SWS中定义了相应的参数和返回值要求,开发者在使用时应参考最新文档(如R24-11版本的 SWS_ComM)以获取精确定义和任何可能的更新。正确配置和调用这些API,将能充分发挥ComM在汽车通信管理中的作用。