AUTOSAR PDU Router详解文档
目录
- 1. 概述
- 2. PDU Router模块架构
- 3. PDU Router配置模型
- 4. PDU Router路由流程
- 5. PDU Router状态机
- 6. 总结
1. 概述
PDU Router模块是AUTOSAR通信架构中的核心组件,负责在AUTOSAR软件组件之间路由I-PDU(Interaction Layer Protocol Data Units)。该模块提供了灵活的I-PDU转发机制,支持多种路由模式,包括单播、多播和网关功能。
1.1 PDU Router的作用
根据源文档描述,PDU Router模块主要提供以下功能:
- I-PDU路由转发:基于静态配置的路由表,将I-PDU从源模块转发到目标模块
- 网关功能:支持不同通信接口之间的I-PDU转发,实现网络间通信
- 多播支持:支持1:n路由,将单个I-PDU转发到多个目标模块
- 缓冲区管理:提供FIFO和Last-is-best两种缓冲策略
- 传输协议支持:支持CAN、FlexRay、LIN等传输协议模块的网关功能
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模块通过以下接口与上下层模块交互:
- 上层接口:提供
PduR_<User:Up>Transmit
、PduR_<User:Up>CancelTransmit
等API - 下层接口:提供
PduR_<User:Lo>RxIndication
、PduR_<User:Lo>TxConfirmation
等API - 传输协议接口:提供
PduR_<User:LoTp>StartOfReception
、PduR_<User:LoTp>CopyRxData
等API
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:
- 功能:PDU Router模块的主配置类,包含所有配置数据
- 关键属性:
PduRBswModules[]
:BSW模块配置数组PduRGeneral
:通用配置参数PduRRoutingPathGroups[]
:路由路径组配置PduRRoutingPaths[]
:路由路径配置PduRSrcPdus[]
:源PDU配置PduRDestPdus[]
:目标PDU配置PduRTxBuffers[]
:传输缓冲区配置PduRDefaultValues[]
:默认值配置
PduRGeneralType:
- 功能:PDU Router模块的通用配置参数
- 关键属性:
PduRDevErrorDetect
:开发错误检测开关PduRVersionInfoApi
:版本信息API开关PduRMaxRoutingPathCnt
:最大路由路径数量PduRMaxTxBufferCnt
:最大传输缓冲区数量PduRMaxRoutingPathGroupCnt
:最大路由路径组数量
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路由
参与者:
- COM模块:上层应用模块,发起I-PDU传输请求
- PDU Router引擎:核心路由引擎,处理路由决策和转发
- 路由路径表:静态配置的路由规则表
- 缓冲区管理:管理I-PDU的缓冲存储
- CAN接口、FlexRay接口:下层通信接口模块
流程步骤:
- 传输请求:COM模块调用
PduR_ComTransmit
发起传输请求 - 路由查询:PDU Router引擎查询路由路径表,获取目标模块列表
- 数据提供方式判断:
- 直接数据提供:立即调用目标模块的传输接口
- 触发传输数据提供:先存储数据,等待目标模块请求
4.2 通信接口网关流程
场景描述:CAN接口接收I-PDU并转发到FlexRay接口,实现网关功能
参与者:
- CAN接口:源通信接口,接收I-PDU
- PDU Router引擎:执行网关转发逻辑
- FlexRay接口:目标通信接口,发送I-PDU
流程步骤:
- 接收指示:CAN接口调用
PduR_CanIfRxIndication
通知PDU Router - 目标查询:PDU Router引擎查询路由路径,确定目标模块
- 转发处理:
- 直接转发:立即调用目标接口的传输函数
- FIFO缓冲:存储到FIFO队列,等待目标模块请求
4.3 传输协议网关流程
场景描述:CAN传输协议接收多帧数据并转发到FlexRay传输协议
参与者:
- CAN传输协议:源传输协议模块
- PDU Router引擎:管理TP网关逻辑
- FlexRay传输协议:目标传输协议模块
流程步骤:
- 开始接收:CAN传输协议调用
PduR_CanTpStartOfReception
开始接收 - 路由查询:PDU Router引擎查询路由路径,确定目标TP模块
- 网关模式选择:
- 直接网关:等待完整接收后开始传输
- 网关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):
- 含义:模块尚未初始化,无法提供任何服务
- 特征:
- 所有内部数据结构未初始化
- 路由路径表为空
- 缓冲区管理器未就绪
- 进入条件:系统启动时
- 退出条件:调用
PduR_Init
函数成功初始化
在线运行状态(Online):
- 含义:模块正常运行,提供完整的路由服务
- 特征:
- 支持所有PDU Router功能
- 处理I-PDU路由和网关
- 支持管理操作
- 错误检测和处理
5.2 子状态
空闲状态(Idle):
- 含义:等待处理请求的状态
- 特征:
- 等待I-PDU传输请求
- 等待接收指示
- 等待管理API调用
路由处理状态(Routing):
- 含义:处理I-PDU路由转发
- 特征:
- 支持1:1, 1:n, n:1路由
- 直接数据提供和触发传输
- 多播支持
- 传输确认处理
网关处理状态(Gateway):
- 含义:处理通信接口间网关
- 特征:
- 通信接口间网关
- FIFO缓冲支持
- 直接转发和缓冲转发
- 错误处理
TP网关处理状态(TPGateway):
- 含义:处理传输协议间网关
- 特征:
- 传输协议间网关
- 支持直接网关和on-the-fly
- 缓冲区动态分配
- 阈值控制传输
5.3 状态转换
初始化转换:
Uninitialized
→Online
:初始化完成Online
→Offline
:系统关闭或错误Offline
→Uninitialized
:重新初始化
运行状态转换:
Idle
→Routing
:收到传输请求Idle
→Gateway
:收到接收指示Idle
→TPGateway
:收到TP接收指示Idle
→Management
:收到管理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 技术特点
- 静态路由:基于配置表的路由决策,确保实时性能
- 缓冲区管理:支持FIFO和Last-is-best两种缓冲策略
- 传输协议支持:完整的TP模块网关功能
- 错误处理:符合AUTOSAR标准的错误检测和报告
PDU Router模块的设计充分体现了AUTOSAR架构的模块化和标准化特点,为汽车电子系统的通信提供了可靠的基础设施。