AUTOSAR_CP文档图解==>AUTOSAR_CP_SWS_PDURouter

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、配置约束和供应商扩展应以项目实际版本和配置生成器为准。


目录

  1. 概述
  2. [PDU Router 模块架构](#PDU Router 模块架构)
  3. [PDU Router 配置模型](#PDU Router 配置模型)
  4. [PDU Router 路由流程](#PDU Router 路由流程)
  5. [PDU Router 状态机](#PDU Router 状态机)
  6. 总结与工程检查清单

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 主要由两部分组成:

  1. 路由路径配置:描述源模块、目标模块、PDU ID、缓存策略和路由组关系。
  2. 路由引擎:根据 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 路由路径核心属性

  1. 源模块和源 PDU ID。
  2. 目标模块和目标 PDU ID。
  3. 路由方向:发送、接收或网关。
  4. 模块类型:通信接口或 TP。
  5. 路由路径组。
  6. 数据提供方式:直接数据提供或 TriggerTransmit。
  7. 队列策略:无队列、Last-is-best、FIFO、公共队列或专用队列。
  8. 缓冲引用及最大 PDU 长度。
  9. 元数据类型和转发规则。

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 模块之间建立。主要方式:

  1. Direct gatewaying:完整 I-PDU 收齐后再向目标 TP 发送。
  2. 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)

相关推荐
寇旨2 小时前
AUTOSAR_CP文档图解==>AUTOSAR_CP_SWS_CANStateManager
autosar·isolar工具
寇旨13 小时前
AUTOSAR_CP文档图解==>AUTOSAR_CP_SWS_COMBasedTransformer
网络·autosar
瞬间记忆21 天前
AUTOSAR基础概念学习
汽车·autosar
赞哥哥s1 个月前
车载以太网概念及协议架构介绍(一)
ethernet·autosar·aurix
车软派开发学长1 个月前
车企研发的“整合与自研”之争,本质是一场生意
车载系统·汽车·can·autosar
赞哥哥s2 个月前
Autosar Dem学习笔记-DTC状态位详解与用法
autosar·dem·dtc
叶修_A2 个月前
FS-17 功能安全ISO26262之敏捷开发融合深度解析
敏捷开发·autosar·汽车电子·功能安全·iso26262
叶修_A3 个月前
FS-11 功能安全ISO26262之生产运维与报废阶段安全保障深度解析
autosar·汽车电子·功能安全·iso26262
齊家治國平天下3 个月前
Google AAOS 中 SOME/IP 框架深度解析:从架构到实践
android·autosar·aaos·车载以太网·some/ip·sdv·vsomeip