前言在学习AUTOSAR通信栈的时候很多工程师都有一个共同感受COM懂一点 CanIf懂一点 CanDrv也懂一点 唯独PduR看了半天不知道在干什么打开配置工具PduRRoutingPath PduRSrcPdu PduRDestPdu PduRBuffer PduRQueueDepth一大堆配置项。但是调试的时候收不到信号 看PduR 网关不转发 看PduR CAN转ETH失败 看PduR 诊断不通 还是看PduR于是很多人发现AUTOSAR里最不起眼的模块却经常是问题根源。今天我们就彻底讲透PduR为什么被称为AUTOSAR通信系统里的“中央交换机”。PduR出现之前通信模块是怎么连接的假设没有PduR。发送流程COM ├──CanIf ├──LinIf ├──FrIf ├──SoAd ├──DoIP └──CanTp那么每增加一个通信模块所有模块都要彼此连接。例如COM - CanIf COM - SoAd CanTp - CanIf CanTp - SoAd DoIP - SoAd DoIP - CanIf模块数量一多连接关系指数增长。这时候AUTOSAR提出一个思路所有数据都先进入一个统一的路由中心。于是PduR诞生了。PDU到底是什么很多新人一上来就会问Signal PDU Frame 到底什么区别先看一个实际例子。ECU发送VehicleSpeed 120km/h EngineSpeed 3000rpm Gear DCOM层会把这些信号打包Byte0~1 VehicleSpeed Byte2~3 EngineSpeed Byte4 Gear形成TxVehicleInfoPdu这个整体[78 00 B8 0B 04]就是I-PDU也就是PduR真正处理的对象。所以Signal ≠ PDU PDU ≠ Frame关系如下Signal ↓ COM打包 ↓ I-PDU ↓ CanIf封装 ↓ CAN FramePduR到底在路由什么答案很简单PduR只路由PDU。它不认识VehicleSpeed DoorStatus RPM它只认识PDU ID例如Com_TxPdu_001进入PduR后查Routing TableCom_TxPdu_001 ↓ CanIf_TxPdu_005然后转发。所以PduR本质上就是PDU Router而不是Signal RouterPduR内部到底长什么样很多人以为PduR很复杂。实际上内部结构非常简单。核心只有两部分Routing Table BufferRouting Table类似Source PDU ↓ Destination PDU例如CAN1_RX_100 ↓ CAN2_TX_100或者CAN1_RX_100 ↓ SOAD_TX_001这就是所谓Routing PathCAN→CAN转发到底怎么实现这是网关ECU最常见场景。例如动力CAN 车身CAN之间需要交换数据。收到报文CAN1 ID0x100流程CAN1 ↓ CanIf ↓ PduR ↓ CanIf ↓ CAN2注意PduR根本不解析内容。它只是memcpy()然后换个出口发出去。所以很多Gateway ECU每天转发几十万条报文。CPU占用却很低。原因就在这里。PduR真的只是memcpy吗很多时候是。但不完全是。因为PduR还承担路由决策例如CAN1 ↓ PduR ├─CAN2 ├─CAN3 └─ETH一个输入多个输出。这就是Fan-out Routing例如ADAS域控制器摄像头数据 ↓ 发送给 仪表 网关 智驾域PduR会复制多份PDU。分别发送。CAN→Ethernet为什么必须经过PduR这是很多新项目最常见的架构。例如CAN ↓ 域控制器 ↓ Ethernet流程CanIf ↓ PduR ↓ SoAd ↓ TcpIp ↓ EthIf这里PduR完成CAN侧入口 ↓ Ethernet侧出口映射关系。注意很多人误解PduR做协议转换实际上不做。PduR根本不知道CAN TCP UDP SOME/IP是什么。它只知道PDU A 转给 PDU BPduR有没有自己的Buffer答案有而且非常重要。因为发送端和接收端速度可能完全不同。例如CAN 500kbps Ethernet 100Mbps又或者CAN数据来了 SoAd暂时忙怎么办这时候PduR Buffer登场。Immediate Routing与Buffered RoutingAUTOSAR支持两种模式。Immediate Routing收到立刻转发。CAN RX ↓ PduR ↓ CAN TX延迟最小。适用于底盘控制 动力系统Buffered Routing先缓存。CAN RX ↓ PduR Buffer ↓ Task ↓ 发送适用于CAN→ETH DoIP SOME/IP 诊断为什么PduR配置错误最难发现因为它不会报错。例如COM发出Com_SendSignal()成功。CanIf也没报错。但PduR路径没配。结果数据直接消失你看到的现象COM正常 CanIf正常 总线没数据最后查了两天PduR RoutingPath漏配置项目中最常见的5种PduR问题问题1RX路径漏配表现CAN收到 SWC读不到问题2TX路径漏配表现COM发送 总线无报文问题3PDU长度不匹配表现偶发数据错乱问题4Buffer配置过小表现高负载丢包问题5CAN→ETH路由错误表现SOME/IP收不到数据PduR、COM、CanIf到底谁在搬数据很多人一直分不清。其实一句话就够模块负责什么COM打包和解包SignalPduR路由PDUCanIf管理CAN发送接收CanDrv操作CAN控制器所以COM负责内容 PduR负责路线 CanIf负责运输 CanDrv负责开车本期总结PduR看起来只是一个“转发模块”。但实际上它是AUTOSAR通信栈中最核心的枢纽之一。无论是CAN→CAN GatewayCAN→Ethernet GatewayDoIPSOME/IPUDS诊断几乎所有跨模块通信都必须经过它。 一句话总结PduR不产生数据也不解析数据但它决定数据最终能不能到达目的地。下期预告《AUTOSAR COM中Signal和GroupSignal本质区别是什么应该如何使用》我们将深入拆解Signal和GroupSignal区别UpdateBit到底有什么用COM发送模式周期、事件、混合Signal如何一步步变成CAN报文看看那些天天使用的Com_SendSignal()背后到底发生了什么。