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架構的模塊化和標準化特點,為汽車電子系統的通信提供了可靠的基礎設施。