当前位置: 首页 > news >正文

AUTOSAR进阶图解==>AUTOSAR_SWS_PDURouter - 实践

AUTOSAR PDU Router详解文档

AUTOSAR通信架构中的核心路由模块

目录


1. 概述

PDU Router模块是AUTOSAR通信架构中的核心组件,负责在AUTOSAR软件组件之间路由I-PDU(Interaction Layer Protocol Data Units)。该模块提供了灵活的I-PDU转发机制,支持多种路由模式,包括单播、多播和网关功能。

1.1 PDU Router的作用

根据源文档描述,PDU Router模块主要提供以下功能:

1.2 核心特性

  • 静态配置:路由路径基于静态配置表,不支持动态路由
  • 通用接口:采用通用接口设计,支持任意上层和下层模块组合
  • 后构建支持:支持后构建可加载和可选择配置
  • 错误处理:提供完整的错误检测和报告机制

2. PDU Router模块架构

PDU Router模块在AUTOSAR通信架构中位于中间层,连接上层应用模块和下层通信接口模块。

在这里插入图片描述

图2-1:PDU Router模块在AUTOSAR通信架构中的位置和关系

2.1 架构层次

应用层

  • COM模块:通信管理模块,负责信号和I-PDU的转换
  • DCM模块:诊断通信管理模块,处理诊断请求和响应
  • IPduM模块:I-PDU复用器,支持I-PDU的动态复用
  • DLT模块:数据链路测试模块,提供通信测试功能

PDU Router模块

  • PDU Router引擎:核心路由引擎,执行I-PDU的路由决策和转发
  • 路由路径表:静态配置的路由规则表,定义I-PDU的路由路径
  • 缓冲区管理:管理I-PDU的缓冲存储,支持FIFO和Last-is-best策略

通信接口层

  • CAN接口(CanIf):CAN总线接口模块
  • FlexRay接口(FrIf):FlexRay总线接口模块
  • LIN接口(LinIf):LIN总线接口模块
  • 以太网接口(EthIf):以太网接口模块

传输协议层

  • CAN传输协议(CanTp):CAN总线传输协议模块
  • FlexRay传输协议(FrTp):FlexRay传输协议模块
  • LIN传输协议(LinTp):LIN传输协议模块
  • J1939传输协议(J1939Tp):J1939协议模块

2.2 接口关系

PDU Router模块通过以下接口与上下层模块交互:

2.3 代码示例

/* PDU Router模块初始化示例 */
Std_ReturnType PduR_Init(const PduR_PBConfigType* ConfigPtr)
{
Std_ReturnType result = E_OK;
/* 参数检查 */
if (ConfigPtr == NULL) {
DET_ReportError(PDUR_MODULE_ID, 0, PDUR_INIT_SID, PDUR_E_PARAM_POINTER);
return E_NOT_OK;
}
/* 初始化路由路径表 */
result = PduR_Internal_InitRoutingTable(ConfigPtr);
if (result != E_OK) {
return E_NOT_OK;
}
/* 初始化缓冲区管理器 */
result = PduR_Internal_InitBufferManager(ConfigPtr);
if (result != E_OK) {
return E_NOT_OK;
}
/* 设置模块状态为在线 */
PduR_Internal_SetModuleState(PDUR_ONLINE);
return E_OK;
}
/* 上层模块传输请求示例 */
Std_ReturnType PduR_ComTransmit(PduIdType TxPduId, const PduInfoType* PduInfoPtr)
{
Std_ReturnType result = E_OK;
PduR_RoutingPathType* routingPath;
/* 参数检查 */
if (PduInfoPtr == NULL) {
DET_ReportError(PDUR_MODULE_ID, 0, PDUR_COM_TRANSMIT_SID, PDUR_E_PARAM_POINTER);
return E_NOT_OK;
}
/* 查找路由路径 */
routingPath = PduR_Internal_GetRoutingPath(TxPduId);
if (routingPath == NULL) {
DET_ReportError(PDUR_MODULE_ID, 0, PDUR_COM_TRANSMIT_SID, PDUR_E_PDU_ID_INVALID);
return E_NOT_OK;
}
/* 执行路由转发 */
result = PduR_Internal_ForwardToDestinations(routingPath, PduInfoPtr);
return result;
}

3. PDU Router配置模型

