AUTOSAR Communication Manager(ComM)详解
规范依据:
AUTOSAR_CP_SWS_COMManager.pdf。
目录
- [1. 模块定位](#1. 模块定位)
- [2. 工程中的模块关系](#2. 工程中的模块关系)
- [3. 通信模式与状态机](#3. 通信模式与状态机)
- [4. 关键操作流程](#4. 关键操作流程)
- [5. API 与回调](#5. API 与回调)
- [6. 主函数和调度](#6. 主函数和调度)
- [7. 当前工程配置](#7. 当前工程配置)
- [8. 代码实现说明](#8. 代码实现说明)
- [9. 排查要点](#9. 排查要点)
- [10. 状态机和配置图总览](#10. 状态机和配置图总览)
- [11. 规范与工程边界](#11. 规范与工程边界)
1. 模块定位
ComM(Communication Manager)管理 ECU 对各通信网络的使用请求,并把多个用户的请求汇总成每个网络通道的目标通信模式。它不直接操作 CAN 控制器,也不解析 CAN 报文;底层控制器、收发器和 PDU 通道由 CanSM、CanIf 和 CAN Driver 完成。
ComM 的核心职责是:
| 职责 | 说明 |
|---|---|
| 用户请求管理 | 接收 SW-C、诊断或 BswM 对 FULL_COMMUNICATION / NO_COMMUNICATION 的请求 |
| 请求汇总 | 一个通道上只要仍有用户请求完整通信,通道就不能因另一个用户释放请求而立即停网 |
| 模式协调 | 将通道目标模式交给 CanSM/Nm,并接收底层模式指示 |
| 通信限制 | 处理 ECU 或通道级的 NoCom 限制、PreventWakeUp 等抑制机制 |
| 状态查询 | 提供请求模式、当前模式、最大允许模式和状态机状态查询 |
| 生命周期配合 | 响应 EcuM 唤醒、网络管理事件、Dcm 诊断活动和 BswM 模式动作 |
ComM 的"请求成功"表示请求已被接收并记录,不等于 CAN 控制器已经启动,更不等于报文已经在总线上发送。最终是否进入 Full Communication,取决于 ComM 主函数、CanSM 状态机、CanIf 异步确认以及底层网络状态。
2. 工程中的模块关系
#mermaid-svg-stitw1QDO9VTFfIJ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-stitw1QDO9VTFfIJ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-stitw1QDO9VTFfIJ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-stitw1QDO9VTFfIJ .error-icon{fill:#552222;}#mermaid-svg-stitw1QDO9VTFfIJ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-stitw1QDO9VTFfIJ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-stitw1QDO9VTFfIJ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-stitw1QDO9VTFfIJ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-stitw1QDO9VTFfIJ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-stitw1QDO9VTFfIJ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-stitw1QDO9VTFfIJ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-stitw1QDO9VTFfIJ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-stitw1QDO9VTFfIJ .marker.cross{stroke:#333333;}#mermaid-svg-stitw1QDO9VTFfIJ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-stitw1QDO9VTFfIJ p{margin:0;}#mermaid-svg-stitw1QDO9VTFfIJ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-stitw1QDO9VTFfIJ .cluster-label text{fill:#333;}#mermaid-svg-stitw1QDO9VTFfIJ .cluster-label span{color:#333;}#mermaid-svg-stitw1QDO9VTFfIJ .cluster-label span p{background-color:transparent;}#mermaid-svg-stitw1QDO9VTFfIJ .label text,#mermaid-svg-stitw1QDO9VTFfIJ span{fill:#333;color:#333;}#mermaid-svg-stitw1QDO9VTFfIJ .node rect,#mermaid-svg-stitw1QDO9VTFfIJ .node circle,#mermaid-svg-stitw1QDO9VTFfIJ .node ellipse,#mermaid-svg-stitw1QDO9VTFfIJ .node polygon,#mermaid-svg-stitw1QDO9VTFfIJ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-stitw1QDO9VTFfIJ .rough-node .label text,#mermaid-svg-stitw1QDO9VTFfIJ .node .label text,#mermaid-svg-stitw1QDO9VTFfIJ .image-shape .label,#mermaid-svg-stitw1QDO9VTFfIJ .icon-shape .label{text-anchor:middle;}#mermaid-svg-stitw1QDO9VTFfIJ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-stitw1QDO9VTFfIJ .rough-node .label,#mermaid-svg-stitw1QDO9VTFfIJ .node .label,#mermaid-svg-stitw1QDO9VTFfIJ .image-shape .label,#mermaid-svg-stitw1QDO9VTFfIJ .icon-shape .label{text-align:center;}#mermaid-svg-stitw1QDO9VTFfIJ .node.clickable{cursor:pointer;}#mermaid-svg-stitw1QDO9VTFfIJ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-stitw1QDO9VTFfIJ .arrowheadPath{fill:#333333;}#mermaid-svg-stitw1QDO9VTFfIJ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-stitw1QDO9VTFfIJ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-stitw1QDO9VTFfIJ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-stitw1QDO9VTFfIJ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-stitw1QDO9VTFfIJ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-stitw1QDO9VTFfIJ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-stitw1QDO9VTFfIJ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-stitw1QDO9VTFfIJ .cluster text{fill:#333;}#mermaid-svg-stitw1QDO9VTFfIJ .cluster span{color:#333;}#mermaid-svg-stitw1QDO9VTFfIJ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-stitw1QDO9VTFfIJ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-stitw1QDO9VTFfIJ rect.text{fill:none;stroke-width:0;}#mermaid-svg-stitw1QDO9VTFfIJ .icon-shape,#mermaid-svg-stitw1QDO9VTFfIJ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-stitw1QDO9VTFfIJ .icon-shape p,#mermaid-svg-stitw1QDO9VTFfIJ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-stitw1QDO9VTFfIJ .icon-shape .label rect,#mermaid-svg-stitw1QDO9VTFfIJ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-stitw1QDO9VTFfIJ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-stitw1QDO9VTFfIJ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-stitw1QDO9VTFfIJ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} RequestComMode
诊断激活/释放
唤醒指示
NetworkMode/BusSleep
RequestComMode
状态指示
状态/模式通知
SW-C / RTE / BswM
Dcm
EcuM
ComM
Nm / CanNm
CanSM
CanIf
CAN Driver / CAN Controller
BswM
| 对端模块 | ComM 交互 | 工程核对点 |
|---|---|---|
| SW-C/RTE/BswM | ComM_RequestComMode、模式查询 |
User ID 与生成配置一致 |
| CanSM | 请求网络模式、接收当前模式 | Channel 与 CanSM network 映射一致 |
| Nm/CanNm | 网络启动、网络模式、准备睡眠、总线睡眠 | Nm 回调使用正确的 NetworkHandle |
| Dcm | 诊断激活和非激活 | 诊断期间的通信请求不能被普通用户错误释放 |
| EcuM | 唤醒指示、PNC 唤醒指示 | 当前工程 PNC 功能关闭,PNC 路径不是有效运行路径 |
| BswM | 当前通信状态、模式动作 | BswM 动作调用应与 ComM 状态转换解耦 |
| SchM/OS | 临界区和周期主函数 | 主函数周期决定模式切换和超时处理延迟 |
3. 通信模式与状态机
3.1 对外通信模式
ComM 对用户主要提供两种请求:
| 模式 | 含义 | 典型结果 |
|---|---|---|
COMM_NO_COMMUNICATION |
当前用户不需要网络通信 | 释放该用户在相关通道上的请求计数 |
COMM_FULL_COMMUNICATION |
当前用户需要完整通信 | 增加相关通道的请求计数,推动网络进入 Full Communication |
规范还定义了 COMM_SILENT_COMMUNICATION 等状态概念。当前工程的 ComM_RequestComMode 只接受 NO_COMMUNICATION 和 FULL_COMMUNICATION;代码中对其它请求值按错误参数处理。
3.2 通道状态
通道状态由 ComM 根据用户请求、底层模式指示和网络管理事件维护。工程实现中应把"请求模式"和"当前模式"分开理解:
#mermaid-svg-BGijRcaiQ0HupOwe{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-BGijRcaiQ0HupOwe .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-BGijRcaiQ0HupOwe .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-BGijRcaiQ0HupOwe .error-icon{fill:#552222;}#mermaid-svg-BGijRcaiQ0HupOwe .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BGijRcaiQ0HupOwe .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-BGijRcaiQ0HupOwe .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BGijRcaiQ0HupOwe .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BGijRcaiQ0HupOwe .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-BGijRcaiQ0HupOwe .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BGijRcaiQ0HupOwe .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BGijRcaiQ0HupOwe .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BGijRcaiQ0HupOwe .marker.cross{stroke:#333333;}#mermaid-svg-BGijRcaiQ0HupOwe svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BGijRcaiQ0HupOwe p{margin:0;}#mermaid-svg-BGijRcaiQ0HupOwe defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-BGijRcaiQ0HupOwe g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-BGijRcaiQ0HupOwe g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-BGijRcaiQ0HupOwe g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-BGijRcaiQ0HupOwe g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-BGijRcaiQ0HupOwe g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-BGijRcaiQ0HupOwe .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-BGijRcaiQ0HupOwe .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-BGijRcaiQ0HupOwe .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-BGijRcaiQ0HupOwe .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-BGijRcaiQ0HupOwe .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-BGijRcaiQ0HupOwe .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-BGijRcaiQ0HupOwe .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-BGijRcaiQ0HupOwe .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BGijRcaiQ0HupOwe .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-BGijRcaiQ0HupOwe .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BGijRcaiQ0HupOwe .edgeLabel .label text{fill:#333;}#mermaid-svg-BGijRcaiQ0HupOwe .label div .edgeLabel{color:#333;}#mermaid-svg-BGijRcaiQ0HupOwe .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-BGijRcaiQ0HupOwe .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-BGijRcaiQ0HupOwe .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-BGijRcaiQ0HupOwe .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-BGijRcaiQ0HupOwe .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-BGijRcaiQ0HupOwe .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BGijRcaiQ0HupOwe .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BGijRcaiQ0HupOwe #statediagram-barbEnd{fill:#333333;}#mermaid-svg-BGijRcaiQ0HupOwe .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BGijRcaiQ0HupOwe .cluster-label,#mermaid-svg-BGijRcaiQ0HupOwe .nodeLabel{color:#131300;}#mermaid-svg-BGijRcaiQ0HupOwe .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-BGijRcaiQ0HupOwe .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-BGijRcaiQ0HupOwe .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-BGijRcaiQ0HupOwe .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-BGijRcaiQ0HupOwe .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-BGijRcaiQ0HupOwe .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-BGijRcaiQ0HupOwe .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-BGijRcaiQ0HupOwe .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-BGijRcaiQ0HupOwe .note-edge{stroke-dasharray:5;}#mermaid-svg-BGijRcaiQ0HupOwe .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-BGijRcaiQ0HupOwe .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-BGijRcaiQ0HupOwe .statediagram-note text{fill:black;}#mermaid-svg-BGijRcaiQ0HupOwe .statediagram-note .nodeLabel{color:black;}#mermaid-svg-BGijRcaiQ0HupOwe .statediagram .edgeLabel{color:red;}#mermaid-svg-BGijRcaiQ0HupOwe #dependencyStart,#mermaid-svg-BGijRcaiQ0HupOwe #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-BGijRcaiQ0HupOwe .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-BGijRcaiQ0HupOwe :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 至少一个用户请求 Full
所有用户释放且无保持原因
底层/配置进入 Silent
Full 请求或网络重新可用
所有用户释放
NO_COM
FULL_COM
SILENT_COM
ComM 不会因为 ComM_RequestComMode(user, FULL) 返回 E_OK 就同步把状态改成 FULL_COM。请求首先更新用户和通道的计数,通道主函数再根据计数和限制条件计算目标状态;CanSM 完成实际网络动作后,通过 ComM_BusSM_ModeIndication 返回当前模式。
3.3 请求汇总
对一个通道,完整通信请求可抽象为:
text
FullComRequestCount = 所有直接关联用户的 FULL 请求数
+ 管理通道/间接通道产生的保持请求
+ 诊断或网络管理保持原因
当计数大于零时,通道不能因单个用户调用 NO_COMMUNICATION 而立即停网;只有所有保持原因都释放,且没有限制或网络管理条件阻止状态转换时,才允许回到 No Communication。
4. 关键操作流程
4.1 初始化
Nm/CanNm CanSM ComM EcuM/BswM Nm/CanNm CanSM ComM EcuM/BswM #mermaid-svg-stEtDT0iCZPIH9qF{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-stEtDT0iCZPIH9qF .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-stEtDT0iCZPIH9qF .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-stEtDT0iCZPIH9qF .error-icon{fill:#552222;}#mermaid-svg-stEtDT0iCZPIH9qF .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-stEtDT0iCZPIH9qF .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-stEtDT0iCZPIH9qF .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-stEtDT0iCZPIH9qF .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-stEtDT0iCZPIH9qF .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-stEtDT0iCZPIH9qF .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-stEtDT0iCZPIH9qF .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-stEtDT0iCZPIH9qF .marker{fill:#333333;stroke:#333333;}#mermaid-svg-stEtDT0iCZPIH9qF .marker.cross{stroke:#333333;}#mermaid-svg-stEtDT0iCZPIH9qF svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-stEtDT0iCZPIH9qF p{margin:0;}#mermaid-svg-stEtDT0iCZPIH9qF .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-stEtDT0iCZPIH9qF text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-stEtDT0iCZPIH9qF .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-stEtDT0iCZPIH9qF .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-stEtDT0iCZPIH9qF .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-stEtDT0iCZPIH9qF .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-stEtDT0iCZPIH9qF #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-stEtDT0iCZPIH9qF .sequenceNumber{fill:white;}#mermaid-svg-stEtDT0iCZPIH9qF #sequencenumber{fill:#333;}#mermaid-svg-stEtDT0iCZPIH9qF #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-stEtDT0iCZPIH9qF .messageText{fill:#333;stroke:none;}#mermaid-svg-stEtDT0iCZPIH9qF .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-stEtDT0iCZPIH9qF .labelText,#mermaid-svg-stEtDT0iCZPIH9qF .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-stEtDT0iCZPIH9qF .loopText,#mermaid-svg-stEtDT0iCZPIH9qF .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-stEtDT0iCZPIH9qF .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-stEtDT0iCZPIH9qF .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-stEtDT0iCZPIH9qF .noteText,#mermaid-svg-stEtDT0iCZPIH9qF .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-stEtDT0iCZPIH9qF .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-stEtDT0iCZPIH9qF .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-stEtDT0iCZPIH9qF .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-stEtDT0iCZPIH9qF .actorPopupMenu{position:absolute;}#mermaid-svg-stEtDT0iCZPIH9qF .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-stEtDT0iCZPIH9qF .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-stEtDT0iCZPIH9qF .actor-man circle,#mermaid-svg-stEtDT0iCZPIH9qF line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-stEtDT0iCZPIH9qF :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ComM_Init(ConfigPtr) 清零用户、通道和状态 RAM 置 ComM_INIT CanSM_Init Nm/CanNm_Init 用户或 BswM 请求 FULL_COM RequestComMode(FULL_COM)
初始化顺序必须满足生成配置的依赖关系。当前启动链中,Com_Init、ComM_Init、Dcm_Init、CanTp_Init、Xcp_Init、CanTrcv_Init 由 BswM StartupTwo action list 执行;ComM 的有效通信请求还要等待 CanSM/CanIf 完成底层初始化。
4.2 请求完整通信
CAN Driver CanIf CanSM ComM User/BswM/RTE CAN Driver CanIf CanSM ComM User/BswM/RTE #mermaid-svg-BEQsTGrcTUIvkVyj{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-BEQsTGrcTUIvkVyj .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-BEQsTGrcTUIvkVyj .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-BEQsTGrcTUIvkVyj .error-icon{fill:#552222;}#mermaid-svg-BEQsTGrcTUIvkVyj .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BEQsTGrcTUIvkVyj .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-BEQsTGrcTUIvkVyj .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BEQsTGrcTUIvkVyj .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BEQsTGrcTUIvkVyj .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-BEQsTGrcTUIvkVyj .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BEQsTGrcTUIvkVyj .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BEQsTGrcTUIvkVyj .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BEQsTGrcTUIvkVyj .marker.cross{stroke:#333333;}#mermaid-svg-BEQsTGrcTUIvkVyj svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BEQsTGrcTUIvkVyj p{margin:0;}#mermaid-svg-BEQsTGrcTUIvkVyj .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-BEQsTGrcTUIvkVyj text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-BEQsTGrcTUIvkVyj .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-BEQsTGrcTUIvkVyj .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-BEQsTGrcTUIvkVyj .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-BEQsTGrcTUIvkVyj .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-BEQsTGrcTUIvkVyj #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-BEQsTGrcTUIvkVyj .sequenceNumber{fill:white;}#mermaid-svg-BEQsTGrcTUIvkVyj #sequencenumber{fill:#333;}#mermaid-svg-BEQsTGrcTUIvkVyj #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-BEQsTGrcTUIvkVyj .messageText{fill:#333;stroke:none;}#mermaid-svg-BEQsTGrcTUIvkVyj .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-BEQsTGrcTUIvkVyj .labelText,#mermaid-svg-BEQsTGrcTUIvkVyj .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-BEQsTGrcTUIvkVyj .loopText,#mermaid-svg-BEQsTGrcTUIvkVyj .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-BEQsTGrcTUIvkVyj .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-BEQsTGrcTUIvkVyj .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-BEQsTGrcTUIvkVyj .noteText,#mermaid-svg-BEQsTGrcTUIvkVyj .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-BEQsTGrcTUIvkVyj .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-BEQsTGrcTUIvkVyj .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-BEQsTGrcTUIvkVyj .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-BEQsTGrcTUIvkVyj .actorPopupMenu{position:absolute;}#mermaid-svg-BEQsTGrcTUIvkVyj .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-BEQsTGrcTUIvkVyj .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-BEQsTGrcTUIvkVyj .actor-man circle,#mermaid-svg-BEQsTGrcTUIvkVyj line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-BEQsTGrcTUIvkVyj :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ComM_RequestComMode(User,FULL_COMMUNICATION) 更新用户请求和通道计数 E_OK 或 COMM_E_MODE_LIMITATION RequestComMode(Channel,FULL_COM) 启动收发器/控制器,设置 PDU 模式 执行硬件操作 异步确认 ModeIndication ComM_BusSM_ModeIndication(FULL) 更新当前模式并通知 BswM
4.3 释放通信
用户调用 ComM_RequestComMode(User, COMM_NO_COMMUNICATION) 后,ComM 只释放该用户对应的请求。若同一通道仍有其它用户、诊断活动或网络管理保持原因,通道仍可保持 Full Communication;当所有保持条件消失后,ComM 主函数驱动 CanSM 执行停网流程。
4.4 网络管理事件
当前工程提供以下 Nm 到 ComM 的回调:
| 回调 | 作用 |
|---|---|
ComM_Nm_NetworkStartIndication |
网络开始活动,推动通道处理启动事件 |
ComM_Nm_NetworkMode |
通知通道进入网络模式 |
ComM_Nm_PrepareBusSleepMode |
通知准备进入总线睡眠 |
ComM_Nm_BusSleepMode |
通知已经进入总线睡眠 |
ComM_Nm_RestartIndication |
通知网络重新启动 |
ComM_Nm_TransmissionFailure |
记录网络管理发送失败 |
ComM_Nm_NetworkTimeoutException |
处理网络管理超时异常 |
这些函数通常只更新 ComM 上下文或事件,状态推进由后续通道主函数完成。调试时不能只看某个回调是否被调用,还要检查下一次 ComM_MainFunction_<Channel> 后的当前状态和对 CanSM 的请求。
5. API 与回调
5.1 用户服务
| API | 用途 | 当前工程实现 |
|---|---|---|
ComM_Init |
初始化 ComM | BSWL/BSW/ComM/src/ComM_Init.c |
ComM_DeInit |
反初始化 | ComM_DeInit.c |
ComM_RequestComMode |
请求 Full/No Communication | ComM_RequestComMode.c |
ComM_GetRequestedComMode |
查询用户请求模式 | ComM_GetRequestedComMode.c |
ComM_GetCurrentComMode |
查询当前通信模式 | ComM_GetCurrentComMode.c |
ComM_GetMaxComMode |
查询用户允许的最大模式 | ComM_GetMaxComMode.c |
ComM_GetState |
查询通道状态机状态 | ComM_GetState.c |
ComM_GetStatus |
查询初始化状态 | ComM_GetStatus.c |
ComM_CommunicationAllowed |
允许/禁止通信 | ComM_CommunicationAllowed.c |
ComM_LimitChannelToNoComMode |
限制通道进入 NoCom | ComM_LimitChannelToNoComMode.c |
ComM_LimitECUToNoComMode |
限制 ECU 进入 NoCom | ComM_LimitECUToNoComMode.c |
ComM_PreventWakeUp |
抑制唤醒 | ComM_PreventWakeUp.c |
当前工程 COMM_DEV_ERROR_DETECT 为 STD_OFF,因此开发错误检查分支不会成为有效运行路径;分析 API 返回行为时应以实际预处理后的配置为准。
5.2 底层和上层回调
| 接口 | 调用方向 | 作用 |
|---|---|---|
ComM_BusSM_ModeIndication |
CanSM -> ComM | 汇报底层实际通信模式 |
ComM_Dcm_ActiveDiagnostic |
Dcm -> ComM | 建立诊断通信保持原因 |
ComM_Dcm_InactiveDiagnostic |
Dcm -> ComM | 释放诊断通信保持原因 |
ComM_EcuM_WakeUpIndication |
EcuM -> ComM | 通知通道唤醒事件 |
ComM_Nm_* |
Nm/CanNm -> ComM | 汇报网络管理事件 |
BswM_ComM_CurrentMode 等 |
ComM -> BswM | 通知模式变化,具体名称由集成配置决定 |
6. 主函数和调度
生成文件为每个通道提供独立主函数:
c
void ComM_MainFunction_ComMChannel_PT_CAN_MCUF0_Channel(void)
{
ComM_Prv_ChannelMainFunction(0);
}
void ComM_MainFunction_ComMChannel_XCP_CAN_Channel(void)
{
ComM_Prv_ChannelMainFunction(1);
}
当前工程的两个 ComM 通道都在 5 ms BSW task 中调度,同时运行 CanSM_MainFunction、Com_MainFunctionRx、Com_MainFunctionTx 和 BswM_MainFunction。主函数负责把已经记录的请求、限制、Nm/Dcm 事件和底层模式指示推进到通道状态机。
调度周期会影响:
- 请求到 CanSM 的最大软件延迟;
- 网络管理保持时间和准备睡眠处理;
- Bus-Off 或唤醒事件的状态转换响应时间;
- BswM 看到当前模式变化的时刻。
ComM 主函数不是 CAN 报文收发任务。CAN 报文由 Can Driver 中断/CanIf/PduR/Com 路径处理,ComM 只管理网络通信可用性。
7. 当前工程配置
以下值来自 BSWL/_gen/BSW/ComM/ComM_Cfg.h 和 ComM_Cfg_Internal.h,并结合 ComM_PBcfg.c 核对:
| 配置项 | 当前值 | 解释 |
|---|---|---|
| 配置变体 | COMM_VARIANT_PRECOMPILE |
当前使用预编译配置路径 |
| 总线类型 | CAN STD_ON |
LIN、FlexRay、Ethernet 为 STD_OFF |
| 通道数 | 2 | PT CAN MCUF0 通道、XCP CAN 通道 |
| 用户数 | 2 | 每个当前 CAN 通道配置一个 ComM user |
| Nm 支持 | STD_ON |
使用 Nm 相关回调和网络管理交互 |
| Dcm 支持 | STD_ON |
诊断通信保持路径有效 |
| PNC | STD_OFF |
PNC 状态、EIRA/ERA 运行路径被条件编译排除 |
| ECU/Channel NoCom 限制 | STD_OFF |
对应功能当前不参与有效逻辑 |
| Prevent WakeUp | STD_OFF |
唤醒抑制配置当前不参与有效逻辑 |
| NVM | STD_OFF |
ComM NVM 保持数据路径关闭 |
| RTE 支持 | STD_OFF |
当前 ComM 配置未启用 ComM RTE 支持分支 |
| 版本信息 API | STD_OFF |
ComM_GetVersionInfo 不是当前有效配置接口 |
有效符号名为:
text
ComMConf_ComMChannel_ComMChannel_PT_CAN_MCUF0_Channel -> 0
ComMConf_ComMChannel_ComMChannel_XCP_CAN_Channel -> 1
ComMConf_ComMUser_ComMUser_PT_CAN_MCUF0_Channel -> 0
ComMConf_ComMUser_ComMUser_XCP_CAN_Channel -> 1
这些是当前生成配置的真实句柄。调用者不能把 CAN controller ID、CanSM network ID、ComM channel ID 和 ComM user ID 当成同一个编号使用,必须依据各模块的生成映射转换。
8. 代码实现说明
8.1 ComM_RequestComMode
当前实现的主要步骤如下:
- 在启用开发错误检测时检查初始化状态、模式值和 User ID;当前配置中该检查被
COMM_DEV_ERROR_DETECT == STD_OFF排除。 - 用
ComM_UserId_MappingTable_acst把外部 User 映射为内部用户索引。 - 更新用户 RAM 中的
RequestedUserMode_u8。 - 只有请求值发生变化时,才遍历用户关联的通道并更新
UserRequestCtr_u16。 - 如启用 PNC,再同步更新 PNC 请求计数;当前
COMM_PNC_ENABLED == STD_OFF,该分支被排除。 - 如启用抑制功能,检查限制计数并可能返回
COMM_E_MODE_LIMITATION;当前抑制功能关闭,因此有效路径最终返回E_OK。
该函数更新的是请求数据和计数,不承担完整的底层启动过程。真正的状态转换在通道主函数中继续执行。
8.2 ComM_Prv_ChannelMainFunction
通道主函数是 ComM 的运行核心,负责处理请求聚合、限制条件、Nm/Dcm 事件、当前模式和 CanSM 交互。它使用通道索引访问生成的 ComM_ChannelStruct 和通道配置,代码中的 0、1 对应当前两个真实生成通道。
8.3 ComM_BusSM_ModeIndication
CanSM 的模式指示是当前模式的底层来源。该回调到达后,ComM 更新通道状态并在需要时通知用户/BswM。若只看到 ComM_RequestComMode 返回 E_OK,而没有看到该指示,不能判定网络已经进入 Full Communication。
8.4 初始化与去初始化
ComM_Init 清理全局、用户和通道运行时对象,建立配置引用并最终置 COMM_INIT。ComM_DeInit 将 ComM 恢复为未初始化状态;在此状态下调用依赖初始化的服务,规范要求返回未初始化错误或报告相应开发错误,具体有效行为受当前错误检测配置影响。
9. 排查要点
9.1 请求返回 COMM_E_MODE_LIMITATION
优先检查:
ComM_Init是否已经完成;- User 是否是当前生成配置中的 0 或 1;
COMM_INHIBITION_ENABLED、COMM_LIMIT_TO_NOCOM_ENABLED、COMM_PREVENT_WAKEUP_ENABLED的真实值;- 该用户关联的通道是否已经存在其它限制或诊断保持原因。
当前配置中抑制、Limit-to-NoCom 和 PreventWakeUp 均关闭,因此若运行时出现限制返回,应先核对实际编译使用的 ComM_Cfg_Internal.h 是否与仓库文件一致。
9.2 请求返回 E_OK 但 CAN 仍无报文
沿以下路径检查:
text
ComM_RequestComMode
-> ComM_MainFunction_<Channel>
-> CanSM_RequestComMode
-> CanIf controller/transceiver mode
-> CanIf PDU mode ONLINE
-> Com_MainFunctionTx / Com transmit
-> CanIf_Transmit -> Can_Write
还要确认 ComM 的当前模式已经通过 ComM_BusSM_ModeIndication 更新为 Full Communication,CanIf controller 已为 STARTED、PDU mode 已为 ONLINE,以及 COM I-PDU group 已启动。ComM 请求成功本身只证明请求被接受。
9.3 网络不能回到 No Communication
检查是否还有其它用户的 Full 请求、Dcm 活动、Nm 保持条件或管理通道请求。不能只观察触发停网的那个 User,因为 ComM 按计数和保持原因聚合全体请求。
9.4 模式切换响应慢
核对两个 ComM 通道主函数是否确实在 5 ms BSW task 中运行,并检查 CanSM 主函数是否同时被调度。随后检查 CanIf/CAN Driver 的异步确认是否到达;只增加 ComM 主函数频率无法修复底层确认丢失或映射错误。
10. 状态机和配置图总览
本节把规范中的状态机拆开说明,并在每个状态旁边标出当前工程可以实际走到的路径。规范章节 7.2 定义 ComM 通道状态机,章节 7.1 定义 PNC 状态机,章节 7.4 定义通信限制,章节 7.5 和 7.6 定义总线及网络管理协调。
10.1 通道状态机总图
通道状态机有三个主状态:COMM_NO_COMMUNICATION、COMM_SILENT_COMMUNICATION 和 COMM_FULL_COMMUNICATION。其中 No Communication 有两个子状态,Full Communication 有两个子状态。ComM_Types.h 的 ComM_StateType 枚举与此一致。
#mermaid-svg-U8TO5YsRMZ15FyYM{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-U8TO5YsRMZ15FyYM .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-U8TO5YsRMZ15FyYM .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-U8TO5YsRMZ15FyYM .error-icon{fill:#552222;}#mermaid-svg-U8TO5YsRMZ15FyYM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-U8TO5YsRMZ15FyYM .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-U8TO5YsRMZ15FyYM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-U8TO5YsRMZ15FyYM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-U8TO5YsRMZ15FyYM .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-U8TO5YsRMZ15FyYM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-U8TO5YsRMZ15FyYM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-U8TO5YsRMZ15FyYM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-U8TO5YsRMZ15FyYM .marker.cross{stroke:#333333;}#mermaid-svg-U8TO5YsRMZ15FyYM svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-U8TO5YsRMZ15FyYM p{margin:0;}#mermaid-svg-U8TO5YsRMZ15FyYM defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-U8TO5YsRMZ15FyYM g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-U8TO5YsRMZ15FyYM g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-U8TO5YsRMZ15FyYM g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-U8TO5YsRMZ15FyYM g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-U8TO5YsRMZ15FyYM g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-U8TO5YsRMZ15FyYM .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-U8TO5YsRMZ15FyYM .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-U8TO5YsRMZ15FyYM .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-U8TO5YsRMZ15FyYM .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-U8TO5YsRMZ15FyYM .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-U8TO5YsRMZ15FyYM .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-U8TO5YsRMZ15FyYM .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-U8TO5YsRMZ15FyYM .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-U8TO5YsRMZ15FyYM .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-U8TO5YsRMZ15FyYM .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-U8TO5YsRMZ15FyYM .edgeLabel .label text{fill:#333;}#mermaid-svg-U8TO5YsRMZ15FyYM .label div .edgeLabel{color:#333;}#mermaid-svg-U8TO5YsRMZ15FyYM .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-U8TO5YsRMZ15FyYM .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-U8TO5YsRMZ15FyYM .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-U8TO5YsRMZ15FyYM .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-U8TO5YsRMZ15FyYM .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-U8TO5YsRMZ15FyYM .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-U8TO5YsRMZ15FyYM .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-U8TO5YsRMZ15FyYM #statediagram-barbEnd{fill:#333333;}#mermaid-svg-U8TO5YsRMZ15FyYM .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-U8TO5YsRMZ15FyYM .cluster-label,#mermaid-svg-U8TO5YsRMZ15FyYM .nodeLabel{color:#131300;}#mermaid-svg-U8TO5YsRMZ15FyYM .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-U8TO5YsRMZ15FyYM .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-U8TO5YsRMZ15FyYM .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-U8TO5YsRMZ15FyYM .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-U8TO5YsRMZ15FyYM .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-U8TO5YsRMZ15FyYM .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-U8TO5YsRMZ15FyYM .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-U8TO5YsRMZ15FyYM .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-U8TO5YsRMZ15FyYM .note-edge{stroke-dasharray:5;}#mermaid-svg-U8TO5YsRMZ15FyYM .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-U8TO5YsRMZ15FyYM .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-U8TO5YsRMZ15FyYM .statediagram-note text{fill:black;}#mermaid-svg-U8TO5YsRMZ15FyYM .statediagram-note .nodeLabel{color:black;}#mermaid-svg-U8TO5YsRMZ15FyYM .statediagram .edgeLabel{color:red;}#mermaid-svg-U8TO5YsRMZ15FyYM #dependencyStart,#mermaid-svg-U8TO5YsRMZ15FyYM #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-U8TO5YsRMZ15FyYM .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-U8TO5YsRMZ15FyYM :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} COMM_FULL_COMMUNICATION
COMM_NO_COMMUNICATION
Active/Passive request
no request
CommunicationAllowed = TRUE
no active request / timer expired
active request
PrepareBusSleep indication
BusSleep indication
BusSleep indication
user / DCM / wake-up / restart
NetworkMode indication
BusSleep indication
Light timeout / internal bus rule
COMM_NO_COM_NO_PENDING_REQUEST
COMM_NO_COM_REQUEST_PENDING
COMM_FULL_COM_NETWORK_REQUESTED
COMM_FULL_COM_READY_SLEEP
COMM_SILENT_COMMUNICATION
状态机中的主状态向用户表达通信能力,子状态用于协调网络关闭过程。用户通常只能请求 Full 或 No;Silent 是由网络管理和总线状态推动的内部协调状态。
| 状态 | 发送 | 接收 | 网络管理含义 | 进入后的关键动作 |
|---|---|---|---|---|
| COMM_NO_COMMUNICATION | 关闭 | 关闭 | 释放网络 | 请求 BusSM 进入 NoCom;NmVariant=FULL 时释放 NM 网络请求 |
| COMM_NO_COM_NO_PENDING_REQUEST | 关闭 | 关闭 | 无待处理请求 | 等待用户、DCM、EcuM 唤醒或 Nm 重启事件 |
| COMM_NO_COM_REQUEST_PENDING | 仍未打开 | 仍未打开 | 等待允许通信 | 只有 CommunicationAllowed=TRUE 才进入 Full 启动子状态 |
| COMM_FULL_COM_NETWORK_REQUESTED | 允许 | 允许 | 网络被请求或最低 Full 时间未到 | FULL 变体调用 Nm_NetworkRequest;LIGHT/NONE 管理最小 Full 时间 |
| COMM_FULL_COM_READY_SLEEP | 由下层协调 | 由下层协调 | 本 ECU 不再主动保持网络,但等待同步关闭 | FULL/PASSIVE 变体调用 NM 释放或被动启动动作 |
| COMM_SILENT_COM | 关闭 | 允许 | 网络准备睡眠但仍可接收 | 等待 NetworkMode 或 BusSleep 指示 |
10.2 No Communication 两个子状态
10.2.1 COMM_NO_COM_NO_PENDING_REQUEST
这是初始化后的默认子状态。当前工程 ComM_Init 将 ChannelState_e 置为该值,同时把 ChannelMode_u8 和 BusSmMode_u8 置为 COMM_NO_COMMUNICATION。初始化进入默认状态时,规范不要求向尚未初始化完成的 RTE/BswM 报告模式变化。
#mermaid-svg-1BwnTSf1NzuUzLH2{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-1BwnTSf1NzuUzLH2 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-1BwnTSf1NzuUzLH2 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-1BwnTSf1NzuUzLH2 .error-icon{fill:#552222;}#mermaid-svg-1BwnTSf1NzuUzLH2 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-1BwnTSf1NzuUzLH2 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-1BwnTSf1NzuUzLH2 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-1BwnTSf1NzuUzLH2 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-1BwnTSf1NzuUzLH2 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-1BwnTSf1NzuUzLH2 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-1BwnTSf1NzuUzLH2 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-1BwnTSf1NzuUzLH2 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-1BwnTSf1NzuUzLH2 .marker.cross{stroke:#333333;}#mermaid-svg-1BwnTSf1NzuUzLH2 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-1BwnTSf1NzuUzLH2 p{margin:0;}#mermaid-svg-1BwnTSf1NzuUzLH2 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-1BwnTSf1NzuUzLH2 .cluster-label text{fill:#333;}#mermaid-svg-1BwnTSf1NzuUzLH2 .cluster-label span{color:#333;}#mermaid-svg-1BwnTSf1NzuUzLH2 .cluster-label span p{background-color:transparent;}#mermaid-svg-1BwnTSf1NzuUzLH2 .label text,#mermaid-svg-1BwnTSf1NzuUzLH2 span{fill:#333;color:#333;}#mermaid-svg-1BwnTSf1NzuUzLH2 .node rect,#mermaid-svg-1BwnTSf1NzuUzLH2 .node circle,#mermaid-svg-1BwnTSf1NzuUzLH2 .node ellipse,#mermaid-svg-1BwnTSf1NzuUzLH2 .node polygon,#mermaid-svg-1BwnTSf1NzuUzLH2 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-1BwnTSf1NzuUzLH2 .rough-node .label text,#mermaid-svg-1BwnTSf1NzuUzLH2 .node .label text,#mermaid-svg-1BwnTSf1NzuUzLH2 .image-shape .label,#mermaid-svg-1BwnTSf1NzuUzLH2 .icon-shape .label{text-anchor:middle;}#mermaid-svg-1BwnTSf1NzuUzLH2 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-1BwnTSf1NzuUzLH2 .rough-node .label,#mermaid-svg-1BwnTSf1NzuUzLH2 .node .label,#mermaid-svg-1BwnTSf1NzuUzLH2 .image-shape .label,#mermaid-svg-1BwnTSf1NzuUzLH2 .icon-shape .label{text-align:center;}#mermaid-svg-1BwnTSf1NzuUzLH2 .node.clickable{cursor:pointer;}#mermaid-svg-1BwnTSf1NzuUzLH2 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-1BwnTSf1NzuUzLH2 .arrowheadPath{fill:#333333;}#mermaid-svg-1BwnTSf1NzuUzLH2 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-1BwnTSf1NzuUzLH2 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-1BwnTSf1NzuUzLH2 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1BwnTSf1NzuUzLH2 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-1BwnTSf1NzuUzLH2 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1BwnTSf1NzuUzLH2 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-1BwnTSf1NzuUzLH2 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-1BwnTSf1NzuUzLH2 .cluster text{fill:#333;}#mermaid-svg-1BwnTSf1NzuUzLH2 .cluster span{color:#333;}#mermaid-svg-1BwnTSf1NzuUzLH2 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-1BwnTSf1NzuUzLH2 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-1BwnTSf1NzuUzLH2 rect.text{fill:none;stroke-width:0;}#mermaid-svg-1BwnTSf1NzuUzLH2 .icon-shape,#mermaid-svg-1BwnTSf1NzuUzLH2 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1BwnTSf1NzuUzLH2 .icon-shape p,#mermaid-svg-1BwnTSf1NzuUzLH2 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-1BwnTSf1NzuUzLH2 .icon-shape .label rect,#mermaid-svg-1BwnTSf1NzuUzLH2 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1BwnTSf1NzuUzLH2 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-1BwnTSf1NzuUzLH2 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-1BwnTSf1NzuUzLH2 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 无 Active、无 Passive
用户 Full
DCM ActiveDiagnostic
EcuM WakeUp 或 Nm Restart
是
否
进入 NO_COM_NO_PENDING_REQUEST
发送和接收能力保持关闭
本次主函数快照有请求?
保持当前状态
模式限制是否忽略该请求?
进入 REQUEST_PENDING
进入 REQUEST_PENDING
进入 NO_COM_REQUEST_PENDING
当前实现 ComM_Prv_NoComNoPending_StateHandling 只查看主函数开始时形成的 ActiveRequest_b 和 PassiveRequest_b 快照;本次主函数运行期间新产生的请求在下一次快照中处理。
10.2.2 COMM_NO_COM_REQUEST_PENDING
该状态表示 ComM 已经看到通信需求,但通信是否可以启动还受到 CommunicationAllowed 控制。它不是控制器正在启动的硬件状态,而是 ComM 在正式请求 BusSM 前的等待状态。
#mermaid-svg-ftDzMMhCbeoejmYo{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ftDzMMhCbeoejmYo .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ftDzMMhCbeoejmYo .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ftDzMMhCbeoejmYo .error-icon{fill:#552222;}#mermaid-svg-ftDzMMhCbeoejmYo .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ftDzMMhCbeoejmYo .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ftDzMMhCbeoejmYo .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ftDzMMhCbeoejmYo .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ftDzMMhCbeoejmYo .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ftDzMMhCbeoejmYo .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ftDzMMhCbeoejmYo .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ftDzMMhCbeoejmYo .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ftDzMMhCbeoejmYo .marker.cross{stroke:#333333;}#mermaid-svg-ftDzMMhCbeoejmYo svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ftDzMMhCbeoejmYo p{margin:0;}#mermaid-svg-ftDzMMhCbeoejmYo .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ftDzMMhCbeoejmYo .cluster-label text{fill:#333;}#mermaid-svg-ftDzMMhCbeoejmYo .cluster-label span{color:#333;}#mermaid-svg-ftDzMMhCbeoejmYo .cluster-label span p{background-color:transparent;}#mermaid-svg-ftDzMMhCbeoejmYo .label text,#mermaid-svg-ftDzMMhCbeoejmYo span{fill:#333;color:#333;}#mermaid-svg-ftDzMMhCbeoejmYo .node rect,#mermaid-svg-ftDzMMhCbeoejmYo .node circle,#mermaid-svg-ftDzMMhCbeoejmYo .node ellipse,#mermaid-svg-ftDzMMhCbeoejmYo .node polygon,#mermaid-svg-ftDzMMhCbeoejmYo .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ftDzMMhCbeoejmYo .rough-node .label text,#mermaid-svg-ftDzMMhCbeoejmYo .node .label text,#mermaid-svg-ftDzMMhCbeoejmYo .image-shape .label,#mermaid-svg-ftDzMMhCbeoejmYo .icon-shape .label{text-anchor:middle;}#mermaid-svg-ftDzMMhCbeoejmYo .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ftDzMMhCbeoejmYo .rough-node .label,#mermaid-svg-ftDzMMhCbeoejmYo .node .label,#mermaid-svg-ftDzMMhCbeoejmYo .image-shape .label,#mermaid-svg-ftDzMMhCbeoejmYo .icon-shape .label{text-align:center;}#mermaid-svg-ftDzMMhCbeoejmYo .node.clickable{cursor:pointer;}#mermaid-svg-ftDzMMhCbeoejmYo .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ftDzMMhCbeoejmYo .arrowheadPath{fill:#333333;}#mermaid-svg-ftDzMMhCbeoejmYo .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ftDzMMhCbeoejmYo .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ftDzMMhCbeoejmYo .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ftDzMMhCbeoejmYo .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ftDzMMhCbeoejmYo .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ftDzMMhCbeoejmYo .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ftDzMMhCbeoejmYo .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ftDzMMhCbeoejmYo .cluster text{fill:#333;}#mermaid-svg-ftDzMMhCbeoejmYo .cluster span{color:#333;}#mermaid-svg-ftDzMMhCbeoejmYo div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ftDzMMhCbeoejmYo .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ftDzMMhCbeoejmYo rect.text{fill:none;stroke-width:0;}#mermaid-svg-ftDzMMhCbeoejmYo .icon-shape,#mermaid-svg-ftDzMMhCbeoejmYo .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ftDzMMhCbeoejmYo .icon-shape p,#mermaid-svg-ftDzMMhCbeoejmYo .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ftDzMMhCbeoejmYo .icon-shape .label rect,#mermaid-svg-ftDzMMhCbeoejmYo .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ftDzMMhCbeoejmYo .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ftDzMMhCbeoejmYo .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ftDzMMhCbeoejmYo :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} FALSE
是
否
TRUE
进入 NO_COM_REQUEST_PENDING
CommunicationAllowed?
Active 或 Passive request 仍存在?
保持等待
返回 NO_COM_NO_PENDING_REQUEST
进入 FULL_COM_NETWORK_REQUESTED
清除已处理的 PassiveRequest 标志
在当前代码中,CommunicationAllowed=FALSE 时,即使已经存在 Full 请求,也不会继续进入 FULL_COM_NETWORK_REQUESTED;如果请求已经消失,则退回无待处理请求状态。
10.3 Full Communication 两个子状态
10.3.1 COMM_FULL_COM_NETWORK_REQUESTED
这是 Full Communication 下的网络请求阶段。进入动作和循环动作依赖 ComMNmVariant:
#mermaid-svg-AV8iZvQvD8Bo59oU{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-AV8iZvQvD8Bo59oU .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-AV8iZvQvD8Bo59oU .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-AV8iZvQvD8Bo59oU .error-icon{fill:#552222;}#mermaid-svg-AV8iZvQvD8Bo59oU .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-AV8iZvQvD8Bo59oU .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-AV8iZvQvD8Bo59oU .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-AV8iZvQvD8Bo59oU .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-AV8iZvQvD8Bo59oU .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-AV8iZvQvD8Bo59oU .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-AV8iZvQvD8Bo59oU .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-AV8iZvQvD8Bo59oU .marker{fill:#333333;stroke:#333333;}#mermaid-svg-AV8iZvQvD8Bo59oU .marker.cross{stroke:#333333;}#mermaid-svg-AV8iZvQvD8Bo59oU svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-AV8iZvQvD8Bo59oU p{margin:0;}#mermaid-svg-AV8iZvQvD8Bo59oU .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-AV8iZvQvD8Bo59oU .cluster-label text{fill:#333;}#mermaid-svg-AV8iZvQvD8Bo59oU .cluster-label span{color:#333;}#mermaid-svg-AV8iZvQvD8Bo59oU .cluster-label span p{background-color:transparent;}#mermaid-svg-AV8iZvQvD8Bo59oU .label text,#mermaid-svg-AV8iZvQvD8Bo59oU span{fill:#333;color:#333;}#mermaid-svg-AV8iZvQvD8Bo59oU .node rect,#mermaid-svg-AV8iZvQvD8Bo59oU .node circle,#mermaid-svg-AV8iZvQvD8Bo59oU .node ellipse,#mermaid-svg-AV8iZvQvD8Bo59oU .node polygon,#mermaid-svg-AV8iZvQvD8Bo59oU .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-AV8iZvQvD8Bo59oU .rough-node .label text,#mermaid-svg-AV8iZvQvD8Bo59oU .node .label text,#mermaid-svg-AV8iZvQvD8Bo59oU .image-shape .label,#mermaid-svg-AV8iZvQvD8Bo59oU .icon-shape .label{text-anchor:middle;}#mermaid-svg-AV8iZvQvD8Bo59oU .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-AV8iZvQvD8Bo59oU .rough-node .label,#mermaid-svg-AV8iZvQvD8Bo59oU .node .label,#mermaid-svg-AV8iZvQvD8Bo59oU .image-shape .label,#mermaid-svg-AV8iZvQvD8Bo59oU .icon-shape .label{text-align:center;}#mermaid-svg-AV8iZvQvD8Bo59oU .node.clickable{cursor:pointer;}#mermaid-svg-AV8iZvQvD8Bo59oU .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-AV8iZvQvD8Bo59oU .arrowheadPath{fill:#333333;}#mermaid-svg-AV8iZvQvD8Bo59oU .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-AV8iZvQvD8Bo59oU .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-AV8iZvQvD8Bo59oU .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AV8iZvQvD8Bo59oU .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-AV8iZvQvD8Bo59oU .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AV8iZvQvD8Bo59oU .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-AV8iZvQvD8Bo59oU .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-AV8iZvQvD8Bo59oU .cluster text{fill:#333;}#mermaid-svg-AV8iZvQvD8Bo59oU .cluster span{color:#333;}#mermaid-svg-AV8iZvQvD8Bo59oU div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-AV8iZvQvD8Bo59oU .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-AV8iZvQvD8Bo59oU rect.text{fill:none;stroke-width:0;}#mermaid-svg-AV8iZvQvD8Bo59oU .icon-shape,#mermaid-svg-AV8iZvQvD8Bo59oU .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AV8iZvQvD8Bo59oU .icon-shape p,#mermaid-svg-AV8iZvQvD8Bo59oU .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-AV8iZvQvD8Bo59oU .icon-shape .label rect,#mermaid-svg-AV8iZvQvD8Bo59oU .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AV8iZvQvD8Bo59oU .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-AV8iZvQvD8Bo59oU .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-AV8iZvQvD8Bo59oU :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} FULL
是
否
PASSIVE
LIGHT 或 NONE
是
否
是
否
否
是
进入 FULL_COM_NETWORK_REQUESTED
ComMNmVariant
Active request?
Nm_NetworkRequest
进入 READY_SLEEP
直接进入 READY_SLEEP
启动 TMinFullComModeDuration
循环检查
BusSleep indication?
回到 NO_COM_NO_PENDING_REQUEST
仍有 Active request?
LIGHT 或 NONE 最小 Full 时间到期?
FULL 变体下,Active request 优先维持网络请求;收到 BusSleep 指示时直接回到 NoCom 子状态。LIGHT/NONE 变体下,当前实现使用 MinFullComTimeoutCtr_u16 保证最小 Full 通信持续时间,计时未到期前不会进入 Ready Sleep。
10.3.2 COMM_FULL_COM_READY_SLEEP
Ready Sleep 是关闭同步的关键中间状态。它表示当前 ECU 已经没有需要主动保持网络的 Active request,但仍要等待 Nm 或总线状态确认整个网络可以关闭。
#mermaid-svg-Vu0Uh7wFthg7QbQB{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Vu0Uh7wFthg7QbQB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Vu0Uh7wFthg7QbQB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Vu0Uh7wFthg7QbQB .error-icon{fill:#552222;}#mermaid-svg-Vu0Uh7wFthg7QbQB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Vu0Uh7wFthg7QbQB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Vu0Uh7wFthg7QbQB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Vu0Uh7wFthg7QbQB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Vu0Uh7wFthg7QbQB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Vu0Uh7wFthg7QbQB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Vu0Uh7wFthg7QbQB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Vu0Uh7wFthg7QbQB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Vu0Uh7wFthg7QbQB .marker.cross{stroke:#333333;}#mermaid-svg-Vu0Uh7wFthg7QbQB svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Vu0Uh7wFthg7QbQB p{margin:0;}#mermaid-svg-Vu0Uh7wFthg7QbQB .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Vu0Uh7wFthg7QbQB .cluster-label text{fill:#333;}#mermaid-svg-Vu0Uh7wFthg7QbQB .cluster-label span{color:#333;}#mermaid-svg-Vu0Uh7wFthg7QbQB .cluster-label span p{background-color:transparent;}#mermaid-svg-Vu0Uh7wFthg7QbQB .label text,#mermaid-svg-Vu0Uh7wFthg7QbQB span{fill:#333;color:#333;}#mermaid-svg-Vu0Uh7wFthg7QbQB .node rect,#mermaid-svg-Vu0Uh7wFthg7QbQB .node circle,#mermaid-svg-Vu0Uh7wFthg7QbQB .node ellipse,#mermaid-svg-Vu0Uh7wFthg7QbQB .node polygon,#mermaid-svg-Vu0Uh7wFthg7QbQB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Vu0Uh7wFthg7QbQB .rough-node .label text,#mermaid-svg-Vu0Uh7wFthg7QbQB .node .label text,#mermaid-svg-Vu0Uh7wFthg7QbQB .image-shape .label,#mermaid-svg-Vu0Uh7wFthg7QbQB .icon-shape .label{text-anchor:middle;}#mermaid-svg-Vu0Uh7wFthg7QbQB .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Vu0Uh7wFthg7QbQB .rough-node .label,#mermaid-svg-Vu0Uh7wFthg7QbQB .node .label,#mermaid-svg-Vu0Uh7wFthg7QbQB .image-shape .label,#mermaid-svg-Vu0Uh7wFthg7QbQB .icon-shape .label{text-align:center;}#mermaid-svg-Vu0Uh7wFthg7QbQB .node.clickable{cursor:pointer;}#mermaid-svg-Vu0Uh7wFthg7QbQB .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Vu0Uh7wFthg7QbQB .arrowheadPath{fill:#333333;}#mermaid-svg-Vu0Uh7wFthg7QbQB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Vu0Uh7wFthg7QbQB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Vu0Uh7wFthg7QbQB .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Vu0Uh7wFthg7QbQB .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Vu0Uh7wFthg7QbQB .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Vu0Uh7wFthg7QbQB .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Vu0Uh7wFthg7QbQB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Vu0Uh7wFthg7QbQB .cluster text{fill:#333;}#mermaid-svg-Vu0Uh7wFthg7QbQB .cluster span{color:#333;}#mermaid-svg-Vu0Uh7wFthg7QbQB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Vu0Uh7wFthg7QbQB .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Vu0Uh7wFthg7QbQB rect.text{fill:none;stroke-width:0;}#mermaid-svg-Vu0Uh7wFthg7QbQB .icon-shape,#mermaid-svg-Vu0Uh7wFthg7QbQB .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Vu0Uh7wFthg7QbQB .icon-shape p,#mermaid-svg-Vu0Uh7wFthg7QbQB .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Vu0Uh7wFthg7QbQB .icon-shape .label rect,#mermaid-svg-Vu0Uh7wFthg7QbQB .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Vu0Uh7wFthg7QbQB .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Vu0Uh7wFthg7QbQB .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Vu0Uh7wFthg7QbQB :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
FULL 且已请求网络
FULL 且被动进入
PASSIVE
LIGHT
NONE 加 INTERNAL bus
NONE 加外部 bus
否
是
否
是
否
是
否
进入 FULL_COM_READY_SLEEP
从 NETWORK_REQUESTED 进入?
ComMNmVariant
Nm_NetworkRelease
Nm_PassiveStartUp
启动 NmLightTimeout
直接进入 NO_COM
保持 Ready Sleep 至掉电
等待和处理当前 Ready Sleep 事件
Active request?
回到 NETWORK_REQUESTED
PrepareBusSleep?
进入 SILENT_COMMUNICATION
BusSleep?
进入 NO_COM_NO_PENDING_REQUEST
当前 ComM_Prv_FullComReadySleep_StateHandling 对 FULL、PASSIVE、LIGHT、NONE 分别处理 NM 释放、被动启动、轻量超时和内部总线直接收敛等路径。调试时必须同时记录 ComMNmVariant,不能只根据通道是 CAN 就推断一定会调用 Nm_NetworkRelease。
10.4 Silent Communication 状态
Silent Communication 不是用户直接请求的常规模式。它由 Nm_PrepareBusSleep 等网络关闭流程触发,目标是停止发送但继续接收,给网络管理和其它节点留出同步时间。
#mermaid-svg-bSlVdSbfuELrRm8h{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-bSlVdSbfuELrRm8h .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-bSlVdSbfuELrRm8h .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-bSlVdSbfuELrRm8h .error-icon{fill:#552222;}#mermaid-svg-bSlVdSbfuELrRm8h .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-bSlVdSbfuELrRm8h .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-bSlVdSbfuELrRm8h .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-bSlVdSbfuELrRm8h .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-bSlVdSbfuELrRm8h .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-bSlVdSbfuELrRm8h .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-bSlVdSbfuELrRm8h .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-bSlVdSbfuELrRm8h .marker{fill:#333333;stroke:#333333;}#mermaid-svg-bSlVdSbfuELrRm8h .marker.cross{stroke:#333333;}#mermaid-svg-bSlVdSbfuELrRm8h svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-bSlVdSbfuELrRm8h p{margin:0;}#mermaid-svg-bSlVdSbfuELrRm8h defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-bSlVdSbfuELrRm8h g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-bSlVdSbfuELrRm8h g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-bSlVdSbfuELrRm8h g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-bSlVdSbfuELrRm8h g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-bSlVdSbfuELrRm8h g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-bSlVdSbfuELrRm8h .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-bSlVdSbfuELrRm8h .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-bSlVdSbfuELrRm8h .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-bSlVdSbfuELrRm8h .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-bSlVdSbfuELrRm8h .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-bSlVdSbfuELrRm8h .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-bSlVdSbfuELrRm8h .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-bSlVdSbfuELrRm8h .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-bSlVdSbfuELrRm8h .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-bSlVdSbfuELrRm8h .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-bSlVdSbfuELrRm8h .edgeLabel .label text{fill:#333;}#mermaid-svg-bSlVdSbfuELrRm8h .label div .edgeLabel{color:#333;}#mermaid-svg-bSlVdSbfuELrRm8h .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-bSlVdSbfuELrRm8h .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-bSlVdSbfuELrRm8h .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-bSlVdSbfuELrRm8h .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-bSlVdSbfuELrRm8h .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-bSlVdSbfuELrRm8h .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-bSlVdSbfuELrRm8h .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-bSlVdSbfuELrRm8h #statediagram-barbEnd{fill:#333333;}#mermaid-svg-bSlVdSbfuELrRm8h .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-bSlVdSbfuELrRm8h .cluster-label,#mermaid-svg-bSlVdSbfuELrRm8h .nodeLabel{color:#131300;}#mermaid-svg-bSlVdSbfuELrRm8h .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-bSlVdSbfuELrRm8h .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-bSlVdSbfuELrRm8h .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-bSlVdSbfuELrRm8h .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-bSlVdSbfuELrRm8h .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-bSlVdSbfuELrRm8h .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-bSlVdSbfuELrRm8h .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-bSlVdSbfuELrRm8h .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-bSlVdSbfuELrRm8h .note-edge{stroke-dasharray:5;}#mermaid-svg-bSlVdSbfuELrRm8h .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-bSlVdSbfuELrRm8h .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-bSlVdSbfuELrRm8h .statediagram-note text{fill:black;}#mermaid-svg-bSlVdSbfuELrRm8h .statediagram-note .nodeLabel{color:black;}#mermaid-svg-bSlVdSbfuELrRm8h .statediagram .edgeLabel{color:red;}#mermaid-svg-bSlVdSbfuELrRm8h #dependencyStart,#mermaid-svg-bSlVdSbfuELrRm8h #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-bSlVdSbfuELrRm8h .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-bSlVdSbfuELrRm8h :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Nm_PrepareBusSleep
Nm_NetworkMode
Nm_BusSleep
restart or active handling
COMM_FULL_COM_READY_SLEEP
COMM_SILENT_COMMUNICATION
COMM_NO_COM_NO_PENDING_REQUEST
#mermaid-svg-I7EKzYzylXQNUKuS{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-I7EKzYzylXQNUKuS .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-I7EKzYzylXQNUKuS .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-I7EKzYzylXQNUKuS .error-icon{fill:#552222;}#mermaid-svg-I7EKzYzylXQNUKuS .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-I7EKzYzylXQNUKuS .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-I7EKzYzylXQNUKuS .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-I7EKzYzylXQNUKuS .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-I7EKzYzylXQNUKuS .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-I7EKzYzylXQNUKuS .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-I7EKzYzylXQNUKuS .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-I7EKzYzylXQNUKuS .marker{fill:#333333;stroke:#333333;}#mermaid-svg-I7EKzYzylXQNUKuS .marker.cross{stroke:#333333;}#mermaid-svg-I7EKzYzylXQNUKuS svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-I7EKzYzylXQNUKuS p{margin:0;}#mermaid-svg-I7EKzYzylXQNUKuS .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-I7EKzYzylXQNUKuS .cluster-label text{fill:#333;}#mermaid-svg-I7EKzYzylXQNUKuS .cluster-label span{color:#333;}#mermaid-svg-I7EKzYzylXQNUKuS .cluster-label span p{background-color:transparent;}#mermaid-svg-I7EKzYzylXQNUKuS .label text,#mermaid-svg-I7EKzYzylXQNUKuS span{fill:#333;color:#333;}#mermaid-svg-I7EKzYzylXQNUKuS .node rect,#mermaid-svg-I7EKzYzylXQNUKuS .node circle,#mermaid-svg-I7EKzYzylXQNUKuS .node ellipse,#mermaid-svg-I7EKzYzylXQNUKuS .node polygon,#mermaid-svg-I7EKzYzylXQNUKuS .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-I7EKzYzylXQNUKuS .rough-node .label text,#mermaid-svg-I7EKzYzylXQNUKuS .node .label text,#mermaid-svg-I7EKzYzylXQNUKuS .image-shape .label,#mermaid-svg-I7EKzYzylXQNUKuS .icon-shape .label{text-anchor:middle;}#mermaid-svg-I7EKzYzylXQNUKuS .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-I7EKzYzylXQNUKuS .rough-node .label,#mermaid-svg-I7EKzYzylXQNUKuS .node .label,#mermaid-svg-I7EKzYzylXQNUKuS .image-shape .label,#mermaid-svg-I7EKzYzylXQNUKuS .icon-shape .label{text-align:center;}#mermaid-svg-I7EKzYzylXQNUKuS .node.clickable{cursor:pointer;}#mermaid-svg-I7EKzYzylXQNUKuS .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-I7EKzYzylXQNUKuS .arrowheadPath{fill:#333333;}#mermaid-svg-I7EKzYzylXQNUKuS .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-I7EKzYzylXQNUKuS .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-I7EKzYzylXQNUKuS .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-I7EKzYzylXQNUKuS .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-I7EKzYzylXQNUKuS .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-I7EKzYzylXQNUKuS .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-I7EKzYzylXQNUKuS .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-I7EKzYzylXQNUKuS .cluster text{fill:#333;}#mermaid-svg-I7EKzYzylXQNUKuS .cluster span{color:#333;}#mermaid-svg-I7EKzYzylXQNUKuS div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-I7EKzYzylXQNUKuS .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-I7EKzYzylXQNUKuS rect.text{fill:none;stroke-width:0;}#mermaid-svg-I7EKzYzylXQNUKuS .icon-shape,#mermaid-svg-I7EKzYzylXQNUKuS .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-I7EKzYzylXQNUKuS .icon-shape p,#mermaid-svg-I7EKzYzylXQNUKuS .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-I7EKzYzylXQNUKuS .icon-shape .label rect,#mermaid-svg-I7EKzYzylXQNUKuS .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-I7EKzYzylXQNUKuS .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-I7EKzYzylXQNUKuS .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-I7EKzYzylXQNUKuS :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
是
否
进入 SILENT_COMMUNICATION
向 BusSM 请求 Silent Communication
发送能力关闭,接收能力保持
Nm_NetworkMode?
回到 FULL_COM_READY_SLEEP
Nm_BusSleep 或 BusSM_BusSleep?
进入 NO_COM_NO_PENDING_REQUEST
保持 Silent
规范中的 Silent 状态依赖 Nm 变体和 Bus State Manager 的模式指示。当前工程 COMM_NM_SUPPORT 为 STD_ON,因此 COMM_SILENT_COM 相关分支有效;但实际是否到达该状态,还取决于生成的 ComMNmVariant 和运行时 Nm 事件。
10.5 请求仲裁和主函数快照图
ComM 不是把某一个用户的最后一次请求直接写成通道模式,而是先聚合所有来源。当前工程的通道主函数在进入状态机前形成一次请求快照,快照包含用户、DCM、Nm/EcuM 被动请求和 PNC 请求(PNC 当前被宏排除)。
#mermaid-svg-8EbhlcfgJHiiv6Df{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-8EbhlcfgJHiiv6Df .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-8EbhlcfgJHiiv6Df .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-8EbhlcfgJHiiv6Df .error-icon{fill:#552222;}#mermaid-svg-8EbhlcfgJHiiv6Df .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8EbhlcfgJHiiv6Df .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-8EbhlcfgJHiiv6Df .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8EbhlcfgJHiiv6Df .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8EbhlcfgJHiiv6Df .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-8EbhlcfgJHiiv6Df .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8EbhlcfgJHiiv6Df .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8EbhlcfgJHiiv6Df .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8EbhlcfgJHiiv6Df .marker.cross{stroke:#333333;}#mermaid-svg-8EbhlcfgJHiiv6Df svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8EbhlcfgJHiiv6Df p{margin:0;}#mermaid-svg-8EbhlcfgJHiiv6Df .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-8EbhlcfgJHiiv6Df .cluster-label text{fill:#333;}#mermaid-svg-8EbhlcfgJHiiv6Df .cluster-label span{color:#333;}#mermaid-svg-8EbhlcfgJHiiv6Df .cluster-label span p{background-color:transparent;}#mermaid-svg-8EbhlcfgJHiiv6Df .label text,#mermaid-svg-8EbhlcfgJHiiv6Df span{fill:#333;color:#333;}#mermaid-svg-8EbhlcfgJHiiv6Df .node rect,#mermaid-svg-8EbhlcfgJHiiv6Df .node circle,#mermaid-svg-8EbhlcfgJHiiv6Df .node ellipse,#mermaid-svg-8EbhlcfgJHiiv6Df .node polygon,#mermaid-svg-8EbhlcfgJHiiv6Df .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8EbhlcfgJHiiv6Df .rough-node .label text,#mermaid-svg-8EbhlcfgJHiiv6Df .node .label text,#mermaid-svg-8EbhlcfgJHiiv6Df .image-shape .label,#mermaid-svg-8EbhlcfgJHiiv6Df .icon-shape .label{text-anchor:middle;}#mermaid-svg-8EbhlcfgJHiiv6Df .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-8EbhlcfgJHiiv6Df .rough-node .label,#mermaid-svg-8EbhlcfgJHiiv6Df .node .label,#mermaid-svg-8EbhlcfgJHiiv6Df .image-shape .label,#mermaid-svg-8EbhlcfgJHiiv6Df .icon-shape .label{text-align:center;}#mermaid-svg-8EbhlcfgJHiiv6Df .node.clickable{cursor:pointer;}#mermaid-svg-8EbhlcfgJHiiv6Df .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-8EbhlcfgJHiiv6Df .arrowheadPath{fill:#333333;}#mermaid-svg-8EbhlcfgJHiiv6Df .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-8EbhlcfgJHiiv6Df .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-8EbhlcfgJHiiv6Df .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8EbhlcfgJHiiv6Df .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-8EbhlcfgJHiiv6Df .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8EbhlcfgJHiiv6Df .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-8EbhlcfgJHiiv6Df .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-8EbhlcfgJHiiv6Df .cluster text{fill:#333;}#mermaid-svg-8EbhlcfgJHiiv6Df .cluster span{color:#333;}#mermaid-svg-8EbhlcfgJHiiv6Df div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-8EbhlcfgJHiiv6Df .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-8EbhlcfgJHiiv6Df rect.text{fill:none;stroke-width:0;}#mermaid-svg-8EbhlcfgJHiiv6Df .icon-shape,#mermaid-svg-8EbhlcfgJHiiv6Df .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8EbhlcfgJHiiv6Df .icon-shape p,#mermaid-svg-8EbhlcfgJHiiv6Df .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-8EbhlcfgJHiiv6Df .icon-shape .label rect,#mermaid-svg-8EbhlcfgJHiiv6Df .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8EbhlcfgJHiiv6Df .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-8EbhlcfgJHiiv6Df .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-8EbhlcfgJHiiv6Df :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} COMM_PNC_ENABLED=STD_ON
User 0 request
UserRequestCtr_u16
User 1 request
DCM diagnostic request
DiagnosticRequestState_b
Nm 或 EcuM event
PassiveRequestState_u8
PNC request
PncRequestCtr_u8
counter > 0
ActiveRequest
counter > 0
PassiveRequest
主函数快照
状态机仲裁
ChannelState_e 和 ChannelMode_u8
ComM 到 CanSM 或 BusSM
#mermaid-svg-Rj9F7X6LemK0TMZO{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Rj9F7X6LemK0TMZO .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Rj9F7X6LemK0TMZO .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Rj9F7X6LemK0TMZO .error-icon{fill:#552222;}#mermaid-svg-Rj9F7X6LemK0TMZO .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Rj9F7X6LemK0TMZO .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Rj9F7X6LemK0TMZO .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Rj9F7X6LemK0TMZO .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Rj9F7X6LemK0TMZO .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Rj9F7X6LemK0TMZO .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Rj9F7X6LemK0TMZO .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Rj9F7X6LemK0TMZO .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Rj9F7X6LemK0TMZO .marker.cross{stroke:#333333;}#mermaid-svg-Rj9F7X6LemK0TMZO svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Rj9F7X6LemK0TMZO p{margin:0;}#mermaid-svg-Rj9F7X6LemK0TMZO .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Rj9F7X6LemK0TMZO .cluster-label text{fill:#333;}#mermaid-svg-Rj9F7X6LemK0TMZO .cluster-label span{color:#333;}#mermaid-svg-Rj9F7X6LemK0TMZO .cluster-label span p{background-color:transparent;}#mermaid-svg-Rj9F7X6LemK0TMZO .label text,#mermaid-svg-Rj9F7X6LemK0TMZO span{fill:#333;color:#333;}#mermaid-svg-Rj9F7X6LemK0TMZO .node rect,#mermaid-svg-Rj9F7X6LemK0TMZO .node circle,#mermaid-svg-Rj9F7X6LemK0TMZO .node ellipse,#mermaid-svg-Rj9F7X6LemK0TMZO .node polygon,#mermaid-svg-Rj9F7X6LemK0TMZO .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Rj9F7X6LemK0TMZO .rough-node .label text,#mermaid-svg-Rj9F7X6LemK0TMZO .node .label text,#mermaid-svg-Rj9F7X6LemK0TMZO .image-shape .label,#mermaid-svg-Rj9F7X6LemK0TMZO .icon-shape .label{text-anchor:middle;}#mermaid-svg-Rj9F7X6LemK0TMZO .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Rj9F7X6LemK0TMZO .rough-node .label,#mermaid-svg-Rj9F7X6LemK0TMZO .node .label,#mermaid-svg-Rj9F7X6LemK0TMZO .image-shape .label,#mermaid-svg-Rj9F7X6LemK0TMZO .icon-shape .label{text-align:center;}#mermaid-svg-Rj9F7X6LemK0TMZO .node.clickable{cursor:pointer;}#mermaid-svg-Rj9F7X6LemK0TMZO .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Rj9F7X6LemK0TMZO .arrowheadPath{fill:#333333;}#mermaid-svg-Rj9F7X6LemK0TMZO .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Rj9F7X6LemK0TMZO .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Rj9F7X6LemK0TMZO .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Rj9F7X6LemK0TMZO .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Rj9F7X6LemK0TMZO .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Rj9F7X6LemK0TMZO .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Rj9F7X6LemK0TMZO .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Rj9F7X6LemK0TMZO .cluster text{fill:#333;}#mermaid-svg-Rj9F7X6LemK0TMZO .cluster span{color:#333;}#mermaid-svg-Rj9F7X6LemK0TMZO div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Rj9F7X6LemK0TMZO .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Rj9F7X6LemK0TMZO rect.text{fill:none;stroke-width:0;}#mermaid-svg-Rj9F7X6LemK0TMZO .icon-shape,#mermaid-svg-Rj9F7X6LemK0TMZO .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Rj9F7X6LemK0TMZO .icon-shape p,#mermaid-svg-Rj9F7X6LemK0TMZO .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Rj9F7X6LemK0TMZO .icon-shape .label rect,#mermaid-svg-Rj9F7X6LemK0TMZO .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Rj9F7X6LemK0TMZO .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Rj9F7X6LemK0TMZO .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Rj9F7X6LemK0TMZO :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
是
否
ComM_MainFunction_Channel
读取用户请求计数
读取 DCM 状态
读取 Nm 或 EcuM PassiveRequest
按有效限制修正 ActiveRequest
形成快照,后续请求下周期处理
执行 ModeHandling
执行当前状态 StateHandling
状态是否改变?
更新 ChannelState_e 和 ChannelMode_u8
比较 BusSmMode
BusSM 模式改变?
通知 BswM、DCM 和用户
本次主函数结束
当前实现允许一次主函数内连续消化多个内部状态转换,并用 numStateChanges_u8 区分某些 Ready Sleep 进入原因。因此调试日志应至少记录:通道索引、旧状态、新状态、ActiveRequest、PassiveRequest、CommunicationAllowed、BusSmMode 和 ComMNmVariant。
10.6 DCM 诊断保持状态图
规范要求活动诊断期间临时解除通信限制,防止 ECU 在诊断会话中进入睡眠。当前工程 COMM_DCM_SUPPORT 为 STD_ON,ComM_Dcm_ActiveDiagnostic 和 ComM_Dcm_InactiveDiagnostic 路径有效。
#mermaid-svg-xbthvBO9e4ktKhyB{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-xbthvBO9e4ktKhyB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-xbthvBO9e4ktKhyB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-xbthvBO9e4ktKhyB .error-icon{fill:#552222;}#mermaid-svg-xbthvBO9e4ktKhyB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-xbthvBO9e4ktKhyB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-xbthvBO9e4ktKhyB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-xbthvBO9e4ktKhyB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-xbthvBO9e4ktKhyB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-xbthvBO9e4ktKhyB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-xbthvBO9e4ktKhyB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-xbthvBO9e4ktKhyB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-xbthvBO9e4ktKhyB .marker.cross{stroke:#333333;}#mermaid-svg-xbthvBO9e4ktKhyB svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-xbthvBO9e4ktKhyB p{margin:0;}#mermaid-svg-xbthvBO9e4ktKhyB defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-xbthvBO9e4ktKhyB g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-xbthvBO9e4ktKhyB g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-xbthvBO9e4ktKhyB g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-xbthvBO9e4ktKhyB g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-xbthvBO9e4ktKhyB g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-xbthvBO9e4ktKhyB .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-xbthvBO9e4ktKhyB .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-xbthvBO9e4ktKhyB .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-xbthvBO9e4ktKhyB .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-xbthvBO9e4ktKhyB .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-xbthvBO9e4ktKhyB .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-xbthvBO9e4ktKhyB .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-xbthvBO9e4ktKhyB .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xbthvBO9e4ktKhyB .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-xbthvBO9e4ktKhyB .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xbthvBO9e4ktKhyB .edgeLabel .label text{fill:#333;}#mermaid-svg-xbthvBO9e4ktKhyB .label div .edgeLabel{color:#333;}#mermaid-svg-xbthvBO9e4ktKhyB .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-xbthvBO9e4ktKhyB .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-xbthvBO9e4ktKhyB .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-xbthvBO9e4ktKhyB .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-xbthvBO9e4ktKhyB .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-xbthvBO9e4ktKhyB .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-xbthvBO9e4ktKhyB .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-xbthvBO9e4ktKhyB #statediagram-barbEnd{fill:#333333;}#mermaid-svg-xbthvBO9e4ktKhyB .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-xbthvBO9e4ktKhyB .cluster-label,#mermaid-svg-xbthvBO9e4ktKhyB .nodeLabel{color:#131300;}#mermaid-svg-xbthvBO9e4ktKhyB .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-xbthvBO9e4ktKhyB .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-xbthvBO9e4ktKhyB .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-xbthvBO9e4ktKhyB .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-xbthvBO9e4ktKhyB .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-xbthvBO9e4ktKhyB .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-xbthvBO9e4ktKhyB .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-xbthvBO9e4ktKhyB .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-xbthvBO9e4ktKhyB .note-edge{stroke-dasharray:5;}#mermaid-svg-xbthvBO9e4ktKhyB .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-xbthvBO9e4ktKhyB .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-xbthvBO9e4ktKhyB .statediagram-note text{fill:black;}#mermaid-svg-xbthvBO9e4ktKhyB .statediagram-note .nodeLabel{color:black;}#mermaid-svg-xbthvBO9e4ktKhyB .statediagram .edgeLabel{color:red;}#mermaid-svg-xbthvBO9e4ktKhyB #dependencyStart,#mermaid-svg-xbthvBO9e4ktKhyB #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-xbthvBO9e4ktKhyB .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-xbthvBO9e4ktKhyB :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ComM_Dcm_ActiveDiagnostic
ComM_Dcm_InactiveDiagnostic
channel was NO_COM
CommunicationAllowed = TRUE
diagnostic keeps ActiveRequest
diagnostic released and no other request
NO_DIAGNOSTIC
DIAGNOSTIC_ACTIVE
COMM_NO_COM_REQUEST_PENDING
COMM_FULL_COM_NETWORK_REQUESTED
COMM_FULL_COM_READY_SLEEP
#mermaid-svg-roKwjjG8UbAmJbbs{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-roKwjjG8UbAmJbbs .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-roKwjjG8UbAmJbbs .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-roKwjjG8UbAmJbbs .error-icon{fill:#552222;}#mermaid-svg-roKwjjG8UbAmJbbs .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-roKwjjG8UbAmJbbs .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-roKwjjG8UbAmJbbs .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-roKwjjG8UbAmJbbs .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-roKwjjG8UbAmJbbs .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-roKwjjG8UbAmJbbs .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-roKwjjG8UbAmJbbs .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-roKwjjG8UbAmJbbs .marker{fill:#333333;stroke:#333333;}#mermaid-svg-roKwjjG8UbAmJbbs .marker.cross{stroke:#333333;}#mermaid-svg-roKwjjG8UbAmJbbs svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-roKwjjG8UbAmJbbs p{margin:0;}#mermaid-svg-roKwjjG8UbAmJbbs .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-roKwjjG8UbAmJbbs .cluster-label text{fill:#333;}#mermaid-svg-roKwjjG8UbAmJbbs .cluster-label span{color:#333;}#mermaid-svg-roKwjjG8UbAmJbbs .cluster-label span p{background-color:transparent;}#mermaid-svg-roKwjjG8UbAmJbbs .label text,#mermaid-svg-roKwjjG8UbAmJbbs span{fill:#333;color:#333;}#mermaid-svg-roKwjjG8UbAmJbbs .node rect,#mermaid-svg-roKwjjG8UbAmJbbs .node circle,#mermaid-svg-roKwjjG8UbAmJbbs .node ellipse,#mermaid-svg-roKwjjG8UbAmJbbs .node polygon,#mermaid-svg-roKwjjG8UbAmJbbs .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-roKwjjG8UbAmJbbs .rough-node .label text,#mermaid-svg-roKwjjG8UbAmJbbs .node .label text,#mermaid-svg-roKwjjG8UbAmJbbs .image-shape .label,#mermaid-svg-roKwjjG8UbAmJbbs .icon-shape .label{text-anchor:middle;}#mermaid-svg-roKwjjG8UbAmJbbs .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-roKwjjG8UbAmJbbs .rough-node .label,#mermaid-svg-roKwjjG8UbAmJbbs .node .label,#mermaid-svg-roKwjjG8UbAmJbbs .image-shape .label,#mermaid-svg-roKwjjG8UbAmJbbs .icon-shape .label{text-align:center;}#mermaid-svg-roKwjjG8UbAmJbbs .node.clickable{cursor:pointer;}#mermaid-svg-roKwjjG8UbAmJbbs .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-roKwjjG8UbAmJbbs .arrowheadPath{fill:#333333;}#mermaid-svg-roKwjjG8UbAmJbbs .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-roKwjjG8UbAmJbbs .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-roKwjjG8UbAmJbbs .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-roKwjjG8UbAmJbbs .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-roKwjjG8UbAmJbbs .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-roKwjjG8UbAmJbbs .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-roKwjjG8UbAmJbbs .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-roKwjjG8UbAmJbbs .cluster text{fill:#333;}#mermaid-svg-roKwjjG8UbAmJbbs .cluster span{color:#333;}#mermaid-svg-roKwjjG8UbAmJbbs div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-roKwjjG8UbAmJbbs .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-roKwjjG8UbAmJbbs rect.text{fill:none;stroke-width:0;}#mermaid-svg-roKwjjG8UbAmJbbs .icon-shape,#mermaid-svg-roKwjjG8UbAmJbbs .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-roKwjjG8UbAmJbbs .icon-shape p,#mermaid-svg-roKwjjG8UbAmJbbs .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-roKwjjG8UbAmJbbs .icon-shape .label rect,#mermaid-svg-roKwjjG8UbAmJbbs .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-roKwjjG8UbAmJbbs .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-roKwjjG8UbAmJbbs .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-roKwjjG8UbAmJbbs :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
FALSE
TRUE
是
否
Dcm active diagnostic
ComM_Dcm_ActiveDiagnostic
置 DiagnosticRequestState_b
下一个 ChannelMainFunction 形成 ActiveRequest
当前是否 NO_COM?
进入 NO_COM_REQUEST_PENDING
维持或推进当前 Full 状态
CommunicationAllowed?
等待允许通信
FULL_COM_NETWORK_REQUESTED
诊断 PDU 可使用通信资源
Dcm inactive diagnostic
ComM_Dcm_InactiveDiagnostic
清除诊断保持
是否还有用户、Nm 或 PNC 请求?
保持 Full
按 Nm 变体进入 Ready Sleep
10.7 EcuM 唤醒和 CommunicationAllowed 流程
唤醒指示只表示 ECU 检测到唤醒原因,不等于通信已经允许。当前 ComM_EcuM_WakeUpIndication 只在通道处于 COMM_NO_COMMUNICATION 时处理唤醒;随后由 ComM_CommunicationAllowed 和通道主函数继续推进。
CanSM 或 BusSM Wake-up validation ComM EcuM 收发器或 ECU 唤醒源 CanSM 或 BusSM Wake-up validation ComM EcuM 收发器或 ECU 唤醒源 #mermaid-svg-YHuqdjFBvaApgz6z{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-YHuqdjFBvaApgz6z .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-YHuqdjFBvaApgz6z .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-YHuqdjFBvaApgz6z .error-icon{fill:#552222;}#mermaid-svg-YHuqdjFBvaApgz6z .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-YHuqdjFBvaApgz6z .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-YHuqdjFBvaApgz6z .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-YHuqdjFBvaApgz6z .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-YHuqdjFBvaApgz6z .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-YHuqdjFBvaApgz6z .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-YHuqdjFBvaApgz6z .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-YHuqdjFBvaApgz6z .marker{fill:#333333;stroke:#333333;}#mermaid-svg-YHuqdjFBvaApgz6z .marker.cross{stroke:#333333;}#mermaid-svg-YHuqdjFBvaApgz6z svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-YHuqdjFBvaApgz6z p{margin:0;}#mermaid-svg-YHuqdjFBvaApgz6z .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-YHuqdjFBvaApgz6z text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-YHuqdjFBvaApgz6z .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-YHuqdjFBvaApgz6z .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-YHuqdjFBvaApgz6z .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-YHuqdjFBvaApgz6z .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-YHuqdjFBvaApgz6z #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-YHuqdjFBvaApgz6z .sequenceNumber{fill:white;}#mermaid-svg-YHuqdjFBvaApgz6z #sequencenumber{fill:#333;}#mermaid-svg-YHuqdjFBvaApgz6z #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-YHuqdjFBvaApgz6z .messageText{fill:#333;stroke:none;}#mermaid-svg-YHuqdjFBvaApgz6z .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-YHuqdjFBvaApgz6z .labelText,#mermaid-svg-YHuqdjFBvaApgz6z .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-YHuqdjFBvaApgz6z .loopText,#mermaid-svg-YHuqdjFBvaApgz6z .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-YHuqdjFBvaApgz6z .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-YHuqdjFBvaApgz6z .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-YHuqdjFBvaApgz6z .noteText,#mermaid-svg-YHuqdjFBvaApgz6z .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-YHuqdjFBvaApgz6z .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-YHuqdjFBvaApgz6z .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-YHuqdjFBvaApgz6z .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-YHuqdjFBvaApgz6z .actorPopupMenu{position:absolute;}#mermaid-svg-YHuqdjFBvaApgz6z .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-YHuqdjFBvaApgz6z .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-YHuqdjFBvaApgz6z .actor-man circle,#mermaid-svg-YHuqdjFBvaApgz6z line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-YHuqdjFBvaApgz6z :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Wake-up event ComM_EcuM_WakeUpIndication(Channel) NO_COM 子状态切换为 REQUEST_PENDING 执行唤醒验证 ComM_CommunicationAllowed(Channel, TRUE) 下一次主函数检查 CommunicationAllowed RequestComMode(FULL_COM) BusSM mode indication
#mermaid-svg-pQIgHiXnsepUr7Wd{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-pQIgHiXnsepUr7Wd .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-pQIgHiXnsepUr7Wd .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-pQIgHiXnsepUr7Wd .error-icon{fill:#552222;}#mermaid-svg-pQIgHiXnsepUr7Wd .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-pQIgHiXnsepUr7Wd .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-pQIgHiXnsepUr7Wd .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-pQIgHiXnsepUr7Wd .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-pQIgHiXnsepUr7Wd .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-pQIgHiXnsepUr7Wd .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-pQIgHiXnsepUr7Wd .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-pQIgHiXnsepUr7Wd .marker{fill:#333333;stroke:#333333;}#mermaid-svg-pQIgHiXnsepUr7Wd .marker.cross{stroke:#333333;}#mermaid-svg-pQIgHiXnsepUr7Wd svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-pQIgHiXnsepUr7Wd p{margin:0;}#mermaid-svg-pQIgHiXnsepUr7Wd .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-pQIgHiXnsepUr7Wd .cluster-label text{fill:#333;}#mermaid-svg-pQIgHiXnsepUr7Wd .cluster-label span{color:#333;}#mermaid-svg-pQIgHiXnsepUr7Wd .cluster-label span p{background-color:transparent;}#mermaid-svg-pQIgHiXnsepUr7Wd .label text,#mermaid-svg-pQIgHiXnsepUr7Wd span{fill:#333;color:#333;}#mermaid-svg-pQIgHiXnsepUr7Wd .node rect,#mermaid-svg-pQIgHiXnsepUr7Wd .node circle,#mermaid-svg-pQIgHiXnsepUr7Wd .node ellipse,#mermaid-svg-pQIgHiXnsepUr7Wd .node polygon,#mermaid-svg-pQIgHiXnsepUr7Wd .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-pQIgHiXnsepUr7Wd .rough-node .label text,#mermaid-svg-pQIgHiXnsepUr7Wd .node .label text,#mermaid-svg-pQIgHiXnsepUr7Wd .image-shape .label,#mermaid-svg-pQIgHiXnsepUr7Wd .icon-shape .label{text-anchor:middle;}#mermaid-svg-pQIgHiXnsepUr7Wd .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-pQIgHiXnsepUr7Wd .rough-node .label,#mermaid-svg-pQIgHiXnsepUr7Wd .node .label,#mermaid-svg-pQIgHiXnsepUr7Wd .image-shape .label,#mermaid-svg-pQIgHiXnsepUr7Wd .icon-shape .label{text-align:center;}#mermaid-svg-pQIgHiXnsepUr7Wd .node.clickable{cursor:pointer;}#mermaid-svg-pQIgHiXnsepUr7Wd .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-pQIgHiXnsepUr7Wd .arrowheadPath{fill:#333333;}#mermaid-svg-pQIgHiXnsepUr7Wd .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-pQIgHiXnsepUr7Wd .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-pQIgHiXnsepUr7Wd .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pQIgHiXnsepUr7Wd .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-pQIgHiXnsepUr7Wd .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pQIgHiXnsepUr7Wd .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-pQIgHiXnsepUr7Wd .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-pQIgHiXnsepUr7Wd .cluster text{fill:#333;}#mermaid-svg-pQIgHiXnsepUr7Wd .cluster span{color:#333;}#mermaid-svg-pQIgHiXnsepUr7Wd div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-pQIgHiXnsepUr7Wd .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-pQIgHiXnsepUr7Wd rect.text{fill:none;stroke-width:0;}#mermaid-svg-pQIgHiXnsepUr7Wd .icon-shape,#mermaid-svg-pQIgHiXnsepUr7Wd .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pQIgHiXnsepUr7Wd .icon-shape p,#mermaid-svg-pQIgHiXnsepUr7Wd .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-pQIgHiXnsepUr7Wd .icon-shape .label rect,#mermaid-svg-pQIgHiXnsepUr7Wd .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pQIgHiXnsepUr7Wd .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-pQIgHiXnsepUr7Wd .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-pQIgHiXnsepUr7Wd :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否
是
FALSE
TRUE
否
是
ComM_EcuM_WakeUpIndication
ChannelMode == NO_COM?
当前实现忽略该唤醒指示
ComMSynchronousWakeUp?
仅相关通道进入 REQUEST_PENDING
所有通道进入 REQUEST_PENDING
等待 CommunicationAllowed
验证完成且允许通信?
保持等待
FULL_COM_NETWORK_REQUESTED
这里的 ComMSynchronousWakeUp 采用规范语义说明;当前工程应继续以实际生成配置为准。当前 COMM_SYNCHRONOUS_WAKE_UP 为 STD_OFF,所以默认按异步唤醒路径分析。
10.8 通信限制状态图
通信限制有两个方向:Bus wake-up inhibition 只阻止从 NoCom 或 Silent 主动唤醒;Limit to NoCom 会强制通道向 NoCom 收敛并忽略新的 Full 请求。规范要求用户请求仍要被保存,限制解除后按最高请求优先重新处理。
#mermaid-svg-lhiXnRU2REzXkH4T{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-lhiXnRU2REzXkH4T .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-lhiXnRU2REzXkH4T .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-lhiXnRU2REzXkH4T .error-icon{fill:#552222;}#mermaid-svg-lhiXnRU2REzXkH4T .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-lhiXnRU2REzXkH4T .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-lhiXnRU2REzXkH4T .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-lhiXnRU2REzXkH4T .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-lhiXnRU2REzXkH4T .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-lhiXnRU2REzXkH4T .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-lhiXnRU2REzXkH4T .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-lhiXnRU2REzXkH4T .marker{fill:#333333;stroke:#333333;}#mermaid-svg-lhiXnRU2REzXkH4T .marker.cross{stroke:#333333;}#mermaid-svg-lhiXnRU2REzXkH4T svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-lhiXnRU2REzXkH4T p{margin:0;}#mermaid-svg-lhiXnRU2REzXkH4T defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-lhiXnRU2REzXkH4T g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-lhiXnRU2REzXkH4T g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-lhiXnRU2REzXkH4T g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-lhiXnRU2REzXkH4T g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-lhiXnRU2REzXkH4T g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-lhiXnRU2REzXkH4T .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-lhiXnRU2REzXkH4T .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-lhiXnRU2REzXkH4T .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-lhiXnRU2REzXkH4T .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-lhiXnRU2REzXkH4T .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-lhiXnRU2REzXkH4T .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-lhiXnRU2REzXkH4T .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-lhiXnRU2REzXkH4T .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lhiXnRU2REzXkH4T .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-lhiXnRU2REzXkH4T .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lhiXnRU2REzXkH4T .edgeLabel .label text{fill:#333;}#mermaid-svg-lhiXnRU2REzXkH4T .label div .edgeLabel{color:#333;}#mermaid-svg-lhiXnRU2REzXkH4T .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-lhiXnRU2REzXkH4T .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-lhiXnRU2REzXkH4T .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-lhiXnRU2REzXkH4T .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-lhiXnRU2REzXkH4T .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-lhiXnRU2REzXkH4T .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-lhiXnRU2REzXkH4T .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-lhiXnRU2REzXkH4T #statediagram-barbEnd{fill:#333333;}#mermaid-svg-lhiXnRU2REzXkH4T .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-lhiXnRU2REzXkH4T .cluster-label,#mermaid-svg-lhiXnRU2REzXkH4T .nodeLabel{color:#131300;}#mermaid-svg-lhiXnRU2REzXkH4T .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-lhiXnRU2REzXkH4T .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-lhiXnRU2REzXkH4T .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-lhiXnRU2REzXkH4T .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-lhiXnRU2REzXkH4T .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-lhiXnRU2REzXkH4T .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-lhiXnRU2REzXkH4T .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-lhiXnRU2REzXkH4T .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-lhiXnRU2REzXkH4T .note-edge{stroke-dasharray:5;}#mermaid-svg-lhiXnRU2REzXkH4T .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-lhiXnRU2REzXkH4T .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-lhiXnRU2REzXkH4T .statediagram-note text{fill:black;}#mermaid-svg-lhiXnRU2REzXkH4T .statediagram-note .nodeLabel{color:black;}#mermaid-svg-lhiXnRU2REzXkH4T .statediagram .edgeLabel{color:red;}#mermaid-svg-lhiXnRU2REzXkH4T #dependencyStart,#mermaid-svg-lhiXnRU2REzXkH4T #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-lhiXnRU2REzXkH4T .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-lhiXnRU2REzXkH4T :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ComMNoWakeup = TRUE
inhibition released
LimitChannelToNoComMode(TRUE)
limitation released
force Ready Sleep / ignore Full request
all channel requests cleared
NORMAL
WAKEUP_INHIBITED
LIMIT_TO_NOCOM
SHUTDOWN
COMM_NO_COMMUNICATION
#mermaid-svg-5DPUIy2LfV8LeXH0{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-5DPUIy2LfV8LeXH0 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-5DPUIy2LfV8LeXH0 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-5DPUIy2LfV8LeXH0 .error-icon{fill:#552222;}#mermaid-svg-5DPUIy2LfV8LeXH0 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5DPUIy2LfV8LeXH0 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-5DPUIy2LfV8LeXH0 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5DPUIy2LfV8LeXH0 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5DPUIy2LfV8LeXH0 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-5DPUIy2LfV8LeXH0 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5DPUIy2LfV8LeXH0 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5DPUIy2LfV8LeXH0 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5DPUIy2LfV8LeXH0 .marker.cross{stroke:#333333;}#mermaid-svg-5DPUIy2LfV8LeXH0 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5DPUIy2LfV8LeXH0 p{margin:0;}#mermaid-svg-5DPUIy2LfV8LeXH0 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-5DPUIy2LfV8LeXH0 .cluster-label text{fill:#333;}#mermaid-svg-5DPUIy2LfV8LeXH0 .cluster-label span{color:#333;}#mermaid-svg-5DPUIy2LfV8LeXH0 .cluster-label span p{background-color:transparent;}#mermaid-svg-5DPUIy2LfV8LeXH0 .label text,#mermaid-svg-5DPUIy2LfV8LeXH0 span{fill:#333;color:#333;}#mermaid-svg-5DPUIy2LfV8LeXH0 .node rect,#mermaid-svg-5DPUIy2LfV8LeXH0 .node circle,#mermaid-svg-5DPUIy2LfV8LeXH0 .node ellipse,#mermaid-svg-5DPUIy2LfV8LeXH0 .node polygon,#mermaid-svg-5DPUIy2LfV8LeXH0 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5DPUIy2LfV8LeXH0 .rough-node .label text,#mermaid-svg-5DPUIy2LfV8LeXH0 .node .label text,#mermaid-svg-5DPUIy2LfV8LeXH0 .image-shape .label,#mermaid-svg-5DPUIy2LfV8LeXH0 .icon-shape .label{text-anchor:middle;}#mermaid-svg-5DPUIy2LfV8LeXH0 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-5DPUIy2LfV8LeXH0 .rough-node .label,#mermaid-svg-5DPUIy2LfV8LeXH0 .node .label,#mermaid-svg-5DPUIy2LfV8LeXH0 .image-shape .label,#mermaid-svg-5DPUIy2LfV8LeXH0 .icon-shape .label{text-align:center;}#mermaid-svg-5DPUIy2LfV8LeXH0 .node.clickable{cursor:pointer;}#mermaid-svg-5DPUIy2LfV8LeXH0 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-5DPUIy2LfV8LeXH0 .arrowheadPath{fill:#333333;}#mermaid-svg-5DPUIy2LfV8LeXH0 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-5DPUIy2LfV8LeXH0 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-5DPUIy2LfV8LeXH0 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5DPUIy2LfV8LeXH0 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-5DPUIy2LfV8LeXH0 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5DPUIy2LfV8LeXH0 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-5DPUIy2LfV8LeXH0 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-5DPUIy2LfV8LeXH0 .cluster text{fill:#333;}#mermaid-svg-5DPUIy2LfV8LeXH0 .cluster span{color:#333;}#mermaid-svg-5DPUIy2LfV8LeXH0 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-5DPUIy2LfV8LeXH0 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-5DPUIy2LfV8LeXH0 rect.text{fill:none;stroke-width:0;}#mermaid-svg-5DPUIy2LfV8LeXH0 .icon-shape,#mermaid-svg-5DPUIy2LfV8LeXH0 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5DPUIy2LfV8LeXH0 .icon-shape p,#mermaid-svg-5DPUIy2LfV8LeXH0 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-5DPUIy2LfV8LeXH0 .icon-shape .label rect,#mermaid-svg-5DPUIy2LfV8LeXH0 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5DPUIy2LfV8LeXH0 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-5DPUIy2LfV8LeXH0 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-5DPUIy2LfV8LeXH0 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
是
否
是
否
用户请求 FULL
Limit to NoCom?
接受或记录请求但不执行
Wake-up inhibition 且当前 NO_COM 或 SILENT?
参与 ActiveRequest
限制解除后重新评估
LimitChannelToNoComMode TRUE
当前 NETWORK_REQUESTED?
转 READY_SLEEP,启动停网
保持限制状态
进入 NO_COM 后按配置清除用户请求
当前工程 COMM_LIMIT_TO_NOCOM_ENABLED、COMM_PREVENT_WAKEUP_ENABLED 和 COMM_INHIBITION_ENABLED 均为 STD_OFF,上述图用于解释规范和未来变体;它们不是当前镜像的有效运行路径。
10.9 PNC 状态机
PNC 是独立于每个 ComM 通道的状态机。规范定义一个 PNC 一个状态机,主状态为 COMM_PNC_NO_COMMUNICATION 和 COMM_PNC_FULL_COMMUNICATION,Full 下有三个子状态。PNC 状态变化必须在受影响通道的 ComM_MainFunction_Channel 中执行,并且 PNC 动作先于通道动作。
#mermaid-svg-F92Ol3LAhs0xMfIJ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-F92Ol3LAhs0xMfIJ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-F92Ol3LAhs0xMfIJ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-F92Ol3LAhs0xMfIJ .error-icon{fill:#552222;}#mermaid-svg-F92Ol3LAhs0xMfIJ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-F92Ol3LAhs0xMfIJ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-F92Ol3LAhs0xMfIJ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-F92Ol3LAhs0xMfIJ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-F92Ol3LAhs0xMfIJ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-F92Ol3LAhs0xMfIJ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-F92Ol3LAhs0xMfIJ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-F92Ol3LAhs0xMfIJ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-F92Ol3LAhs0xMfIJ .marker.cross{stroke:#333333;}#mermaid-svg-F92Ol3LAhs0xMfIJ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-F92Ol3LAhs0xMfIJ p{margin:0;}#mermaid-svg-F92Ol3LAhs0xMfIJ defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-F92Ol3LAhs0xMfIJ g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-F92Ol3LAhs0xMfIJ g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-F92Ol3LAhs0xMfIJ g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-F92Ol3LAhs0xMfIJ g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-F92Ol3LAhs0xMfIJ g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-F92Ol3LAhs0xMfIJ .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-F92Ol3LAhs0xMfIJ .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-F92Ol3LAhs0xMfIJ .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-F92Ol3LAhs0xMfIJ .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-F92Ol3LAhs0xMfIJ .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-F92Ol3LAhs0xMfIJ .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-F92Ol3LAhs0xMfIJ .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-F92Ol3LAhs0xMfIJ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-F92Ol3LAhs0xMfIJ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-F92Ol3LAhs0xMfIJ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-F92Ol3LAhs0xMfIJ .edgeLabel .label text{fill:#333;}#mermaid-svg-F92Ol3LAhs0xMfIJ .label div .edgeLabel{color:#333;}#mermaid-svg-F92Ol3LAhs0xMfIJ .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-F92Ol3LAhs0xMfIJ .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-F92Ol3LAhs0xMfIJ .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-F92Ol3LAhs0xMfIJ .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-F92Ol3LAhs0xMfIJ .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-F92Ol3LAhs0xMfIJ .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-F92Ol3LAhs0xMfIJ .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-F92Ol3LAhs0xMfIJ #statediagram-barbEnd{fill:#333333;}#mermaid-svg-F92Ol3LAhs0xMfIJ .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-F92Ol3LAhs0xMfIJ .cluster-label,#mermaid-svg-F92Ol3LAhs0xMfIJ .nodeLabel{color:#131300;}#mermaid-svg-F92Ol3LAhs0xMfIJ .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-F92Ol3LAhs0xMfIJ .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-F92Ol3LAhs0xMfIJ .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-F92Ol3LAhs0xMfIJ .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-F92Ol3LAhs0xMfIJ .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-F92Ol3LAhs0xMfIJ .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-F92Ol3LAhs0xMfIJ .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-F92Ol3LAhs0xMfIJ .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-F92Ol3LAhs0xMfIJ .note-edge{stroke-dasharray:5;}#mermaid-svg-F92Ol3LAhs0xMfIJ .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-F92Ol3LAhs0xMfIJ .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-F92Ol3LAhs0xMfIJ .statediagram-note text{fill:black;}#mermaid-svg-F92Ol3LAhs0xMfIJ .statediagram-note .nodeLabel{color:black;}#mermaid-svg-F92Ol3LAhs0xMfIJ .statediagram .edgeLabel{color:red;}#mermaid-svg-F92Ol3LAhs0xMfIJ #dependencyStart,#mermaid-svg-F92Ol3LAhs0xMfIJ #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-F92Ol3LAhs0xMfIJ .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-F92Ol3LAhs0xMfIJ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} local user Full / qualifying ERA request / wake-up
all local users NoCom and release condition
local user Full / qualifying ERAn bit = 1
EIRA bit = 0
PrepareSleep timer expires
local user Full
EIRA bit becomes 1
synchronous wake-up handling
COMM_PNC_NO_COMMUNICATION
COMM_PNC_REQUESTED
COMM_PNC_READY_SLEEP
COMM_PNC_PREPARE_SLEEP
#mermaid-svg-usWa7H7cSEJAQShN{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-usWa7H7cSEJAQShN .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-usWa7H7cSEJAQShN .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-usWa7H7cSEJAQShN .error-icon{fill:#552222;}#mermaid-svg-usWa7H7cSEJAQShN .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-usWa7H7cSEJAQShN .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-usWa7H7cSEJAQShN .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-usWa7H7cSEJAQShN .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-usWa7H7cSEJAQShN .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-usWa7H7cSEJAQShN .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-usWa7H7cSEJAQShN .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-usWa7H7cSEJAQShN .marker{fill:#333333;stroke:#333333;}#mermaid-svg-usWa7H7cSEJAQShN .marker.cross{stroke:#333333;}#mermaid-svg-usWa7H7cSEJAQShN svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-usWa7H7cSEJAQShN p{margin:0;}#mermaid-svg-usWa7H7cSEJAQShN .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-usWa7H7cSEJAQShN .cluster-label text{fill:#333;}#mermaid-svg-usWa7H7cSEJAQShN .cluster-label span{color:#333;}#mermaid-svg-usWa7H7cSEJAQShN .cluster-label span p{background-color:transparent;}#mermaid-svg-usWa7H7cSEJAQShN .label text,#mermaid-svg-usWa7H7cSEJAQShN span{fill:#333;color:#333;}#mermaid-svg-usWa7H7cSEJAQShN .node rect,#mermaid-svg-usWa7H7cSEJAQShN .node circle,#mermaid-svg-usWa7H7cSEJAQShN .node ellipse,#mermaid-svg-usWa7H7cSEJAQShN .node polygon,#mermaid-svg-usWa7H7cSEJAQShN .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-usWa7H7cSEJAQShN .rough-node .label text,#mermaid-svg-usWa7H7cSEJAQShN .node .label text,#mermaid-svg-usWa7H7cSEJAQShN .image-shape .label,#mermaid-svg-usWa7H7cSEJAQShN .icon-shape .label{text-anchor:middle;}#mermaid-svg-usWa7H7cSEJAQShN .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-usWa7H7cSEJAQShN .rough-node .label,#mermaid-svg-usWa7H7cSEJAQShN .node .label,#mermaid-svg-usWa7H7cSEJAQShN .image-shape .label,#mermaid-svg-usWa7H7cSEJAQShN .icon-shape .label{text-align:center;}#mermaid-svg-usWa7H7cSEJAQShN .node.clickable{cursor:pointer;}#mermaid-svg-usWa7H7cSEJAQShN .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-usWa7H7cSEJAQShN .arrowheadPath{fill:#333333;}#mermaid-svg-usWa7H7cSEJAQShN .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-usWa7H7cSEJAQShN .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-usWa7H7cSEJAQShN .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-usWa7H7cSEJAQShN .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-usWa7H7cSEJAQShN .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-usWa7H7cSEJAQShN .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-usWa7H7cSEJAQShN .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-usWa7H7cSEJAQShN .cluster text{fill:#333;}#mermaid-svg-usWa7H7cSEJAQShN .cluster span{color:#333;}#mermaid-svg-usWa7H7cSEJAQShN div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-usWa7H7cSEJAQShN .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-usWa7H7cSEJAQShN rect.text{fill:none;stroke-width:0;}#mermaid-svg-usWa7H7cSEJAQShN .icon-shape,#mermaid-svg-usWa7H7cSEJAQShN .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-usWa7H7cSEJAQShN .icon-shape p,#mermaid-svg-usWa7H7cSEJAQShN .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-usWa7H7cSEJAQShN .icon-shape .label rect,#mermaid-svg-usWa7H7cSEJAQShN .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-usWa7H7cSEJAQShN .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-usWa7H7cSEJAQShN .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-usWa7H7cSEJAQShN :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
是
否
是
否
是
否
是
否
PNC main function
先处理 PNC user request
再处理普通 channel user request
PNC gateway enabled?
处理 ERA、IRA 和 gateway forwarding
跳过 gateway 分支
处理 EIRA
本地 Full 或有效远端请求?
PNC_REQUESTED
仍有 EIRA 请求?
PNC_READY_SLEEP
PNC_PREPARE_SLEEP,启动计时器
计时器到期?
PNC_NO_COMMUNICATION
收到新请求?
| PNC 状态 | 触发条件 | 关键动作 |
|---|---|---|
| COMM_PNC_REQUESTED | 本地用户 Full,或启用网关时有效远端请求 | 设置或转发 PNC 请求,向关联通道请求 Full |
| COMM_PNC_READY_SLEEP | 本地用户已释放,但 EIRA 仍表明网络中有请求 | 释放关联通道的本地 Full 保持,等待远端请求消失或重新出现 |
| COMM_PNC_PREPARE_SLEEP | EIRA 对应 PNC 位变为 0 | 启动 ComMPncPrepareSleepTimer,计时到期后进入 No Communication |
| COMM_PNC_NO_COMMUNICATION | 初始化、掉电或 PrepareSleep 计时结束 | PNC 不保持通信,等待新的用户、远端或唤醒请求 |
当前工程 COMM_PNC_ENABLED == STD_OFF,因此 ComM_PncRamStruct 初始化、PNC 主函数、EIRA/ERA、PNC user request 和 PNC wake-up 分支均不属于有效镜像路径。
10.10 Nm 变体与关闭同步配置图
ComMNmVariant 决定 Full、Ready Sleep、Silent 和 NoCom 之间的关闭同步方式。它是通道配置属性,不应从总线类型或函数名猜测。
#mermaid-svg-tcbk4hDuwBT90dPD{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-tcbk4hDuwBT90dPD .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-tcbk4hDuwBT90dPD .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-tcbk4hDuwBT90dPD .error-icon{fill:#552222;}#mermaid-svg-tcbk4hDuwBT90dPD .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-tcbk4hDuwBT90dPD .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-tcbk4hDuwBT90dPD .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-tcbk4hDuwBT90dPD .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-tcbk4hDuwBT90dPD .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-tcbk4hDuwBT90dPD .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-tcbk4hDuwBT90dPD .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-tcbk4hDuwBT90dPD .marker{fill:#333333;stroke:#333333;}#mermaid-svg-tcbk4hDuwBT90dPD .marker.cross{stroke:#333333;}#mermaid-svg-tcbk4hDuwBT90dPD svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-tcbk4hDuwBT90dPD p{margin:0;}#mermaid-svg-tcbk4hDuwBT90dPD .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-tcbk4hDuwBT90dPD .cluster-label text{fill:#333;}#mermaid-svg-tcbk4hDuwBT90dPD .cluster-label span{color:#333;}#mermaid-svg-tcbk4hDuwBT90dPD .cluster-label span p{background-color:transparent;}#mermaid-svg-tcbk4hDuwBT90dPD .label text,#mermaid-svg-tcbk4hDuwBT90dPD span{fill:#333;color:#333;}#mermaid-svg-tcbk4hDuwBT90dPD .node rect,#mermaid-svg-tcbk4hDuwBT90dPD .node circle,#mermaid-svg-tcbk4hDuwBT90dPD .node ellipse,#mermaid-svg-tcbk4hDuwBT90dPD .node polygon,#mermaid-svg-tcbk4hDuwBT90dPD .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-tcbk4hDuwBT90dPD .rough-node .label text,#mermaid-svg-tcbk4hDuwBT90dPD .node .label text,#mermaid-svg-tcbk4hDuwBT90dPD .image-shape .label,#mermaid-svg-tcbk4hDuwBT90dPD .icon-shape .label{text-anchor:middle;}#mermaid-svg-tcbk4hDuwBT90dPD .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-tcbk4hDuwBT90dPD .rough-node .label,#mermaid-svg-tcbk4hDuwBT90dPD .node .label,#mermaid-svg-tcbk4hDuwBT90dPD .image-shape .label,#mermaid-svg-tcbk4hDuwBT90dPD .icon-shape .label{text-align:center;}#mermaid-svg-tcbk4hDuwBT90dPD .node.clickable{cursor:pointer;}#mermaid-svg-tcbk4hDuwBT90dPD .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-tcbk4hDuwBT90dPD .arrowheadPath{fill:#333333;}#mermaid-svg-tcbk4hDuwBT90dPD .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-tcbk4hDuwBT90dPD .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-tcbk4hDuwBT90dPD .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tcbk4hDuwBT90dPD .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-tcbk4hDuwBT90dPD .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tcbk4hDuwBT90dPD .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-tcbk4hDuwBT90dPD .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-tcbk4hDuwBT90dPD .cluster text{fill:#333;}#mermaid-svg-tcbk4hDuwBT90dPD .cluster span{color:#333;}#mermaid-svg-tcbk4hDuwBT90dPD div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-tcbk4hDuwBT90dPD .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-tcbk4hDuwBT90dPD rect.text{fill:none;stroke-width:0;}#mermaid-svg-tcbk4hDuwBT90dPD .icon-shape,#mermaid-svg-tcbk4hDuwBT90dPD .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tcbk4hDuwBT90dPD .icon-shape p,#mermaid-svg-tcbk4hDuwBT90dPD .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-tcbk4hDuwBT90dPD .icon-shape .label rect,#mermaid-svg-tcbk4hDuwBT90dPD .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tcbk4hDuwBT90dPD .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-tcbk4hDuwBT90dPD .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-tcbk4hDuwBT90dPD :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} FULL
PASSIVE
LIGHT
NONE
ComM channel configuration
ComMNmVariant
Nm_NetworkRequest / Nm_NetworkRelease;同步网络关闭
Nm_PassiveStartUp;跟随网络
NmLightTimeout;ComM 用超时协调关闭
无 Nm 协调;外部总线通常到掉电才关闭
Ready Sleep / Silent / NoCom
| ComMNmVariant | 是否主动保持网络 | 关闭同步机制 | 代码核对点 |
|---|---|---|---|
| FULL | 是 | AUTOSAR NM | 进入 Network Requested 时可能调用 Nm_NetworkRequest |
| PASSIVE | 否 | AUTOSAR NM,跟随网络 | 通常从 Network Requested 直接到 Ready Sleep |
| LIGHT | 由配置和计时控制 | NmLightTimeout | 核对超时单位和主函数周期 |
| NONE | 否 | 无 ComM NM 协调 | 内部总线可直接收敛,外部总线可能保持 Ready Sleep |
10.11 配置关系图:从 ECUC 到运行时状态
#mermaid-svg-Jgffi1sl6jKDDLzF{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Jgffi1sl6jKDDLzF .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Jgffi1sl6jKDDLzF .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Jgffi1sl6jKDDLzF .error-icon{fill:#552222;}#mermaid-svg-Jgffi1sl6jKDDLzF .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Jgffi1sl6jKDDLzF .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Jgffi1sl6jKDDLzF .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Jgffi1sl6jKDDLzF .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Jgffi1sl6jKDDLzF .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Jgffi1sl6jKDDLzF .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Jgffi1sl6jKDDLzF .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Jgffi1sl6jKDDLzF .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Jgffi1sl6jKDDLzF .marker.cross{stroke:#333333;}#mermaid-svg-Jgffi1sl6jKDDLzF svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Jgffi1sl6jKDDLzF p{margin:0;}#mermaid-svg-Jgffi1sl6jKDDLzF .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Jgffi1sl6jKDDLzF .cluster-label text{fill:#333;}#mermaid-svg-Jgffi1sl6jKDDLzF .cluster-label span{color:#333;}#mermaid-svg-Jgffi1sl6jKDDLzF .cluster-label span p{background-color:transparent;}#mermaid-svg-Jgffi1sl6jKDDLzF .label text,#mermaid-svg-Jgffi1sl6jKDDLzF span{fill:#333;color:#333;}#mermaid-svg-Jgffi1sl6jKDDLzF .node rect,#mermaid-svg-Jgffi1sl6jKDDLzF .node circle,#mermaid-svg-Jgffi1sl6jKDDLzF .node ellipse,#mermaid-svg-Jgffi1sl6jKDDLzF .node polygon,#mermaid-svg-Jgffi1sl6jKDDLzF .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Jgffi1sl6jKDDLzF .rough-node .label text,#mermaid-svg-Jgffi1sl6jKDDLzF .node .label text,#mermaid-svg-Jgffi1sl6jKDDLzF .image-shape .label,#mermaid-svg-Jgffi1sl6jKDDLzF .icon-shape .label{text-anchor:middle;}#mermaid-svg-Jgffi1sl6jKDDLzF .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Jgffi1sl6jKDDLzF .rough-node .label,#mermaid-svg-Jgffi1sl6jKDDLzF .node .label,#mermaid-svg-Jgffi1sl6jKDDLzF .image-shape .label,#mermaid-svg-Jgffi1sl6jKDDLzF .icon-shape .label{text-align:center;}#mermaid-svg-Jgffi1sl6jKDDLzF .node.clickable{cursor:pointer;}#mermaid-svg-Jgffi1sl6jKDDLzF .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Jgffi1sl6jKDDLzF .arrowheadPath{fill:#333333;}#mermaid-svg-Jgffi1sl6jKDDLzF .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Jgffi1sl6jKDDLzF .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Jgffi1sl6jKDDLzF .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Jgffi1sl6jKDDLzF .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Jgffi1sl6jKDDLzF .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Jgffi1sl6jKDDLzF .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Jgffi1sl6jKDDLzF .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Jgffi1sl6jKDDLzF .cluster text{fill:#333;}#mermaid-svg-Jgffi1sl6jKDDLzF .cluster span{color:#333;}#mermaid-svg-Jgffi1sl6jKDDLzF div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Jgffi1sl6jKDDLzF .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Jgffi1sl6jKDDLzF rect.text{fill:none;stroke-width:0;}#mermaid-svg-Jgffi1sl6jKDDLzF .icon-shape,#mermaid-svg-Jgffi1sl6jKDDLzF .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Jgffi1sl6jKDDLzF .icon-shape p,#mermaid-svg-Jgffi1sl6jKDDLzF .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Jgffi1sl6jKDDLzF .icon-shape .label rect,#mermaid-svg-Jgffi1sl6jKDDLzF .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Jgffi1sl6jKDDLzF .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Jgffi1sl6jKDDLzF .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Jgffi1sl6jKDDLzF :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ECUC ComM configuration
ComMChannel
ComMUser
ComMGeneral features
ComMNmVariant、bus type、channel ID
TMinFullComModeDuration、NmLightTimeout
User-to-channel relation
User handle、direct channels、PNC relation
PNC、DCM、NVM、inhibition、RTE switches
ComM_Cfg_Internal.h
ComM_PBcfg.c
Preprocessor effective branches
Generated channel/user tables
ComM_Init、RequestComMode、state handlers
ComM_MainFunction_Channel
CanSM、Nm、BswM、Dcm interfaces
当前配置中,ComM_Cfg.h 提供两个通道句柄和两个用户句柄;ComM_Cfg_Internal.h 打开 CAN、Nm、Dcm,关闭 PNC、NVM、RTE、NoCom 限制和 PreventWakeUp;ComM_Main.c 为两个通道各生成一个主函数。
10.12 当前工程有效路径图
#mermaid-svg-8jUvlQgqCvYaZstB{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-8jUvlQgqCvYaZstB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-8jUvlQgqCvYaZstB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-8jUvlQgqCvYaZstB .error-icon{fill:#552222;}#mermaid-svg-8jUvlQgqCvYaZstB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8jUvlQgqCvYaZstB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-8jUvlQgqCvYaZstB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8jUvlQgqCvYaZstB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8jUvlQgqCvYaZstB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-8jUvlQgqCvYaZstB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8jUvlQgqCvYaZstB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8jUvlQgqCvYaZstB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8jUvlQgqCvYaZstB .marker.cross{stroke:#333333;}#mermaid-svg-8jUvlQgqCvYaZstB svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8jUvlQgqCvYaZstB p{margin:0;}#mermaid-svg-8jUvlQgqCvYaZstB .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-8jUvlQgqCvYaZstB .cluster-label text{fill:#333;}#mermaid-svg-8jUvlQgqCvYaZstB .cluster-label span{color:#333;}#mermaid-svg-8jUvlQgqCvYaZstB .cluster-label span p{background-color:transparent;}#mermaid-svg-8jUvlQgqCvYaZstB .label text,#mermaid-svg-8jUvlQgqCvYaZstB span{fill:#333;color:#333;}#mermaid-svg-8jUvlQgqCvYaZstB .node rect,#mermaid-svg-8jUvlQgqCvYaZstB .node circle,#mermaid-svg-8jUvlQgqCvYaZstB .node ellipse,#mermaid-svg-8jUvlQgqCvYaZstB .node polygon,#mermaid-svg-8jUvlQgqCvYaZstB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8jUvlQgqCvYaZstB .rough-node .label text,#mermaid-svg-8jUvlQgqCvYaZstB .node .label text,#mermaid-svg-8jUvlQgqCvYaZstB .image-shape .label,#mermaid-svg-8jUvlQgqCvYaZstB .icon-shape .label{text-anchor:middle;}#mermaid-svg-8jUvlQgqCvYaZstB .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-8jUvlQgqCvYaZstB .rough-node .label,#mermaid-svg-8jUvlQgqCvYaZstB .node .label,#mermaid-svg-8jUvlQgqCvYaZstB .image-shape .label,#mermaid-svg-8jUvlQgqCvYaZstB .icon-shape .label{text-align:center;}#mermaid-svg-8jUvlQgqCvYaZstB .node.clickable{cursor:pointer;}#mermaid-svg-8jUvlQgqCvYaZstB .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-8jUvlQgqCvYaZstB .arrowheadPath{fill:#333333;}#mermaid-svg-8jUvlQgqCvYaZstB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-8jUvlQgqCvYaZstB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-8jUvlQgqCvYaZstB .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8jUvlQgqCvYaZstB .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-8jUvlQgqCvYaZstB .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8jUvlQgqCvYaZstB .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-8jUvlQgqCvYaZstB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-8jUvlQgqCvYaZstB .cluster text{fill:#333;}#mermaid-svg-8jUvlQgqCvYaZstB .cluster span{color:#333;}#mermaid-svg-8jUvlQgqCvYaZstB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-8jUvlQgqCvYaZstB .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-8jUvlQgqCvYaZstB rect.text{fill:none;stroke-width:0;}#mermaid-svg-8jUvlQgqCvYaZstB .icon-shape,#mermaid-svg-8jUvlQgqCvYaZstB .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8jUvlQgqCvYaZstB .icon-shape p,#mermaid-svg-8jUvlQgqCvYaZstB .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-8jUvlQgqCvYaZstB .icon-shape .label rect,#mermaid-svg-8jUvlQgqCvYaZstB .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8jUvlQgqCvYaZstB .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-8jUvlQgqCvYaZstB .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-8jUvlQgqCvYaZstB :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 无
有
FALSE
TRUE
保持
释放
PrepareBusSleep
BusSleep
NetworkMode
NetworkMode
BusSleep
ComM_Init
2 channels initialized to NO_COM_NO_PENDING_REQUEST
User request or DCM/Nm passive request
保持 NO_COM
NO_COM_REQUEST_PENDING
CommunicationAllowed
FULL_COM_NETWORK_REQUESTED
Active request 或 min Full timer
FULL_COM_READY_SLEEP
Nm event
SILENT_COMMUNICATION
NetworkMode 或 BusSleep
CanSM 或 BusSM mode request
ComM_BusSM_ModeIndication
Notify BswM、DCM 和 users
当前有效路径的边界是:PNC 相关路径不存在;抑制分支不存在;RTE ComM 支持分支不存在;但 Dcm、Nm、CanSM、BswM 和两个通道主函数路径存在。
11. 规范与工程边界
PDF 中的 R25-11 规范定义了 ComM 的通用服务、通信模式、用户/通道模型、Nm/Dcm/EcuM/BswM 交互和配置约束;