这是 PDUR 接口路由中最容易混淆的两个核心配置,本质是 "PDUR 主动推送" 和 "目标模块主动拉取"两种完全相反的数据传输机制,直接决定了通信的实时性、CPU 负载和数据一致性。
Direct 模式:就像外卖骑手送餐,餐一做好就立刻给你送上门,你必须在家等着收
Trigger 模式:就像快递柜,快递员把包裹放进去,你什么时候有空什么时候去取,永远取到最新的那个包裹
模式 | 控制权归属 | 数据传输逻辑 | 核心优势 | 核心劣势 |
Direct(直接数据提供) | PDUR(源端) | 有数据就立刻发 | 延迟最低,实时性最好 | 可能阻塞源端,浪费 CPU 资源 |
Trigger Transmit(触发传输) | 目标模块 | 等目标要的时候才给最新数据 | 目标完全控制时机,永远拿最新数据,节省资源 | 延迟由目标调用周期决定 |
Direct data provision(直接数据提供)
定义
PDUR 收到源模块的 PDU 后,立刻将数据复制到目标模块,并立刻调用目标模块的 Transmit 函数完成发送。
典型实例
动力 CAN 总线上收到制动踏板位置信号。CanIf 调用PduR_Transmit(0x123, pduPtr),PDUR 立刻将数据复制并转发给:
底盘 CAN 的 CanIf 模块(供 ESP 使用)
COM 模块(供应用层紧急制动逻辑使用)
整个过程在同一个函数调用栈中完成,延迟仅几微秒,确保安全信号能被立即处理。
适用场景
所有安全相关的信号(制动、转向、气囊、电池故障)
事件触发型信号(车门打开、碰撞信号)
对延迟要求极高的控制信号
Trigger transmit data provision(触发传输数据提供)
定义
PDUR 收到源模块的 PDU 后,不立即转发,而是将数据存入自己的单缓冲区(覆盖旧数据)。只有当目标模块主动调用PduR_TriggerTransmit()时,PDUR 才将缓冲区中最新的数据复制给目标模块。
典型实例
仪表显示发动机转速信号。发动机 ECU 每 10ms 发送一次转速信号到 CAN 总线,PDUR 收到后只更新自己的缓冲区。
仪表模块每 100ms 刷新一次屏幕,它不需要 PDUR 每 10ms 就推一次数据,而是自己每 100ms 调用一次PduR_TriggerTransmit(0x456, &pduPtr),获取最新的转速值。
这样即使 PDUR 在 100ms 内收到了 10 次转速数据,仪表也只需要处理 1 次,CPU 负载降低了 90%。
适用场景
- 周期性的、非安全相关的显示类信号(转速、车速、油量、水温)
- 目标模块有严格的时序要求(如 LIN 主节点轮询)
- 同一个 PDU 需要被多个不同周期的模块使用
- 低优先级的状态信号(空调状态、车窗位置)
开发中最常见的坑
安全信号误用 Trigger 模式
现象:紧急制动信号延迟 100ms 才到达 ESP,导致制动距离增加
解决:所有 ASIL 等级的信号必须强制使用 Direct 模式
Trigger 模式配置多缓冲区
现象:目标模块总是拿到旧数据,而不是最新数据
解决:Trigger 模式必须且只能配置单缓冲区,多缓冲区会存储历史数据,违背了 Trigger 模式 "永远取最新" 的设计初衷
Direct 模式下目标模块处理过慢
现象:PDUR 的 Transmit 函数被阻塞,导致源模块的发送队列溢出,丢包
解决:将非实时的目标模块改为 Trigger 模式,或者提高目标模块的处理优先级