PDU Router模块的配置采用层次化的数据结构,支持灵活的模块配置和路由规则定义。

图3-1:PDU Router配置模型的数据结构关系

3.1 主要配置类

PduR_PBConfigType

PduRGeneralType

3.2 路由配置类

PduRRoutingPathType

  • 功能:定义单个I-PDU的路由规则
  • 关键属性
    • PduRRoutingPathId:路由路径唯一标识符
    • PduRSrcPduRef:源PDU引用
    • PduRDestPduRefs[]:目标PDU引用数组
    • PduRDestTxBufferRef:目标传输缓冲区引用
    • PduRTpThreshold:传输协议阈值
    • PduRMaxPduLength:最大PDU长度
    • PduRBufferAllocation:缓冲区分配策略

PduRRoutingPathGroupType

  • 功能:路由路径组配置,用于批量管理路由路径
  • 关键属性
    • PduRRoutingPathGroupId:路由路径组标识符
    • PduRRoutingPathGroupRefs[]:路由路径引用数组
    • PduRGroupEnableAtInit:初始化时启用标志

3.3 缓冲区配置类

PduRTxBufferType

  • 功能:传输缓冲区配置,用于存储待传输的I-PDU
  • 关键属性
    • PduRTxBufferId:缓冲区唯一标识符
    • PduRTxBufferSize:缓冲区大小
    • PduRTxBufferRef:缓冲区内存引用
    • PduRTxBufferAllocation:缓冲区分配方式

3.4 代码示例

/* PDU Router配置结构定义 */
typedef struct {
PduRBswModuleType* PduRBswModules;
PduRGeneralType PduRGeneral;
PduRRoutingPathGroupType* PduRRoutingPathGroups;
PduRRoutingPathType* PduRRoutingPaths;
PduRSrcPduType* PduRSrcPdus;
PduRDestPduType* PduRDestPdus;
PduRTxBufferType* PduRTxBuffers;
PduRDefaultValueType* PduRDefaultValues;
} PduR_PBConfigType;
/* 路由路径配置结构 */
typedef struct {
uint16 PduRRoutingPathId;
PduRSrcPduType* PduRSrcPduRef;
PduRDestPduType** PduRDestPduRefs;
PduRTxBufferType* PduRDestTxBufferRef;
uint16 PduRTpThreshold;
uint16 PduRMaxPduLength;
PduR_BufferAllocationType PduRBufferAllocation;
} PduRRoutingPathType;
/* 配置初始化示例 */
void PduR_InitializeConfiguration(PduR_PBConfigType* config)
{
/* 初始化通用配置 */
config->PduRGeneral.PduRDevErrorDetect = TRUE;
config->PduRGeneral.PduRVersionInfoApi = TRUE;
config->PduRGeneral.PduRMaxRoutingPathCnt = 100;
config->PduRGeneral.PduRMaxTxBufferCnt = 50;
config->PduRGeneral.PduRMaxRoutingPathGroupCnt = 10;
/* 初始化路由路径 */
for (int i = 0; i < config->PduRGeneral.PduRMaxRoutingPathCnt; i++) {config->PduRRoutingPaths[i].PduRRoutingPathId = i;config->PduRRoutingPaths[i].PduRTpThreshold = 0;config->PduRRoutingPaths[i].PduRMaxPduLength = 4095;config->PduRRoutingPaths[i].PduRBufferAllocation = PDUR_BUFFER_ALLOCATION_DEDICATED;}/* 初始化传输缓冲区 */for (int i = 0; i < config->PduRGeneral.PduRMaxTxBufferCnt; i++) {config->PduRTxBuffers[i].PduRTxBufferId = i;config->PduRTxBuffers[i].PduRTxBufferSize = 4095;config->PduRTxBuffers[i].PduRTxBufferAllocation = PDUR_BUFFER_ALLOCATION_STATIC;}}

4. PDU Router路由流程

PDU Router模块支持多种路由场景,包括上层模块发送、通信接口网关和传输协议网关等。

在这里插入图片描述

图4-1:PDU Router模块的路由流程和交互序列

4.1 上层模块发送I-PDU流程

场景描述:COM模块向多个目标模块发送I-PDU,实现1:n路由

参与者

