AUTOSAR PDU Router(PduR)详解:模块架构、配置模型与路由流程
基于 AUTOSAR Classic Platform R25-11《Specification of PDU Router》整理。本文按照"模块定位---配置模型---路由流程---状态管理---工程检查"的方式说明 PduR 的工作机制,适合作为阅读 PduR 配置、生成代码和排查通信链路问题的参考。
规范依据:AUTOSAR CP R25-11,
AUTOSAR_CP_SWS_PDURouter,Document ID 35。本文是工程解读,不替代正式规范;具体 API、配置约束和供应商扩展应以项目实际版本和配置生成器为准。
目录
- 概述
- [PDU Router 模块架构](#PDU Router 模块架构)
- [PDU Router 配置模型](#PDU Router 配置模型)
- [PDU Router 路由流程](#PDU Router 路由流程)
- [PDU Router 状态机](#PDU Router 状态机)
- 总结与工程检查清单
1. 概述
1.1 PduR 的作用
PDU Router 是 AUTOSAR Classic 通信栈中的通用 I-PDU 转发模块,位于上层通信模块和下层通信接口/传输协议模块之间。它根据静态配置的路由路径,把一个模块产生或接收的 I-PDU 转发给指定的目标模块。
PduR 的核心特点:
- 根据静态 I-PDU ID 和路由表进行转发;
- 不解析、不修改普通 I-PDU 的有效载荷;
- 支持上层到下层的发送、下层到上层的接收;
- 支持通信接口模块之间的 I-PDU 网关;
- 支持传输协议模块之间的 TP 网关;
- 支持单播、组播、扇入和部分网关组合;
- 根据配置使用直接传递、TriggerTransmit、FIFO 或 TP 缓冲;
- 支持路由路径组的运行时使能和禁用;
- 通过通用接口模型适配 Com、Dcm、CanIf、CanTp、FrIf、LinIf、J1939Tp、DDS、LSduR 等模块。
PduR 不负责信号提取、信号转换、校验和、安全认证、按载荷动态路由或通信速率转换。需要这些功能时,应由 COM、Dcm 或其他专用上层模块完成。
1.2 PduR 在 AUTOSAR 架构中的位置
#mermaid-svg-8yxD813zHpOWY99z{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-8yxD813zHpOWY99z .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-8yxD813zHpOWY99z .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-8yxD813zHpOWY99z .error-icon{fill:#552222;}#mermaid-svg-8yxD813zHpOWY99z .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8yxD813zHpOWY99z .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-8yxD813zHpOWY99z .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8yxD813zHpOWY99z .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8yxD813zHpOWY99z .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-8yxD813zHpOWY99z .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8yxD813zHpOWY99z .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8yxD813zHpOWY99z .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8yxD813zHpOWY99z .marker.cross{stroke:#333333;}#mermaid-svg-8yxD813zHpOWY99z svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8yxD813zHpOWY99z p{margin:0;}#mermaid-svg-8yxD813zHpOWY99z .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-8yxD813zHpOWY99z .cluster-label text{fill:#333;}#mermaid-svg-8yxD813zHpOWY99z .cluster-label span{color:#333;}#mermaid-svg-8yxD813zHpOWY99z .cluster-label span p{background-color:transparent;}#mermaid-svg-8yxD813zHpOWY99z .label text,#mermaid-svg-8yxD813zHpOWY99z span{fill:#333;color:#333;}#mermaid-svg-8yxD813zHpOWY99z .node rect,#mermaid-svg-8yxD813zHpOWY99z .node circle,#mermaid-svg-8yxD813zHpOWY99z .node ellipse,#mermaid-svg-8yxD813zHpOWY99z .node polygon,#mermaid-svg-8yxD813zHpOWY99z .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8yxD813zHpOWY99z .rough-node .label text,#mermaid-svg-8yxD813zHpOWY99z .node .label text,#mermaid-svg-8yxD813zHpOWY99z .image-shape .label,#mermaid-svg-8yxD813zHpOWY99z .icon-shape .label{text-anchor:middle;}#mermaid-svg-8yxD813zHpOWY99z .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-8yxD813zHpOWY99z .rough-node .label,#mermaid-svg-8yxD813zHpOWY99z .node .label,#mermaid-svg-8yxD813zHpOWY99z .image-shape .label,#mermaid-svg-8yxD813zHpOWY99z .icon-shape .label{text-align:center;}#mermaid-svg-8yxD813zHpOWY99z .node.clickable{cursor:pointer;}#mermaid-svg-8yxD813zHpOWY99z .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-8yxD813zHpOWY99z .arrowheadPath{fill:#333333;}#mermaid-svg-8yxD813zHpOWY99z .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-8yxD813zHpOWY99z .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-8yxD813zHpOWY99z .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8yxD813zHpOWY99z .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-8yxD813zHpOWY99z .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8yxD813zHpOWY99z .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-8yxD813zHpOWY99z .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-8yxD813zHpOWY99z .cluster text{fill:#333;}#mermaid-svg-8yxD813zHpOWY99z .cluster span{color:#333;}#mermaid-svg-8yxD813zHpOWY99z 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-8yxD813zHpOWY99z .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-8yxD813zHpOWY99z rect.text{fill:none;stroke-width:0;}#mermaid-svg-8yxD813zHpOWY99z .icon-shape,#mermaid-svg-8yxD813zHpOWY99z .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8yxD813zHpOWY99z .icon-shape p,#mermaid-svg-8yxD813zHpOWY99z .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-8yxD813zHpOWY99z .icon-shape .label rect,#mermaid-svg-8yxD813zHpOWY99z .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8yxD813zHpOWY99z .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-8yxD813zHpOWY99z .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-8yxD813zHpOWY99z :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} SW-C / RTE
COM
Dcm
IpduM
PDU Router
CanIf / FrIf / LinIf
CanTp / FrTp / LinTp / J1939Tp
CAN / CAN FD / LIN / FlexRay / Ethernet
可以把 PduR 理解为"PDU 级交换中心":COM 关注信号与 I-PDU 的转换,Dcm 关注诊断服务,CanIf/FrIf/LinIf 关注通信接口,CanTp/FrTp/LinTp 关注分段传输,而 PduR 负责按配置连接这些模块。
1.3 三类主要操作
| 操作类别 | 典型方向 | 说明 |
|---|---|---|
| 接收并转发 | 下层模块 -> 上层模块 | 例如 CanIf 接收 I-PDU 后转给 COM |
| 发送并转发 | 上层模块 -> 下层模块 | 例如 COM 请求发送后转给 CanIf |
| 网关转发 | 下层模块 -> 下层模块 | 例如 CAN 接收后转发到另一条 CAN 或 LIN 网络 |
1.4 路由关系
| 表示 | 含义 | 例子 |
|---|---|---|
| 1:1 | 一个源对应一个目标 | CanIf -> COM |
| 1:n | 一个源对应多个目标 | COM -> CanIf、FrIf |
| n:1 | 多个源对应一个目标 | 多个 CanIf -> COM |
| n:m | 多个源对应多个目标 | PduR 通常不直接支持这种通用形式 |
通信接口和 TP 路由需要分别建模。一个多播发送请求的多个目标通常必须属于同一类模块,不能同时混合 CanIf 和 CanTp。
2. PDU Router 模块架构
2.1 路由表与路由引擎
PduR 主要由两部分组成:
- 路由路径配置:描述源模块、目标模块、PDU ID、缓存策略和路由组关系。
- 路由引擎:根据 API 调用查表,并把源 PDU ID 转换为目标模块使用的 PDU ID。
#mermaid-svg-VKCMvbhBVj9Tdn4W{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-VKCMvbhBVj9Tdn4W .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-VKCMvbhBVj9Tdn4W .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-VKCMvbhBVj9Tdn4W .error-icon{fill:#552222;}#mermaid-svg-VKCMvbhBVj9Tdn4W .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VKCMvbhBVj9Tdn4W .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-VKCMvbhBVj9Tdn4W .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VKCMvbhBVj9Tdn4W .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VKCMvbhBVj9Tdn4W .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-VKCMvbhBVj9Tdn4W .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VKCMvbhBVj9Tdn4W .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VKCMvbhBVj9Tdn4W .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VKCMvbhBVj9Tdn4W .marker.cross{stroke:#333333;}#mermaid-svg-VKCMvbhBVj9Tdn4W svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VKCMvbhBVj9Tdn4W p{margin:0;}#mermaid-svg-VKCMvbhBVj9Tdn4W .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-VKCMvbhBVj9Tdn4W .cluster-label text{fill:#333;}#mermaid-svg-VKCMvbhBVj9Tdn4W .cluster-label span{color:#333;}#mermaid-svg-VKCMvbhBVj9Tdn4W .cluster-label span p{background-color:transparent;}#mermaid-svg-VKCMvbhBVj9Tdn4W .label text,#mermaid-svg-VKCMvbhBVj9Tdn4W span{fill:#333;color:#333;}#mermaid-svg-VKCMvbhBVj9Tdn4W .node rect,#mermaid-svg-VKCMvbhBVj9Tdn4W .node circle,#mermaid-svg-VKCMvbhBVj9Tdn4W .node ellipse,#mermaid-svg-VKCMvbhBVj9Tdn4W .node polygon,#mermaid-svg-VKCMvbhBVj9Tdn4W .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VKCMvbhBVj9Tdn4W .rough-node .label text,#mermaid-svg-VKCMvbhBVj9Tdn4W .node .label text,#mermaid-svg-VKCMvbhBVj9Tdn4W .image-shape .label,#mermaid-svg-VKCMvbhBVj9Tdn4W .icon-shape .label{text-anchor:middle;}#mermaid-svg-VKCMvbhBVj9Tdn4W .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-VKCMvbhBVj9Tdn4W .rough-node .label,#mermaid-svg-VKCMvbhBVj9Tdn4W .node .label,#mermaid-svg-VKCMvbhBVj9Tdn4W .image-shape .label,#mermaid-svg-VKCMvbhBVj9Tdn4W .icon-shape .label{text-align:center;}#mermaid-svg-VKCMvbhBVj9Tdn4W .node.clickable{cursor:pointer;}#mermaid-svg-VKCMvbhBVj9Tdn4W .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-VKCMvbhBVj9Tdn4W .arrowheadPath{fill:#333333;}#mermaid-svg-VKCMvbhBVj9Tdn4W .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-VKCMvbhBVj9Tdn4W .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-VKCMvbhBVj9Tdn4W .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VKCMvbhBVj9Tdn4W .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-VKCMvbhBVj9Tdn4W .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VKCMvbhBVj9Tdn4W .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-VKCMvbhBVj9Tdn4W .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-VKCMvbhBVj9Tdn4W .cluster text{fill:#333;}#mermaid-svg-VKCMvbhBVj9Tdn4W .cluster span{color:#333;}#mermaid-svg-VKCMvbhBVj9Tdn4W 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-VKCMvbhBVj9Tdn4W .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-VKCMvbhBVj9Tdn4W rect.text{fill:none;stroke-width:0;}#mermaid-svg-VKCMvbhBVj9Tdn4W .icon-shape,#mermaid-svg-VKCMvbhBVj9Tdn4W .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VKCMvbhBVj9Tdn4W .icon-shape p,#mermaid-svg-VKCMvbhBVj9Tdn4W .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-VKCMvbhBVj9Tdn4W .icon-shape .label rect,#mermaid-svg-VKCMvbhBVj9Tdn4W .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VKCMvbhBVj9Tdn4W .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-VKCMvbhBVj9Tdn4W .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-VKCMvbhBVj9Tdn4W :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 源模块 API
源 PDU ID 查表
Routing Path
目标 PDU ID / 目标模块
Transmit / RxIndication / CopyData
确认或错误处理
典型发送链路:
text
Com_Transmit(ComTxPduId)
-> PduR_ComTransmit(PduRTxPduId)
-> CanIf_Transmit(CanIfTxPduId)
-> PduR_CanIfTxConfirmation(PduRConfirmationPduId)
-> Com_TxConfirmation(ComTxConfirmationPduId)
因此排查报文不发送时,不能只检查 COM 的 PDU ID,还要核对 PduR 和 CanIf 两侧的 ID 映射。
2.2 通用接口占位符
| 占位符 | 典型含义 | 典型模块 |
|---|---|---|
<Up> |
上层通信接口模块 | COM、IpduM、Nm |
<UpTp> |
上层传输协议用户 | Dcm、COM |
<Lo> |
下层通信接口模块 | CanIf、FrIf、LinIf |
<LoTp> |
下层传输协议模块 | CanTp、FrTp、LinTp、J1939Tp |
具体函数名由配置中的 BSW 模块引用确定,例如 PduR_ComTransmit、PduR_CanIfRxIndication、PduR_CanTpCopyRxData。
2.3 通信接口路由与 TP 路由
| 对比项 | 通信接口路由 | TP 路由 |
|---|---|---|
| 数据形态 | 通常一次传递完整 I-PDU | 可能被拆成多个 N-PDU |
| 主要 API | Transmit、RxIndication、TxConfirmation、TriggerTransmit |
StartOfReception、CopyRxData、CopyTxData、RxIndication、TxConfirmation |
| 缓冲需求 | 取决于 TriggerTransmit、FIFO 和网关配置 | TP 网关必须提供缓冲 |
| 典型上层 | COM | Dcm、COM |
| 典型下层 | CanIf、FrIf、LinIf | CanTp、FrTp、J1939Tp |
2.4 重要配置边界
配置生成器应拒绝或报告以下情况:
- 不同 MetaData 类型的 I-PDU 被连接到同一路由路径;
- TP 路由和通信接口路由被混合为同一网关;
- 扇入路径没有统一的队列策略;
- 需要缓冲的路径没有足够的
PduRBuffer; - 路由路径引用了不存在的模块、PDU 或路由组。
3. PDU Router 配置模型
3.1 配置对象关系
下面的关系图采用配置对象实体关系表示法。实体顶部是配置对象名称,下面列出该对象中最关键的属性;连线上的英文标签表示对象之间的引用或包含关系。
#mermaid-svg-HBdtVBsKjElL0wGE{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-HBdtVBsKjElL0wGE .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-HBdtVBsKjElL0wGE .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-HBdtVBsKjElL0wGE .error-icon{fill:#552222;}#mermaid-svg-HBdtVBsKjElL0wGE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-HBdtVBsKjElL0wGE .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-HBdtVBsKjElL0wGE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-HBdtVBsKjElL0wGE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-HBdtVBsKjElL0wGE .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-HBdtVBsKjElL0wGE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-HBdtVBsKjElL0wGE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-HBdtVBsKjElL0wGE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-HBdtVBsKjElL0wGE .marker.cross{stroke:#333333;}#mermaid-svg-HBdtVBsKjElL0wGE svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-HBdtVBsKjElL0wGE p{margin:0;}#mermaid-svg-HBdtVBsKjElL0wGE .entityBox{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-HBdtVBsKjElL0wGE .relationshipLabelBox{fill:hsl(80, 100%, 96.2745098039%);opacity:0.7;background-color:hsl(80, 100%, 96.2745098039%);}#mermaid-svg-HBdtVBsKjElL0wGE .relationshipLabelBox rect{opacity:0.5;}#mermaid-svg-HBdtVBsKjElL0wGE .labelBkg{background-color:rgba(248.6666666666, 255, 235.9999999999, 0.5);}#mermaid-svg-HBdtVBsKjElL0wGE .edgeLabel .label{fill:#9370DB;font-size:14px;}#mermaid-svg-HBdtVBsKjElL0wGE .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-HBdtVBsKjElL0wGE .edge-pattern-dashed{stroke-dasharray:8,8;}#mermaid-svg-HBdtVBsKjElL0wGE .node rect,#mermaid-svg-HBdtVBsKjElL0wGE .node circle,#mermaid-svg-HBdtVBsKjElL0wGE .node ellipse,#mermaid-svg-HBdtVBsKjElL0wGE .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-HBdtVBsKjElL0wGE .relationshipLine{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-HBdtVBsKjElL0wGE .marker{fill:none!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-HBdtVBsKjElL0wGE .edgeLabel{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-HBdtVBsKjElL0wGE .edgeLabel .label rect{fill:rgba(232,232,232, 0.8);}#mermaid-svg-HBdtVBsKjElL0wGE .edgeLabel .label text{fill:#333;}#mermaid-svg-HBdtVBsKjElL0wGE :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} contains
configures
controls
contains
owns
defines
maps_to
contains
enables
uses
routes_to
buffers_with
contains
provides
receives
PDUR
uint16
ConfigId
boolean
DevErrorDetect
boolean
VersionInfoApi
PDUR_BSW_MODULES
enum
ModuleType
uint16
ModuleId
string
ModuleRef
string
HeaderFile
PDUR_GENERAL
boolean
ZeroCostOperation
boolean
ZeroCopyOperation
boolean
CancelTransmit
boolean
MulticoreDistribution
PDUR_ROUTING_PATH_GROUP
uint16
RoutingPathGroupId
boolean
EnableAtStart
boolean
InitializeOnDisable
PDUR_ROUTING_PATHS
uint16
RoutingPathCount
string
RoutingPathList
PDUR_ROUTING_PATH
uint16
RoutingPathId
enum
RoutingType
enum
QueueingStrategy
uint16
QueueDepth
enum
MetaDataType
PDUR_SRC_PDU
uint16
SrcPduId
string
SrcModuleRef
string
SrcPduRef
PDUR_DEST_PDU
uint16
DestPduId
string
DestModuleRef
enum
DataProvision
uint16
DestPduLength
uint16
BufferRef
PDUR_BUFFER
uint16
BufferId
uint32
PduMaxLength
uint16
QueueDepth
enum
BufferType
PDUR_DEFAULT_VALUE
uint16
DefaultValueId
uint16
ElementCount
PDUR_DEFAULT_VALUE_ELEMENT
uint16
ElementIndex
uint8
Value
PDUR_DEM_EVENT_REFS
string
EventRef
enum
ReportingType
PduRRoutingPath 是路由关系的核心,描述一个源 PDU 与一个或多个目标 PDU 的映射。PduRBuffer 和目标 PDU 的缓存引用共同决定排队和缓存行为。
3.1.1 图中对象的阅读方式
PDUR:顶层 PduR 配置对象,统一管理模块、通用配置、路由路径组和缓冲资源。PDUR_BSW_MODULES:参与 PduR 交互的上层、通信接口和 TP 模块;生成器据此确定接口前缀和头文件。PDUR_ROUTING_PATH_GROUP:控制一组路由路径是否启用,可由PduR_EnableRouting和PduR_DisableRouting操作。PDUR_ROUTING_PATH:定义路由类型、队列策略和元数据规则,并关联源 PDU 与目标 PDU。PDUR_SRC_PDU:路由入口,记录源模块和源 PDU ID。PDUR_DEST_PDU:路由出口,可配置多个目标,用于 1:1 或 1:n 路由。PDUR_BUFFER:为 TriggerTransmit、FIFO、TP 网关或扇入场景提供数据存储。PDUR_DEFAULT_VALUE/PDUR_DEFAULT_VALUE_ELEMENT:路由禁用或初始化时使用的单帧默认数据。PDUR_DEM_EVENT_REFS:将生产错误或相关诊断事件映射到 DEM 配置。
该图表达的是 ECUC/配置模型中的对象关系,不表示运行时 API 的调用时序;运行时调用链见[第 4 章](#第 4 章)。
3.2 主要配置容器
| 配置容器 | 作用 | 工程关注点 |
|---|---|---|
PduR |
顶层配置 | 配置集和总体引用关系 |
PduRBswModules |
参与交互的 BSW 模块 | 模块类型、模块 ID、接口生成关系 |
PduRGeneral |
通用开关和错误检测 | 开发错误、生产错误、版本和路由策略 |
PduRRoutingPathGroup |
路由路径组 | 启动状态、运行时 enable/disable |
PduRRoutingPaths |
路由路径集合 | 管理所有源到目标的映射 |
PduRRoutingPath |
单条逻辑路由 | 路由组、源 PDU、目标 PDU、队列策略 |
PduRSrcPdu |
源端 PDU | 源模块、源 PDU ID |
PduRDestPdu |
目标端 PDU | 目标模块、目标 PDU ID、数据提供方式 |
PduRBuffer |
I-PDU 缓冲区 | 最大长度、队列深度、共享关系 |
PduRDefaultValue |
默认值 | 禁用或初始化时的单帧缓冲内容 |
PduRDemEventParameterRefs |
DEM 映射 | 生产错误和诊断事件引用 |
3.3 路由路径核心属性
- 源模块和源 PDU ID。
- 目标模块和目标 PDU ID。
- 路由方向:发送、接收或网关。
- 模块类型:通信接口或 TP。
- 路由路径组。
- 数据提供方式:直接数据提供或 TriggerTransmit。
- 队列策略:无队列、Last-is-best、FIFO、公共队列或专用队列。
- 缓冲引用及最大 PDU 长度。
- 元数据类型和转发规则。
3.4 数据提供方式
3.4.1 PDUR_DIRECT
目标模块在 Transmit 调用期间读取或复制 PDU 数据。该方式延迟低、缓存占用小,但目标模块必须在调用期间完成数据复制。
text
源模块 Transmit
-> PduR 调用目标 Transmit
-> 目标模块复制数据
-> PduR 结束当前处理
3.4.2 PDUR_TRIGGERTRANSMIT
目标模块先收到发送请求,之后在 TriggerTransmit 回调中获取数据,因此 PduR 必须在两次调用之间保存 I-PDU。
text
源模块 RxIndication
-> PduR 保存 I-PDU
-> PduR 调用目标 Transmit
-> 目标调用 PduR_<DstLo>TriggerTransmit
-> PduR 复制缓存数据
当 PduRQueueDepth = 1 时,常表现为 Last-is-best:最新收到的 I-PDU 覆盖旧的待发送数据。
3.5 缓冲类型与队列策略
缓冲类型
- Dedicated buffer:被指定路由路径专用,适合高优先级诊断报文。
- Global buffer:未被特定路径独占,可被满足条件的路由路径动态使用。
队列深度
PduRQueueDepth |
行为 |
|---|---|
0 |
不建立该路径的 PduR 队列,适合直接转发 |
1 |
单个缓冲位置,常用于 Last-is-best 或单帧缓存 |
>1 |
形成 FIFO,可缓存多个 I-PDU 实例 |
FIFO 满时,新到达的 I-PDU 会导致队列刷新,并报告 PDUR_E_PDU_INSTANCES_LOST。触发刷新的新 I-PDU 本身仍应按队列为空进行处理。
公共队列与专用队列
PDUR_COMMON_QUEUE:多个路由路径共享一个队列,适用于扇入并保持到达顺序。PDUR_DEDICATED_QUEUE:每个源或目标拥有独立队列,适用于需要独立处理目的地的多播场景。
扇入场景要求相关路径使用公共队列;多播场景可按配置选择公共队列或专用队列,但共享源或目标的路径必须满足队列配置一致性约束。
3.6 配置示例
text
PduRRoutingPathGroup: PduRGroup_NormalCommunication
enabledAtStart = true
PduRRoutingPath: ComToCan
source:
module = Com
pduId = ComTxPdu_EngineStatus
destination:
module = CanIf
pduId = CanIfTxPdu_EngineStatus
dataProvision = PDUR_DIRECT
queueDepth = 0
PduRRoutingPath: CanToCom
source:
module = CanIf
pduId = CanIfRxPdu_VehicleSpeed
destination:
module = Com
pduId = ComRxPdu_VehicleSpeed
queueDepth = 0
PduRBuffer: PduRBuffer_DiagnosticGateway
maxPduLength = 4095
queueDepth = 2
以上为结构示意,不是可直接导入配置工具的 ECUC 文件。
4. PDU Router 路由流程
4.1 普通 I-PDU 接收
COM / 上层模块 PduR CanIf / FrIf / LinIf COM / 上层模块 PduR CanIf / FrIf / LinIf #mermaid-svg-Wk9WvTfy7buxbAxZ{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-Wk9WvTfy7buxbAxZ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Wk9WvTfy7buxbAxZ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Wk9WvTfy7buxbAxZ .error-icon{fill:#552222;}#mermaid-svg-Wk9WvTfy7buxbAxZ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Wk9WvTfy7buxbAxZ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Wk9WvTfy7buxbAxZ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Wk9WvTfy7buxbAxZ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Wk9WvTfy7buxbAxZ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Wk9WvTfy7buxbAxZ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Wk9WvTfy7buxbAxZ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Wk9WvTfy7buxbAxZ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Wk9WvTfy7buxbAxZ .marker.cross{stroke:#333333;}#mermaid-svg-Wk9WvTfy7buxbAxZ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Wk9WvTfy7buxbAxZ p{margin:0;}#mermaid-svg-Wk9WvTfy7buxbAxZ .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Wk9WvTfy7buxbAxZ text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-Wk9WvTfy7buxbAxZ .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-Wk9WvTfy7buxbAxZ .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-Wk9WvTfy7buxbAxZ .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-Wk9WvTfy7buxbAxZ .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-Wk9WvTfy7buxbAxZ #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-Wk9WvTfy7buxbAxZ .sequenceNumber{fill:white;}#mermaid-svg-Wk9WvTfy7buxbAxZ #sequencenumber{fill:#333;}#mermaid-svg-Wk9WvTfy7buxbAxZ #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-Wk9WvTfy7buxbAxZ .messageText{fill:#333;stroke:none;}#mermaid-svg-Wk9WvTfy7buxbAxZ .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Wk9WvTfy7buxbAxZ .labelText,#mermaid-svg-Wk9WvTfy7buxbAxZ .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-Wk9WvTfy7buxbAxZ .loopText,#mermaid-svg-Wk9WvTfy7buxbAxZ .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-Wk9WvTfy7buxbAxZ .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-Wk9WvTfy7buxbAxZ .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-Wk9WvTfy7buxbAxZ .noteText,#mermaid-svg-Wk9WvTfy7buxbAxZ .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-Wk9WvTfy7buxbAxZ .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Wk9WvTfy7buxbAxZ .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Wk9WvTfy7buxbAxZ .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Wk9WvTfy7buxbAxZ .actorPopupMenu{position:absolute;}#mermaid-svg-Wk9WvTfy7buxbAxZ .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-Wk9WvTfy7buxbAxZ .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Wk9WvTfy7buxbAxZ .actor-man circle,#mermaid-svg-Wk9WvTfy7buxbAxZ line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-Wk9WvTfy7buxbAxZ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} PduR_<User:Lo>RxIndication(RxPduId, PduInfoPtr) 查找源 PDU 和路由组 判断路径是否启用 <Up>_RxIndication(DstPduId, PduInfoPtr) 返回
普通直接接收通常不需要 PduR 缓冲。需要缓存时,必须遵循目标长度、缓冲容量和队列深度限制。
4.2 普通 I-PDU 发送
CanIf / FrIf / LinIf PduR COM / 上层模块 CanIf / FrIf / LinIf PduR COM / 上层模块 #mermaid-svg-6gw3LnVmEzPyGzwQ{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-6gw3LnVmEzPyGzwQ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-6gw3LnVmEzPyGzwQ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-6gw3LnVmEzPyGzwQ .error-icon{fill:#552222;}#mermaid-svg-6gw3LnVmEzPyGzwQ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-6gw3LnVmEzPyGzwQ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-6gw3LnVmEzPyGzwQ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-6gw3LnVmEzPyGzwQ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-6gw3LnVmEzPyGzwQ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-6gw3LnVmEzPyGzwQ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-6gw3LnVmEzPyGzwQ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-6gw3LnVmEzPyGzwQ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-6gw3LnVmEzPyGzwQ .marker.cross{stroke:#333333;}#mermaid-svg-6gw3LnVmEzPyGzwQ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-6gw3LnVmEzPyGzwQ p{margin:0;}#mermaid-svg-6gw3LnVmEzPyGzwQ .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-6gw3LnVmEzPyGzwQ text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-6gw3LnVmEzPyGzwQ .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-6gw3LnVmEzPyGzwQ .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-6gw3LnVmEzPyGzwQ .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-6gw3LnVmEzPyGzwQ .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-6gw3LnVmEzPyGzwQ #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-6gw3LnVmEzPyGzwQ .sequenceNumber{fill:white;}#mermaid-svg-6gw3LnVmEzPyGzwQ #sequencenumber{fill:#333;}#mermaid-svg-6gw3LnVmEzPyGzwQ #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-6gw3LnVmEzPyGzwQ .messageText{fill:#333;stroke:none;}#mermaid-svg-6gw3LnVmEzPyGzwQ .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-6gw3LnVmEzPyGzwQ .labelText,#mermaid-svg-6gw3LnVmEzPyGzwQ .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-6gw3LnVmEzPyGzwQ .loopText,#mermaid-svg-6gw3LnVmEzPyGzwQ .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-6gw3LnVmEzPyGzwQ .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-6gw3LnVmEzPyGzwQ .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-6gw3LnVmEzPyGzwQ .noteText,#mermaid-svg-6gw3LnVmEzPyGzwQ .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-6gw3LnVmEzPyGzwQ .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-6gw3LnVmEzPyGzwQ .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-6gw3LnVmEzPyGzwQ .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-6gw3LnVmEzPyGzwQ .actorPopupMenu{position:absolute;}#mermaid-svg-6gw3LnVmEzPyGzwQ .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-6gw3LnVmEzPyGzwQ .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-6gw3LnVmEzPyGzwQ .actor-man circle,#mermaid-svg-6gw3LnVmEzPyGzwQ line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-6gw3LnVmEzPyGzwQ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} PduR_<User:Up>Transmit(TxPduId, PduInfoPtr) 查找 RoutingPath <Lo>Transmit(DstPduId, PduInfoPtr) E_OK / E_NOT_OK 返回发送请求结果 PduR<User:Lo>TxConfirmation(DstPduId, result) <Up>_TxConfirmation(SrcPduId, result)
上层发送场景下,PduR 不应把完整 PDU 作为普通发送缓存长期保存。是否在 TriggerTransmit 中获取数据,由目标 PDU 的配置决定。
4.3 多播发送
多播表示一个上层源 PDU 被发送到多个同类目标模块。典型规则:
- 至少一个目标
Transmit返回E_OK时,PduR 可向上层返回E_OK; - PduR 通常在最后一个需要确认的目标返回确认后,向上层报告最终结果;
- 至少一个目标确认成功时,最终确认结果可为
E_OK; - 一个目标失败不应阻止其他目标继续发送;
- 多个目标必须同属于通信接口模块,或同属于 TP 模块,不能混合。
TP 多播需要重复从上层获取相同数据。PduR 通过 RetryInfoType 和 TpDataState 管理不同目标的数据读取位置,多个目标按锁步方式推进。
4.4 TP 接收
Dcm / COM PduR CanTp / FrTp / LinTp Dcm / COM PduR CanTp / FrTp / LinTp #mermaid-svg-fNgSsLbkd6co2efi{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-fNgSsLbkd6co2efi .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-fNgSsLbkd6co2efi .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-fNgSsLbkd6co2efi .error-icon{fill:#552222;}#mermaid-svg-fNgSsLbkd6co2efi .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fNgSsLbkd6co2efi .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-fNgSsLbkd6co2efi .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fNgSsLbkd6co2efi .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fNgSsLbkd6co2efi .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-fNgSsLbkd6co2efi .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fNgSsLbkd6co2efi .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fNgSsLbkd6co2efi .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fNgSsLbkd6co2efi .marker.cross{stroke:#333333;}#mermaid-svg-fNgSsLbkd6co2efi svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fNgSsLbkd6co2efi p{margin:0;}#mermaid-svg-fNgSsLbkd6co2efi .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-fNgSsLbkd6co2efi text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-fNgSsLbkd6co2efi .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-fNgSsLbkd6co2efi .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-fNgSsLbkd6co2efi .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-fNgSsLbkd6co2efi .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-fNgSsLbkd6co2efi #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-fNgSsLbkd6co2efi .sequenceNumber{fill:white;}#mermaid-svg-fNgSsLbkd6co2efi #sequencenumber{fill:#333;}#mermaid-svg-fNgSsLbkd6co2efi #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-fNgSsLbkd6co2efi .messageText{fill:#333;stroke:none;}#mermaid-svg-fNgSsLbkd6co2efi .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-fNgSsLbkd6co2efi .labelText,#mermaid-svg-fNgSsLbkd6co2efi .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-fNgSsLbkd6co2efi .loopText,#mermaid-svg-fNgSsLbkd6co2efi .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-fNgSsLbkd6co2efi .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-fNgSsLbkd6co2efi .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-fNgSsLbkd6co2efi .noteText,#mermaid-svg-fNgSsLbkd6co2efi .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-fNgSsLbkd6co2efi .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-fNgSsLbkd6co2efi .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-fNgSsLbkd6co2efi .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-fNgSsLbkd6co2efi .actorPopupMenu{position:absolute;}#mermaid-svg-fNgSsLbkd6co2efi .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-fNgSsLbkd6co2efi .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-fNgSsLbkd6co2efi .actor-man circle,#mermaid-svg-fNgSsLbkd6co2efi line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-fNgSsLbkd6co2efi :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} loop 每个 N-PDU 数据段 PduR_<User:LoTp>StartOfReception <UpTp>StartOfReception bufferSize / result BUFREQ* PduR_<User:LoTp>CopyRxData <UpTp>CopyRxData BUFREQ* / bufferSize BUFREQ_* PduR_<User:LoTp>RxIndication(result) <UpTp>_TpRxIndication(result)
关键点:
StartOfReception建立接收会话并确认上层可用缓存;CopyRxData将每个分段数据交给上层;RxIndication表示完整 I-PDU 接收结束;TpSduLength = 0可表示未知长度或流式数据;- 上层缓存不足时,PduR 应向 TP 返回相应
BUFREQ_E_*结果。
4.5 TP 发送
CanTp / FrTp / LinTp PduR Dcm / COM CanTp / FrTp / LinTp PduR Dcm / COM #mermaid-svg-UKTu72SHfab9iQh7{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-UKTu72SHfab9iQh7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-UKTu72SHfab9iQh7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-UKTu72SHfab9iQh7 .error-icon{fill:#552222;}#mermaid-svg-UKTu72SHfab9iQh7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-UKTu72SHfab9iQh7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-UKTu72SHfab9iQh7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-UKTu72SHfab9iQh7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-UKTu72SHfab9iQh7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-UKTu72SHfab9iQh7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-UKTu72SHfab9iQh7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-UKTu72SHfab9iQh7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-UKTu72SHfab9iQh7 .marker.cross{stroke:#333333;}#mermaid-svg-UKTu72SHfab9iQh7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-UKTu72SHfab9iQh7 p{margin:0;}#mermaid-svg-UKTu72SHfab9iQh7 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-UKTu72SHfab9iQh7 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-UKTu72SHfab9iQh7 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-UKTu72SHfab9iQh7 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-UKTu72SHfab9iQh7 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-UKTu72SHfab9iQh7 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-UKTu72SHfab9iQh7 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-UKTu72SHfab9iQh7 .sequenceNumber{fill:white;}#mermaid-svg-UKTu72SHfab9iQh7 #sequencenumber{fill:#333;}#mermaid-svg-UKTu72SHfab9iQh7 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-UKTu72SHfab9iQh7 .messageText{fill:#333;stroke:none;}#mermaid-svg-UKTu72SHfab9iQh7 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-UKTu72SHfab9iQh7 .labelText,#mermaid-svg-UKTu72SHfab9iQh7 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-UKTu72SHfab9iQh7 .loopText,#mermaid-svg-UKTu72SHfab9iQh7 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-UKTu72SHfab9iQh7 .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-UKTu72SHfab9iQh7 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-UKTu72SHfab9iQh7 .noteText,#mermaid-svg-UKTu72SHfab9iQh7 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-UKTu72SHfab9iQh7 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-UKTu72SHfab9iQh7 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-UKTu72SHfab9iQh7 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-UKTu72SHfab9iQh7 .actorPopupMenu{position:absolute;}#mermaid-svg-UKTu72SHfab9iQh7 .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-UKTu72SHfab9iQh7 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-UKTu72SHfab9iQh7 .actor-man circle,#mermaid-svg-UKTu72SHfab9iQh7 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-UKTu72SHfab9iQh7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} loop 每个 N-PDU 数据段 PduR_<User:Up>Transmit <LoTp>Transmit 接受发送请求 PduR<User:LoTp>CopyTxData <UpTp>CopyTxData 提供一段数据 返回数据和剩余长度 PduR<User:LoTp>TxConfirmation(result) <UpTp>_TpTxConfirmation(result)
CopyTxData 的 RetryInfoType 需要重点关注:
TP_CONFPENDING:已复制数据仍需保留以便错误恢复;TP_DATACONF:此前复制的数据已确认,可以释放;TP_DATARETRY:从指定偏移重新提供数据;availableDataPtr:报告上层发送缓冲中的剩余数据量。
4.6 通信接口网关
通信接口网关将一个通信接口接收的 I-PDU 转发到一个或多个通信接口目标,支持 1:1、1:n 和 n:1。n:1 通常需要公共 FIFO 保持到达顺序。
#mermaid-svg-5kvfO1W4Cglevftc{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-5kvfO1W4Cglevftc .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-5kvfO1W4Cglevftc .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-5kvfO1W4Cglevftc .error-icon{fill:#552222;}#mermaid-svg-5kvfO1W4Cglevftc .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5kvfO1W4Cglevftc .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-5kvfO1W4Cglevftc .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5kvfO1W4Cglevftc .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5kvfO1W4Cglevftc .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-5kvfO1W4Cglevftc .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5kvfO1W4Cglevftc .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5kvfO1W4Cglevftc .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5kvfO1W4Cglevftc .marker.cross{stroke:#333333;}#mermaid-svg-5kvfO1W4Cglevftc svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5kvfO1W4Cglevftc p{margin:0;}#mermaid-svg-5kvfO1W4Cglevftc .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-5kvfO1W4Cglevftc .cluster-label text{fill:#333;}#mermaid-svg-5kvfO1W4Cglevftc .cluster-label span{color:#333;}#mermaid-svg-5kvfO1W4Cglevftc .cluster-label span p{background-color:transparent;}#mermaid-svg-5kvfO1W4Cglevftc .label text,#mermaid-svg-5kvfO1W4Cglevftc span{fill:#333;color:#333;}#mermaid-svg-5kvfO1W4Cglevftc .node rect,#mermaid-svg-5kvfO1W4Cglevftc .node circle,#mermaid-svg-5kvfO1W4Cglevftc .node ellipse,#mermaid-svg-5kvfO1W4Cglevftc .node polygon,#mermaid-svg-5kvfO1W4Cglevftc .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5kvfO1W4Cglevftc .rough-node .label text,#mermaid-svg-5kvfO1W4Cglevftc .node .label text,#mermaid-svg-5kvfO1W4Cglevftc .image-shape .label,#mermaid-svg-5kvfO1W4Cglevftc .icon-shape .label{text-anchor:middle;}#mermaid-svg-5kvfO1W4Cglevftc .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-5kvfO1W4Cglevftc .rough-node .label,#mermaid-svg-5kvfO1W4Cglevftc .node .label,#mermaid-svg-5kvfO1W4Cglevftc .image-shape .label,#mermaid-svg-5kvfO1W4Cglevftc .icon-shape .label{text-align:center;}#mermaid-svg-5kvfO1W4Cglevftc .node.clickable{cursor:pointer;}#mermaid-svg-5kvfO1W4Cglevftc .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-5kvfO1W4Cglevftc .arrowheadPath{fill:#333333;}#mermaid-svg-5kvfO1W4Cglevftc .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-5kvfO1W4Cglevftc .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-5kvfO1W4Cglevftc .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5kvfO1W4Cglevftc .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-5kvfO1W4Cglevftc .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5kvfO1W4Cglevftc .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-5kvfO1W4Cglevftc .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-5kvfO1W4Cglevftc .cluster text{fill:#333;}#mermaid-svg-5kvfO1W4Cglevftc .cluster span{color:#333;}#mermaid-svg-5kvfO1W4Cglevftc 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-5kvfO1W4Cglevftc .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-5kvfO1W4Cglevftc rect.text{fill:none;stroke-width:0;}#mermaid-svg-5kvfO1W4Cglevftc .icon-shape,#mermaid-svg-5kvfO1W4Cglevftc .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5kvfO1W4Cglevftc .icon-shape p,#mermaid-svg-5kvfO1W4Cglevftc .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-5kvfO1W4Cglevftc .icon-shape .label rect,#mermaid-svg-5kvfO1W4Cglevftc .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5kvfO1W4Cglevftc .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-5kvfO1W4Cglevftc .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-5kvfO1W4Cglevftc :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} CanIf 源 PDU
PduR
FrIf 源 PDU
CanIf 目标 PDU
LinIf 目标 PDU
COM 本地接收
立即网关 :目标使用 PDUR_DIRECT,在源 RxIndication 处理过程中立即调用目标 Transmit。
缓冲网关 :目标使用 PDUR_TRIGGERTRANSMIT 或路径配置 FIFO,PduR 保存数据并等待目标后续调用 TriggerTransmit。
4.7 TP 网关
TP 网关只能在 TP 模块之间建立。主要方式:
- Direct gatewaying:完整 I-PDU 收齐后再向目标 TP 发送。
- On-the-fly gatewaying :收到的字节数达到
PduRTpThreshold后,提前开始目标 TP 发送。
#mermaid-svg-MPF6qkTZlHPmnN2J{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-MPF6qkTZlHPmnN2J .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-MPF6qkTZlHPmnN2J .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-MPF6qkTZlHPmnN2J .error-icon{fill:#552222;}#mermaid-svg-MPF6qkTZlHPmnN2J .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-MPF6qkTZlHPmnN2J .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-MPF6qkTZlHPmnN2J .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-MPF6qkTZlHPmnN2J .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-MPF6qkTZlHPmnN2J .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-MPF6qkTZlHPmnN2J .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-MPF6qkTZlHPmnN2J .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-MPF6qkTZlHPmnN2J .marker{fill:#333333;stroke:#333333;}#mermaid-svg-MPF6qkTZlHPmnN2J .marker.cross{stroke:#333333;}#mermaid-svg-MPF6qkTZlHPmnN2J svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-MPF6qkTZlHPmnN2J p{margin:0;}#mermaid-svg-MPF6qkTZlHPmnN2J .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-MPF6qkTZlHPmnN2J .cluster-label text{fill:#333;}#mermaid-svg-MPF6qkTZlHPmnN2J .cluster-label span{color:#333;}#mermaid-svg-MPF6qkTZlHPmnN2J .cluster-label span p{background-color:transparent;}#mermaid-svg-MPF6qkTZlHPmnN2J .label text,#mermaid-svg-MPF6qkTZlHPmnN2J span{fill:#333;color:#333;}#mermaid-svg-MPF6qkTZlHPmnN2J .node rect,#mermaid-svg-MPF6qkTZlHPmnN2J .node circle,#mermaid-svg-MPF6qkTZlHPmnN2J .node ellipse,#mermaid-svg-MPF6qkTZlHPmnN2J .node polygon,#mermaid-svg-MPF6qkTZlHPmnN2J .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-MPF6qkTZlHPmnN2J .rough-node .label text,#mermaid-svg-MPF6qkTZlHPmnN2J .node .label text,#mermaid-svg-MPF6qkTZlHPmnN2J .image-shape .label,#mermaid-svg-MPF6qkTZlHPmnN2J .icon-shape .label{text-anchor:middle;}#mermaid-svg-MPF6qkTZlHPmnN2J .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-MPF6qkTZlHPmnN2J .rough-node .label,#mermaid-svg-MPF6qkTZlHPmnN2J .node .label,#mermaid-svg-MPF6qkTZlHPmnN2J .image-shape .label,#mermaid-svg-MPF6qkTZlHPmnN2J .icon-shape .label{text-align:center;}#mermaid-svg-MPF6qkTZlHPmnN2J .node.clickable{cursor:pointer;}#mermaid-svg-MPF6qkTZlHPmnN2J .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-MPF6qkTZlHPmnN2J .arrowheadPath{fill:#333333;}#mermaid-svg-MPF6qkTZlHPmnN2J .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-MPF6qkTZlHPmnN2J .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-MPF6qkTZlHPmnN2J .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-MPF6qkTZlHPmnN2J .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-MPF6qkTZlHPmnN2J .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-MPF6qkTZlHPmnN2J .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-MPF6qkTZlHPmnN2J .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-MPF6qkTZlHPmnN2J .cluster text{fill:#333;}#mermaid-svg-MPF6qkTZlHPmnN2J .cluster span{color:#333;}#mermaid-svg-MPF6qkTZlHPmnN2J 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-MPF6qkTZlHPmnN2J .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-MPF6qkTZlHPmnN2J rect.text{fill:none;stroke-width:0;}#mermaid-svg-MPF6qkTZlHPmnN2J .icon-shape,#mermaid-svg-MPF6qkTZlHPmnN2J .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-MPF6qkTZlHPmnN2J .icon-shape p,#mermaid-svg-MPF6qkTZlHPmnN2J .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-MPF6qkTZlHPmnN2J .icon-shape .label rect,#mermaid-svg-MPF6qkTZlHPmnN2J .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-MPF6qkTZlHPmnN2J .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-MPF6qkTZlHPmnN2J .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-MPF6qkTZlHPmnN2J :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否
是
源 TP StartOfReception
PduR TP Buffer
达到 PduRTpThreshold?
目标 TP Transmit
CopyRxData / CopyTxData
源 TP RxIndication
注意事项:
- TP 网关必须配置足够的缓冲;
PduRBuffer最大长度应覆盖可能的 I-PDU 长度;- 使用 MetaData 时,MetaData 也必须保存和转发;
- On-the-fly 通常只允许一个 TP 目标;
- On-the-fly 对已发送数据的重传支持受限;
- 目标传输确认后,PduR 才能释放对应 TP 缓冲;
- 缓冲分配失败时,应返回
BUFREQ_E_OVFL并停止该会话。
4.8 取消发送与取消接收
上层调用 PduR_<User:Up>CancelTransmit 后,PduR 将请求转发给一个或多个目标:
- 单目标:返回目标模块的取消结果;
- 多目标:所有目标都返回
E_OK时,PduR 才返回E_OK; - 路由路径已禁用:直接返回
E_NOT_OK,不调用目标模块。
上层调用 PduR_<User:Up>CancelReceive 后,PduR 将请求转给对应下层 TP 模块,用于终止已建立的 TP 接收会话。
4.9 错误与缓冲溢出
| 场景 | 典型行为 |
|---|---|
目标 Transmit 返回 E_NOT_OK |
当前发送或网关实例失败;FIFO 场景可移除当前项并尝试下一项 |
| FIFO 满 | 刷新队列,报告 PDUR_E_PDU_INSTANCES_LOST |
| TP 缓冲申请失败 | 返回 BUFREQ_E_OVFL,终止当前会话 |
CopyRxData 无法保存数据 |
返回 BUFREQ_E_NOT_OK,停止当前会话 |
| 一个多播目标失败 | 其他目标继续处理,错误按目标独立处理 |
| 所有 TP 网关目标失败 | 终止源侧接收或返回错误 |
| 无效路由组 ID | 无动作;启用开发错误检测时报告 DET 错误 |
PduR 报错时,DET 调用中的实例 ID 通常应使用触发调用的相邻模块 ID,以区分不同 CanIf、CanTp 或上层模块的错误。
5. PDU Router 状态机
5.1 模块状态
#mermaid-svg-ifhMn8V0TwcZPtxw{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-ifhMn8V0TwcZPtxw .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ifhMn8V0TwcZPtxw .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ifhMn8V0TwcZPtxw .error-icon{fill:#552222;}#mermaid-svg-ifhMn8V0TwcZPtxw .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ifhMn8V0TwcZPtxw .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ifhMn8V0TwcZPtxw .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ifhMn8V0TwcZPtxw .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ifhMn8V0TwcZPtxw .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ifhMn8V0TwcZPtxw .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ifhMn8V0TwcZPtxw .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ifhMn8V0TwcZPtxw .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ifhMn8V0TwcZPtxw .marker.cross{stroke:#333333;}#mermaid-svg-ifhMn8V0TwcZPtxw svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ifhMn8V0TwcZPtxw p{margin:0;}#mermaid-svg-ifhMn8V0TwcZPtxw defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-ifhMn8V0TwcZPtxw g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-ifhMn8V0TwcZPtxw g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-ifhMn8V0TwcZPtxw g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-ifhMn8V0TwcZPtxw g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-ifhMn8V0TwcZPtxw g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-ifhMn8V0TwcZPtxw .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-ifhMn8V0TwcZPtxw .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-ifhMn8V0TwcZPtxw .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-ifhMn8V0TwcZPtxw .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-ifhMn8V0TwcZPtxw .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-ifhMn8V0TwcZPtxw .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-ifhMn8V0TwcZPtxw .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-ifhMn8V0TwcZPtxw .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ifhMn8V0TwcZPtxw .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ifhMn8V0TwcZPtxw .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ifhMn8V0TwcZPtxw .edgeLabel .label text{fill:#333;}#mermaid-svg-ifhMn8V0TwcZPtxw .label div .edgeLabel{color:#333;}#mermaid-svg-ifhMn8V0TwcZPtxw .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-ifhMn8V0TwcZPtxw .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-ifhMn8V0TwcZPtxw .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-ifhMn8V0TwcZPtxw .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-ifhMn8V0TwcZPtxw .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-ifhMn8V0TwcZPtxw .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ifhMn8V0TwcZPtxw .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ifhMn8V0TwcZPtxw #statediagram-barbEnd{fill:#333333;}#mermaid-svg-ifhMn8V0TwcZPtxw .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ifhMn8V0TwcZPtxw .cluster-label,#mermaid-svg-ifhMn8V0TwcZPtxw .nodeLabel{color:#131300;}#mermaid-svg-ifhMn8V0TwcZPtxw .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-ifhMn8V0TwcZPtxw .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-ifhMn8V0TwcZPtxw .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-ifhMn8V0TwcZPtxw .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-ifhMn8V0TwcZPtxw .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-ifhMn8V0TwcZPtxw .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-ifhMn8V0TwcZPtxw .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-ifhMn8V0TwcZPtxw .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-ifhMn8V0TwcZPtxw .note-edge{stroke-dasharray:5;}#mermaid-svg-ifhMn8V0TwcZPtxw .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-ifhMn8V0TwcZPtxw .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-ifhMn8V0TwcZPtxw .statediagram-note text{fill:black;}#mermaid-svg-ifhMn8V0TwcZPtxw .statediagram-note .nodeLabel{color:black;}#mermaid-svg-ifhMn8V0TwcZPtxw .statediagram .edgeLabel{color:red;}#mermaid-svg-ifhMn8V0TwcZPtxw #dependencyStart,#mermaid-svg-ifhMn8V0TwcZPtxw #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-ifhMn8V0TwcZPtxw .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ifhMn8V0TwcZPtxw :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} PduR_Init()
路由组使能/禁用
复位或重新初始化
PDUR_UNINIT
PDUR_ONLINE
| 状态 | 含义 | 主要操作 |
|---|---|---|
PDUR_UNINIT |
PduR 尚未初始化 | 不应执行正常路由 |
PDUR_ONLINE |
PduR 已成功初始化 | 执行发送、接收、网关、取消和路由组管理 |
5.2 路由路径组状态
#mermaid-svg-9rb0wlsSrdK19jKK{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-9rb0wlsSrdK19jKK .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-9rb0wlsSrdK19jKK .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-9rb0wlsSrdK19jKK .error-icon{fill:#552222;}#mermaid-svg-9rb0wlsSrdK19jKK .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-9rb0wlsSrdK19jKK .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-9rb0wlsSrdK19jKK .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-9rb0wlsSrdK19jKK .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-9rb0wlsSrdK19jKK .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-9rb0wlsSrdK19jKK .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-9rb0wlsSrdK19jKK .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-9rb0wlsSrdK19jKK .marker{fill:#333333;stroke:#333333;}#mermaid-svg-9rb0wlsSrdK19jKK .marker.cross{stroke:#333333;}#mermaid-svg-9rb0wlsSrdK19jKK svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-9rb0wlsSrdK19jKK p{margin:0;}#mermaid-svg-9rb0wlsSrdK19jKK defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-9rb0wlsSrdK19jKK g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-9rb0wlsSrdK19jKK g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-9rb0wlsSrdK19jKK g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-9rb0wlsSrdK19jKK g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-9rb0wlsSrdK19jKK g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-9rb0wlsSrdK19jKK .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-9rb0wlsSrdK19jKK .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-9rb0wlsSrdK19jKK .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-9rb0wlsSrdK19jKK .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-9rb0wlsSrdK19jKK .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-9rb0wlsSrdK19jKK .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-9rb0wlsSrdK19jKK .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-9rb0wlsSrdK19jKK .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-9rb0wlsSrdK19jKK .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-9rb0wlsSrdK19jKK .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-9rb0wlsSrdK19jKK .edgeLabel .label text{fill:#333;}#mermaid-svg-9rb0wlsSrdK19jKK .label div .edgeLabel{color:#333;}#mermaid-svg-9rb0wlsSrdK19jKK .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-9rb0wlsSrdK19jKK .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-9rb0wlsSrdK19jKK .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-9rb0wlsSrdK19jKK .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-9rb0wlsSrdK19jKK .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-9rb0wlsSrdK19jKK .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-9rb0wlsSrdK19jKK .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-9rb0wlsSrdK19jKK #statediagram-barbEnd{fill:#333333;}#mermaid-svg-9rb0wlsSrdK19jKK .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-9rb0wlsSrdK19jKK .cluster-label,#mermaid-svg-9rb0wlsSrdK19jKK .nodeLabel{color:#131300;}#mermaid-svg-9rb0wlsSrdK19jKK .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-9rb0wlsSrdK19jKK .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-9rb0wlsSrdK19jKK .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-9rb0wlsSrdK19jKK .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-9rb0wlsSrdK19jKK .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-9rb0wlsSrdK19jKK .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-9rb0wlsSrdK19jKK .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-9rb0wlsSrdK19jKK .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-9rb0wlsSrdK19jKK .note-edge{stroke-dasharray:5;}#mermaid-svg-9rb0wlsSrdK19jKK .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-9rb0wlsSrdK19jKK .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-9rb0wlsSrdK19jKK .statediagram-note text{fill:black;}#mermaid-svg-9rb0wlsSrdK19jKK .statediagram-note .nodeLabel{color:black;}#mermaid-svg-9rb0wlsSrdK19jKK .statediagram .edgeLabel{color:red;}#mermaid-svg-9rb0wlsSrdK19jKK #dependencyStart,#mermaid-svg-9rb0wlsSrdK19jKK #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-9rb0wlsSrdK19jKK .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-9rb0wlsSrdK19jKK :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} PduR_EnableRouting(GroupId)
PduR_DisableRouting(GroupId, initialize)
Enable 无效 GroupId
Enable 已启用 GroupId
Disabled
Enabled
路由组未启用时,相关发送、接收和网关路径不应正常转发。PduR_DisableRouting 的 initialize 参数决定禁用时是否将单帧缓冲区恢复为默认值。
5.3 PDU 缓冲状态
#mermaid-svg-MVfbmGuwRfW6yUK1{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-MVfbmGuwRfW6yUK1 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-MVfbmGuwRfW6yUK1 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-MVfbmGuwRfW6yUK1 .error-icon{fill:#552222;}#mermaid-svg-MVfbmGuwRfW6yUK1 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-MVfbmGuwRfW6yUK1 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-MVfbmGuwRfW6yUK1 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-MVfbmGuwRfW6yUK1 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-MVfbmGuwRfW6yUK1 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-MVfbmGuwRfW6yUK1 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-MVfbmGuwRfW6yUK1 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-MVfbmGuwRfW6yUK1 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-MVfbmGuwRfW6yUK1 .marker.cross{stroke:#333333;}#mermaid-svg-MVfbmGuwRfW6yUK1 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-MVfbmGuwRfW6yUK1 p{margin:0;}#mermaid-svg-MVfbmGuwRfW6yUK1 defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-MVfbmGuwRfW6yUK1 g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-MVfbmGuwRfW6yUK1 g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-MVfbmGuwRfW6yUK1 g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-MVfbmGuwRfW6yUK1 g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-MVfbmGuwRfW6yUK1 g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-MVfbmGuwRfW6yUK1 .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-MVfbmGuwRfW6yUK1 .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-MVfbmGuwRfW6yUK1 .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-MVfbmGuwRfW6yUK1 .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-MVfbmGuwRfW6yUK1 .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-MVfbmGuwRfW6yUK1 .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-MVfbmGuwRfW6yUK1 .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-MVfbmGuwRfW6yUK1 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-MVfbmGuwRfW6yUK1 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-MVfbmGuwRfW6yUK1 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-MVfbmGuwRfW6yUK1 .edgeLabel .label text{fill:#333;}#mermaid-svg-MVfbmGuwRfW6yUK1 .label div .edgeLabel{color:#333;}#mermaid-svg-MVfbmGuwRfW6yUK1 .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-MVfbmGuwRfW6yUK1 .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-MVfbmGuwRfW6yUK1 .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-MVfbmGuwRfW6yUK1 .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-MVfbmGuwRfW6yUK1 .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-MVfbmGuwRfW6yUK1 .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-MVfbmGuwRfW6yUK1 .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-MVfbmGuwRfW6yUK1 #statediagram-barbEnd{fill:#333333;}#mermaid-svg-MVfbmGuwRfW6yUK1 .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-MVfbmGuwRfW6yUK1 .cluster-label,#mermaid-svg-MVfbmGuwRfW6yUK1 .nodeLabel{color:#131300;}#mermaid-svg-MVfbmGuwRfW6yUK1 .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-MVfbmGuwRfW6yUK1 .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-MVfbmGuwRfW6yUK1 .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-MVfbmGuwRfW6yUK1 .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-MVfbmGuwRfW6yUK1 .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-MVfbmGuwRfW6yUK1 .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-MVfbmGuwRfW6yUK1 .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-MVfbmGuwRfW6yUK1 .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-MVfbmGuwRfW6yUK1 .note-edge{stroke-dasharray:5;}#mermaid-svg-MVfbmGuwRfW6yUK1 .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-MVfbmGuwRfW6yUK1 .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-MVfbmGuwRfW6yUK1 .statediagram-note text{fill:black;}#mermaid-svg-MVfbmGuwRfW6yUK1 .statediagram-note .nodeLabel{color:black;}#mermaid-svg-MVfbmGuwRfW6yUK1 .statediagram .edgeLabel{color:red;}#mermaid-svg-MVfbmGuwRfW6yUK1 #dependencyStart,#mermaid-svg-MVfbmGuwRfW6yUK1 #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-MVfbmGuwRfW6yUK1 .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-MVfbmGuwRfW6yUK1 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 接收新 I-PDU
调用目标 Transmit
目标确认或数据取走
Last-is-best 覆盖
FIFO 尚有空间
轮到队首发送
FIFO 满并刷新
新 I-PDU 按空队列处理
Empty
Pending
InTransit
Queued
Lost
- 直接数据提供:目标复制数据后可以较快释放当前实例;
- TriggerTransmit:必须保持缓存直到目标完成
TriggerTransmit; - FIFO:当前实例处理完成后才能处理下一项;
- TP 网关:保持缓冲直到目标 TP 完成读取并确认。
5.4 TP 接收会话状态
#mermaid-svg-GkJTsnmcJesYVbSy{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-GkJTsnmcJesYVbSy .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-GkJTsnmcJesYVbSy .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-GkJTsnmcJesYVbSy .error-icon{fill:#552222;}#mermaid-svg-GkJTsnmcJesYVbSy .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-GkJTsnmcJesYVbSy .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-GkJTsnmcJesYVbSy .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-GkJTsnmcJesYVbSy .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-GkJTsnmcJesYVbSy .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-GkJTsnmcJesYVbSy .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-GkJTsnmcJesYVbSy .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-GkJTsnmcJesYVbSy .marker{fill:#333333;stroke:#333333;}#mermaid-svg-GkJTsnmcJesYVbSy .marker.cross{stroke:#333333;}#mermaid-svg-GkJTsnmcJesYVbSy svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-GkJTsnmcJesYVbSy p{margin:0;}#mermaid-svg-GkJTsnmcJesYVbSy defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-GkJTsnmcJesYVbSy g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-GkJTsnmcJesYVbSy g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-GkJTsnmcJesYVbSy g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-GkJTsnmcJesYVbSy g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-GkJTsnmcJesYVbSy g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-GkJTsnmcJesYVbSy .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-GkJTsnmcJesYVbSy .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-GkJTsnmcJesYVbSy .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-GkJTsnmcJesYVbSy .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-GkJTsnmcJesYVbSy .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-GkJTsnmcJesYVbSy .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-GkJTsnmcJesYVbSy .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-GkJTsnmcJesYVbSy .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GkJTsnmcJesYVbSy .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-GkJTsnmcJesYVbSy .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GkJTsnmcJesYVbSy .edgeLabel .label text{fill:#333;}#mermaid-svg-GkJTsnmcJesYVbSy .label div .edgeLabel{color:#333;}#mermaid-svg-GkJTsnmcJesYVbSy .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-GkJTsnmcJesYVbSy .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-GkJTsnmcJesYVbSy .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-GkJTsnmcJesYVbSy .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-GkJTsnmcJesYVbSy .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-GkJTsnmcJesYVbSy .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-GkJTsnmcJesYVbSy .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-GkJTsnmcJesYVbSy #statediagram-barbEnd{fill:#333333;}#mermaid-svg-GkJTsnmcJesYVbSy .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-GkJTsnmcJesYVbSy .cluster-label,#mermaid-svg-GkJTsnmcJesYVbSy .nodeLabel{color:#131300;}#mermaid-svg-GkJTsnmcJesYVbSy .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-GkJTsnmcJesYVbSy .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-GkJTsnmcJesYVbSy .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-GkJTsnmcJesYVbSy .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-GkJTsnmcJesYVbSy .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-GkJTsnmcJesYVbSy .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-GkJTsnmcJesYVbSy .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-GkJTsnmcJesYVbSy .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-GkJTsnmcJesYVbSy .note-edge{stroke-dasharray:5;}#mermaid-svg-GkJTsnmcJesYVbSy .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-GkJTsnmcJesYVbSy .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-GkJTsnmcJesYVbSy .statediagram-note text{fill:black;}#mermaid-svg-GkJTsnmcJesYVbSy .statediagram-note .nodeLabel{color:black;}#mermaid-svg-GkJTsnmcJesYVbSy .statediagram .edgeLabel{color:red;}#mermaid-svg-GkJTsnmcJesYVbSy #dependencyStart,#mermaid-svg-GkJTsnmcJesYVbSy #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-GkJTsnmcJesYVbSy .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-GkJTsnmcJesYVbSy :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} StartOfReception
CopyRxData
后续 CopyRxData
RxIndication(E_OK)
RxIndication(E_NOT_OK)
缓冲不足或拒绝
Idle
Started
Receiving
Completed
Aborted
TP 会话排查时应记录 TpSduLength、bufferSizePtr、每次复制的长度和返回值,以及最终 RxIndication 结果。
5.5 初始化顺序
text
基础类型和错误跟踪模块
-> PduR_Init
-> CanIf / LinIf / FrIf / CanTp / Dcm / COM 等模块初始化
-> 路由组按配置启用
-> 开始正常通信
必须确保相邻模块开始调用 PduR API 时,PduR 已处于 PDUR_ONLINE。
6. 总结与工程检查清单
6.1 一句话模型
PduR 是一个基于静态路由表的 I-PDU 转发引擎:它不理解信号语义,只负责在配置定义的源模块和目标模块之间完成 PDU ID 映射、数据转发、必要的缓冲、确认、取消和错误处理。
6.2 关键接口速查
| 接口 | 方向 | 作用 |
|---|---|---|
PduR_Init |
系统 -> PduR | 初始化 PduR |
PduR_GetVersionInfo |
用户 -> PduR | 读取版本信息 |
PduR_GetConfigurationId |
用户 -> PduR | 读取配置 ID |
PduR_EnableRouting |
BswM/模式管理 -> PduR | 使能路由路径组 |
PduR_DisableRouting |
BswM/模式管理 -> PduR | 禁用路由路径组 |
PduR_<User:Up>Transmit |
上层 -> PduR | 请求发送 PDU |
PduR_<User:Up>CancelTransmit |
上层 -> PduR | 取消发送 |
PduR_<User:Up>CancelReceive |
上层 -> PduR | 取消 TP 接收 |
PduR_<User:Lo>RxIndication |
下层 -> PduR | 指示普通 PDU 接收 |
PduR_<User:Lo>TxConfirmation |
下层 -> PduR | 报告普通 PDU 发送结果 |
PduR_<User:Lo>TriggerTransmit |
下层 -> PduR | 请求获取待发送数据 |
PduR_<User:LoTp>StartOfReception |
下层 TP -> PduR | 建立 TP 接收会话 |
PduR_<User:LoTp>CopyRxData |
下层 TP -> PduR | 传递 TP 接收数据 |
PduR_<User:LoTp>RxIndication |
下层 TP -> PduR | 报告 TP 接收结束 |
PduR_<User:LoTp>CopyTxData |
下层 TP -> PduR | 获取 TP 发送数据 |
PduR_<User:LoTp>TxConfirmation |
下层 TP -> PduR | 报告 TP 发送结果 |
PduR 通常不需要独立周期性主函数来触发普通路由操作,路由动作由相邻通信模块的 API 调用触发。
6.3 配置检查清单
- 每个源 PDU 都能在 PduR 配置中找到正确且唯一的路由路径。
- 源模块 PDU ID 与目标模块 PDU ID 已分别核对。
- 通信接口路由没有错误连接到 TP 目标,TP 网关没有错误连接到通信接口目标。
- 多播的多个目标属于同一类模块。
- 扇入路径使用一致的
PduRQueueingStrategy,并根据并发风险决定是否配置 FIFO。 - TriggerTransmit 路径配置了足够的缓存和正确的数据提供方式。
- TP 网关配置了足够的
PduRBuffer长度和队列深度。 -
PduRTpThreshold与源、目标 TP 能力匹配。 - MetaData 类型在源、目标和路由路径之间保持一致。
- 所有路由路径都归属于正确的
PduRRoutingPathGroup。 -
enabledAtStart、运行时 Enable/Disable 和默认值策略符合网络模式需求。 - DET、DEM 和生产错误映射已经配置并验证。
- PduR 在相邻模块开始通信前已经完成初始化。
6.4 典型问题定位流程
下面的流程图按照"先确认问题入口,再核对配置,再进入接口和缓存路径"的顺序组织。每个分支都应保留现场信息,例如 PDU ID、返回值、路由组状态和 DET 错误码。
#mermaid-svg-s5ceZUxf9rgmBLuC{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-s5ceZUxf9rgmBLuC .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-s5ceZUxf9rgmBLuC .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-s5ceZUxf9rgmBLuC .error-icon{fill:#552222;}#mermaid-svg-s5ceZUxf9rgmBLuC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-s5ceZUxf9rgmBLuC .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-s5ceZUxf9rgmBLuC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-s5ceZUxf9rgmBLuC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-s5ceZUxf9rgmBLuC .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-s5ceZUxf9rgmBLuC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-s5ceZUxf9rgmBLuC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-s5ceZUxf9rgmBLuC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-s5ceZUxf9rgmBLuC .marker.cross{stroke:#333333;}#mermaid-svg-s5ceZUxf9rgmBLuC svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-s5ceZUxf9rgmBLuC p{margin:0;}#mermaid-svg-s5ceZUxf9rgmBLuC .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-s5ceZUxf9rgmBLuC .cluster-label text{fill:#333;}#mermaid-svg-s5ceZUxf9rgmBLuC .cluster-label span{color:#333;}#mermaid-svg-s5ceZUxf9rgmBLuC .cluster-label span p{background-color:transparent;}#mermaid-svg-s5ceZUxf9rgmBLuC .label text,#mermaid-svg-s5ceZUxf9rgmBLuC span{fill:#333;color:#333;}#mermaid-svg-s5ceZUxf9rgmBLuC .node rect,#mermaid-svg-s5ceZUxf9rgmBLuC .node circle,#mermaid-svg-s5ceZUxf9rgmBLuC .node ellipse,#mermaid-svg-s5ceZUxf9rgmBLuC .node polygon,#mermaid-svg-s5ceZUxf9rgmBLuC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-s5ceZUxf9rgmBLuC .rough-node .label text,#mermaid-svg-s5ceZUxf9rgmBLuC .node .label text,#mermaid-svg-s5ceZUxf9rgmBLuC .image-shape .label,#mermaid-svg-s5ceZUxf9rgmBLuC .icon-shape .label{text-anchor:middle;}#mermaid-svg-s5ceZUxf9rgmBLuC .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-s5ceZUxf9rgmBLuC .rough-node .label,#mermaid-svg-s5ceZUxf9rgmBLuC .node .label,#mermaid-svg-s5ceZUxf9rgmBLuC .image-shape .label,#mermaid-svg-s5ceZUxf9rgmBLuC .icon-shape .label{text-align:center;}#mermaid-svg-s5ceZUxf9rgmBLuC .node.clickable{cursor:pointer;}#mermaid-svg-s5ceZUxf9rgmBLuC .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-s5ceZUxf9rgmBLuC .arrowheadPath{fill:#333333;}#mermaid-svg-s5ceZUxf9rgmBLuC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-s5ceZUxf9rgmBLuC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-s5ceZUxf9rgmBLuC .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-s5ceZUxf9rgmBLuC .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-s5ceZUxf9rgmBLuC .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-s5ceZUxf9rgmBLuC .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-s5ceZUxf9rgmBLuC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-s5ceZUxf9rgmBLuC .cluster text{fill:#333;}#mermaid-svg-s5ceZUxf9rgmBLuC .cluster span{color:#333;}#mermaid-svg-s5ceZUxf9rgmBLuC 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-s5ceZUxf9rgmBLuC .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-s5ceZUxf9rgmBLuC rect.text{fill:none;stroke-width:0;}#mermaid-svg-s5ceZUxf9rgmBLuC .icon-shape,#mermaid-svg-s5ceZUxf9rgmBLuC .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-s5ceZUxf9rgmBLuC .icon-shape p,#mermaid-svg-s5ceZUxf9rgmBLuC .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-s5ceZUxf9rgmBLuC .icon-shape .label rect,#mermaid-svg-s5ceZUxf9rgmBLuC .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-s5ceZUxf9rgmBLuC .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-s5ceZUxf9rgmBLuC .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-s5ceZUxf9rgmBLuC :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-s5ceZUxf9rgmBLuC .start>*{fill:#e8f1ff!important;stroke:#4b78b8!important;stroke-width:1px!important;}#mermaid-svg-s5ceZUxf9rgmBLuC .start span{fill:#e8f1ff!important;stroke:#4b78b8!important;stroke-width:1px!important;}#mermaid-svg-s5ceZUxf9rgmBLuC .decision>*{fill:#fff7df!important;stroke:#c58a00!important;stroke-width:1px!important;}#mermaid-svg-s5ceZUxf9rgmBLuC .decision span{fill:#fff7df!important;stroke:#c58a00!important;stroke-width:1px!important;}#mermaid-svg-s5ceZUxf9rgmBLuC .action>*{fill:#f4f4f4!important;stroke:#777!important;stroke-width:1px!important;}#mermaid-svg-s5ceZUxf9rgmBLuC .action span{fill:#f4f4f4!important;stroke:#777!important;stroke-width:1px!important;}#mermaid-svg-s5ceZUxf9rgmBLuC .result>*{fill:#e8f7ed!important;stroke:#398557!important;stroke-width:1px!important;}#mermaid-svg-s5ceZUxf9rgmBLuC .result span{fill:#e8f7ed!important;stroke:#398557!important;stroke-width:1px!important;} 发送无效 / 不发送
接收不到
TP 传输失败
网关 / FIFO 异常
否
是
否
是
否
是
E_NOT_OK
E_OK
PDUR_DIRECT
PDUR_TRIGGERTRANSMIT
否
是
是
否
否
是
否
是
否
是
BUFREQ_E_OVFL
BUFREQ_E_NOT_OK
BUFREQ_OK
是
否
否
是
否
是
是
否
否
是
发现 PDU 通信异常
异常类型?
确认上层调用 PduR_Transmit
确认下层调用 PduR_RxIndication
确认 StartOfReception 是否被调用
确认源端 RxIndication 和目标端路由
源 PDU ID 正确?
核对 COM / PduR / CanIf 或 CanTp 的 PDU ID 映射
路由路径组已启用?
检查 enabledAtStart 或调用 PduR_EnableRouting
已找到目标 PDU?
目标 Transmit 返回值?
检查目标模块状态、CanIf/CanTp 返回原因和 DET
数据提供方式?
等待并检查 TxConfirmation
是否调用 TriggerTransmit?
检查目标调度、触发发送配置和目标 PDU 属性
是否多播?
核对至少一个目标成功、最后确认和失败目标隔离
发送路径基本正常
接收 PDU ID 正确?
路由路径组已启用?
是否调用上层 RxIndication?
检查路由方向、源模块引用、目标模块引用和配置生成结果
普通接收路径基本正常
StartOfReception 返回?
检查 PduRBuffer 长度、队列深度和可用内存
检查上层 Dcm/COM 接收能力和路由组状态
逐次检查 CopyRxData 或 CopyTxData
是否出现 BUFREQ_E_BUSY / E_NOT_OK?
检查 TpDataState、RetryInfoType、剩余长度和缓冲边界
最终 RxIndication / TxConfirmation 正常?
检查源 TP、目标 TP和 PduR 会话状态
TP 路径基本正常
是否使用 FIFO 或缓存?
检查直接网关目标 Transmit 返回值和目标 PDU 长度
检查 PduRBuffer、PduRQueueDepth 和 DataProvision
是否出现队列满或实例丢失?
检查 PDUR_E_PDU_INSTANCES_LOST、刷新策略和生产错误上报
TriggerTransmit 是否成功?
网关 / FIFO 路径基本正常
重新检查配置生成输出、符号名和三侧 PDU ID
重新执行发送、接收或网关测试
6.4.1 流程图关键检查点
- 入口检查 :发送问题先确认
PduR_<User:Up>Transmit,接收问题先确认PduR_<User:Lo>RxIndication。 - 映射检查:必须同时核对 COM、PduR、CanIf/CanTp 三侧的 PDU ID,不能只看一个模块。
- 路由组检查 :确认
enabledAtStart、PduR_EnableRouting和PduR_DisableRouting的实际状态。 - 数据提供检查 :
PDUR_DIRECT关注目标Transmit,PDUR_TRIGGERTRANSMIT还要确认后续TriggerTransmit回调。 - TP 检查 :按
StartOfReception->CopyRxData/CopyTxData->RxIndication/TxConfirmation顺序记录结果。 - 缓存检查 :重点检查
PduRBuffer最大长度、PduRQueueDepth、队列策略、MetaData 和PDUR_E_PDU_INSTANCES_LOST。 - 多播检查:确认至少一个目标成功、最终确认时机以及单个目标失败是否影响其他目标。
6.5 规范章节对照
| 本文内容 | 原规范章节 |
|---|---|
| 模块功能和能力 | 第 1 章、第 7 章 |
| 缓冲、FIFO、网关 | 第 7.1.1、第 7.1.4 |
| 接收和发送流程 | 第 7.1.2、第 7.1.3 |
| 取消和状态管理 | 第 7.2 至第 7.7 章 |
| API 定义 | 第 8 章 |
| 典型时序 | 第 9 章 |
| ECUC 配置 | 第 10 章 |
| 设计注意事项 | 第 11 章 |
规范版本 :AUTOSAR CP R25-11
模块:PDU Router(PduR)