流程步骤

  1. 传输请求:COM模块调用PduR_ComTransmit发起传输请求
  2. 路由查询:PDU Router引擎查询路由路径表,获取目标模块列表
  3. 数据提供方式判断
    • 直接数据提供:立即调用目标模块的传输接口
    • 触发传输数据提供:先存储数据,等待目标模块请求

4.2 通信接口网关流程

场景描述:CAN接口接收I-PDU并转发到FlexRay接口,实现网关功能

参与者

  • CAN接口:源通信接口,接收I-PDU
  • PDU Router引擎:执行网关转发逻辑
  • FlexRay接口:目标通信接口,发送I-PDU

流程步骤

  1. 接收指示:CAN接口调用PduR_CanIfRxIndication通知PDU Router
  2. 目标查询:PDU Router引擎查询路由路径,确定目标模块
  3. 转发处理
    • 直接转发:立即调用目标接口的传输函数
    • FIFO缓冲:存储到FIFO队列,等待目标模块请求

4.3 传输协议网关流程

场景描述:CAN传输协议接收多帧数据并转发到FlexRay传输协议

参与者

  • CAN传输协议:源传输协议模块
  • PDU Router引擎:管理TP网关逻辑
  • FlexRay传输协议:目标传输协议模块

流程步骤

  1. 开始接收:CAN传输协议调用PduR_CanTpStartOfReception开始接收
  2. 路由查询:PDU Router引擎查询路由路径,确定目标TP模块
  3. 网关模式选择
    • 直接网关:等待完整接收后开始传输
    • 网关on-the-fly:达到阈值后开始传输

4.4 代码示例

/* 上层模块传输处理示例 */
Std_ReturnType PduR_Internal_ForwardToDestinations(PduR_RoutingPathType* routingPath,
const PduInfoType* pduInfo)
{
Std_ReturnType result = E_OK;
uint8 destCount = 0;
PduRDestPduType* destPdu;
/* 遍历所有目标PDU */
while ((destPdu = routingPath->PduRDestPduRefs[destCount]) != NULL) {
/* 根据数据提供方式处理 */
if (destPdu->PduRDestPduDataProvision == PDUR_DIRECT) {
/* 直接数据提供 */
result = PduR_Internal_TransmitDirect(destPdu, pduInfo);
} else {
/* 触发传输数据提供 */
result = PduR_Internal_StoreForTriggerTransmit(destPdu, pduInfo);
}
if (result != E_OK) {
/* 处理传输失败 */
DET_ReportError(PDUR_MODULE_ID, 0, PDUR_FORWARD_SID, PDUR_E_TRANSMIT_FAILED);
}
destCount++;
}
return result;
}
/* 通信接口接收处理示例 */
void PduR_CanIfRxIndication(PduIdType RxPduId, const PduInfoType* PduInfoPtr)
{
PduR_RoutingPathType* routingPath;
Std_ReturnType result = E_OK;
/* 查找路由路径 */
routingPath = PduR_Internal_GetRoutingPath(RxPduId);
if (routingPath == NULL) {
/* 无路由路径,丢弃I-PDU */
return;
}
/* 执行网关转发 */
result = PduR_Internal_GatewayForward(routingPath, PduInfoPtr);
if (result != E_OK) {
/* 处理网关失败 */
DET_ReportError(PDUR_MODULE_ID, 0, PDUR_GATEWAY_SID, PDUR_E_GATEWAY_FAILED);
}
}
/* 传输协议网关处理示例 */
BufReq_ReturnType PduR_CanTpStartOfReception(PduIdType RxPduId,
PduLengthType TpSduLength,
PduLengthType* RxBufferSizePtr)
{
PduR_RoutingPathType* routingPath;
BufReq_ReturnType result = BUFREQ_OK;
/* 查找路由路径 */
routingPath = PduR_Internal_GetRoutingPath(RxPduId);
if (routingPath == NULL) {
return BUFREQ_E_NOT_OK;
}
/* 分配缓冲区 */
result = PduR_Internal_AllocateBuffer(routingPath, TpSduLength, RxBufferSizePtr);
if (result == BUFREQ_OK) {
/* 开始目标TP传输 */
PduR_Internal_StartDestinationTpTransmit(routingPath, TpSduLength);
}
return result;
}

5. PDU Router状态机

PDU Router模块采用状态机设计,管理模块的生命周期和运行状态。

在这里插入图片描述

图5-1:PDU Router模块的状态转换和生命周期管理

5.1 主要状态

未初始化状态(Uninitialized)

在线运行状态(Online)

5.2 子状态

空闲状态(Idle)

  • 含义:等待处理请求的状态
  • 特征
    • 等待I-PDU传输请求
    • 等待接收指示
    • 等待管理API调用

路由处理状态(Routing)

  • 含义:处理I-PDU路由转发
  • 特征
    • 支持1:1, 1:n, n:1路由
    • 直接数据提供和触发传输
    • 多播支持
    • 传输确认处理

网关处理状态(Gateway)

  • 含义:处理通信接口间网关
  • 特征
    • 通信接口间网关
    • FIFO缓冲支持
    • 直接转发和缓冲转发
    • 错误处理

TP网关处理状态(TPGateway)

  • 含义:处理传输协议间网关
  • 特征
    • 传输协议间网关
    • 支持直接网关和on-the-fly
    • 缓冲区动态分配
    • 阈值控制传输

5.3 状态转换

初始化转换

  • UninitializedOnline:初始化完成
  • OnlineOffline:系统关闭或错误
  • OfflineUninitialized:重新初始化

运行状态转换

  • IdleRouting:收到传输请求
  • IdleGateway:收到接收指示
  • IdleTPGateway:收到TP接收指示
  • IdleManagement:收到管理API调用

5.4 代码示例

/* PDU Router状态机实现 */
typedef enum {
PDUR_STATE_UNINITIALIZED,
PDUR_STATE_ONLINE,
PDUR_STATE_OFFLINE
} PduR_ModuleStateType;
typedef enum {
PDUR_SUBSTATE_IDLE,
PDUR_SUBSTATE_ROUTING,
PDUR_SUBSTATE_GATEWAY,
PDUR_SUBSTATE_TP_GATEWAY,
PDUR_SUBSTATE_MANAGEMENT
} PduR_SubStateType;
/* 状态机处理函数 */
void PduR_MainFunction(void)
{
PduR_ModuleStateType currentState;
PduR_SubStateType currentSubState;
/* 获取当前状态 */
currentState = PduR_Internal_GetModuleState();
currentSubState = PduR_Internal_GetSubState();
switch (currentState) {
case PDUR_STATE_UNINITIALIZED:
/* 未初始化状态,等待初始化 */
break;
case PDUR_STATE_ONLINE:
/* 在线状态,处理子状态 */
PduR_Internal_ProcessSubState(currentSubState);
break;
case PDUR_STATE_OFFLINE:
/* 离线状态,等待重新初始化 */
break;
default:
/* 错误状态处理 */
DET_ReportError(PDUR_MODULE_ID, 0, PDUR_MAINFUNCTION_SID, PDUR_E_INVALID_STATE);
break;
}
}
/* 子状态处理函数 */
void PduR_Internal_ProcessSubState(PduR_SubStateType subState)
{
switch (subState) {
case PDUR_SUBSTATE_IDLE:
/* 空闲状态,检查是否有待处理请求 */
if (PduR_Internal_HasTransmitRequest()) {
PduR_Internal_SetSubState(PDUR_SUBSTATE_ROUTING);
} else if (PduR_Internal_HasRxIndication()) {
PduR_Internal_SetSubState(PDUR_SUBSTATE_GATEWAY);
} else if (PduR_Internal_HasTpRxIndication()) {
PduR_Internal_SetSubState(PDUR_SUBSTATE_TP_GATEWAY);
}
break;
case PDUR_SUBSTATE_ROUTING:
/* 路由处理状态 */
PduR_Internal_ProcessRouting();
PduR_Internal_SetSubState(PDUR_SUBSTATE_IDLE);
break;
case PDUR_SUBSTATE_GATEWAY:
/* 网关处理状态 */
PduR_Internal_ProcessGateway();
PduR_Internal_SetSubState(PDUR_SUBSTATE_IDLE);
break;
case PDUR_SUBSTATE_TP_GATEWAY:
/* TP网关处理状态 */
PduR_Internal_ProcessTpGateway();
PduR_Internal_SetSubState(PDUR_SUBSTATE_IDLE);
break;
case PDUR_SUBSTATE_MANAGEMENT:
/* 管理操作状态 */
PduR_Internal_ProcessManagement();
PduR_Internal_SetSubState(PDUR_SUBSTATE_IDLE);
break;
default:
/* 错误子状态处理 */
DET_ReportError(PDUR_MODULE_ID, 0, PDUR_PROCESS_SUBSTATE_SID, PDUR_E_INVALID_SUBSTATE);
PduR_Internal_SetSubState(PDUR_SUBSTATE_IDLE);
break;
}
}
/* 状态转换函数 */
void PduR_Internal_SetModuleState(PduR_ModuleStateType newState)
{
PduR_ModuleStateType oldState = PduR_Internal_GetModuleState();
/* 状态转换验证 */
if (PduR_Internal_IsValidStateTransition(oldState, newState)) {
PduR_Internal_ModuleState = newState;
/* 状态转换后的处理 */
switch (newState) {
case PDUR_STATE_ONLINE:
/* 进入在线状态,初始化子状态 */
PduR_Internal_SetSubState(PDUR_SUBSTATE_IDLE);
break;
case PDUR_STATE_OFFLINE:
/* 进入离线状态,清理资源 */
PduR_Internal_CleanupResources();
break;
default:
break;
}
} else {
/* 无效状态转换 */
DET_ReportError(PDUR_MODULE_ID, 0, PDUR_SET_STATE_SID, PDUR_E_INVALID_STATE_TRANSITION);
}
}

6. 总结

PDU Router模块作为AUTOSAR通信架构的核心组件,提供了灵活、高效的I-PDU路由服务。通过静态配置的路由表和状态机设计,该模块能够满足各种复杂的通信需求。

6.1 主要优势

6.2 应用场景

  • 车载网络网关:实现不同总线系统间的数据转发
  • 诊断通信:支持诊断数据的路由和转发
  • 信号路由:实现应用层信号到通信接口的路由
  • 多播通信:支持一对多的数据广播

6.3 技术特点

PDU Router模块的设计充分体现了AUTOSAR架构的模块化和标准化特点,为汽车电子系统的通信提供了可靠的基础设施。

http://www.hskmm.com/?act=detail&tid=9866

相关文章:

  • getDefaultMidwayLoggerConfig报错;解决方法。
  • js获取浏览器语言,以及调用谷歌翻译api翻译成相应的内容
  • 总结RocketMQ中的常见问题
  • The 2025 ICPC Asia EC Regionals Online Contest (II)
  • C++线上练习
  • Python实现Elman RNN与混合RNN神经网络对航空客运量、啤酒产量、电力产量时间序列数据预测可视化对比
  • 4G/Wi-Fi/以太网三网合一,智能融合通信实战案例集
  • 关于介绍自己的第一篇随笔
  • 深入解析:N32G43x Flash 驱动移植与封装实践
  • Backblaze上如何传大文件
  • 解题报告-老逗找基友 (friends)
  • Caused by: java.lang.ClassNotFoundException: org.apache.rocketmq.remoting.common.RemotingUtil
  • VAE In JAX【个人记录向】
  • BLE蓝牙配网双模式实操:STA+SoftAP技术原理与避坑指南
  • 第58天:RCE代码amp;命令执行amp;过滤绕过amp;异或无字符amp;无回显方案amp;黑白盒挖掘
  • 057-Web攻防-SSRFDemo源码Gopher项目等
  • 060-WEB攻防-PHP反序列化POP链构造魔术方法流程漏洞触发条件属性修改
  • 059-Web攻防-XXE安全DTD实体复现源码等
  • 061-WEB攻防-PHP反序列化原生类TIPSCVE绕过漏洞属性类型特征
  • 051-Web攻防-文件安全目录安全测试源码等
  • Dilworth定理及其在算法题中的应用
  • 050-WEB攻防-PHP应用文件包含LFIRFI伪协议编码算法无文件利用黑白盒
  • error: xxxxx does not have a commit checked out
  • 049-WEB攻防-文件上传存储安全OSS对象分站解析安全解码还原目录执行
  • 云原生周刊:MetalBear 融资、Chaos Mesh 漏洞、Dapr 1.16 与 AI 平台新趋势
  • AI一周资讯 250913-250919
  • 045-WEB攻防-PHP应用SQL二次注入堆叠执行DNS带外功能点黑白盒条件-cnblog
  • linux 命令语句
  • 用 Kotlin 实现英文数字验证码识别
  • 达芬奇(DaVinci Reslove)字体文件 bugb标签