一.前言
前兩期,我們講了CAN模塊的發(fā)送邏輯,Canif模塊的發(fā)送邏輯和發(fā)送確認(rèn)邏輯,可以看到MCAL的CAN模塊是對MessgeBuffer這個CAN郵箱機制 做了抽象,將其抽象成一個個的HOH。而Canif則是從報文層面做了抽象,抽象成了一個個的PDUID。再往上會有CANtp以及PDUR模塊調(diào)用Canif,本期我們講解PDUR的發(fā)送路由功能,請思考PduR這個模塊對什么進(jìn)行了抽象呢?
通信架構(gòu)中PduR的位置如圖所示:
PDUR作用是對IPDU進(jìn)行路由,分發(fā)到正確的模塊,它是雙向的,即上層的COM DCM的報文數(shù)據(jù)發(fā)送,會經(jīng)由PDUR分發(fā)到canif 或cantp或其他底層通信模塊.而下層的報文接收,也會經(jīng)由PDUR進(jìn)行分發(fā) 告知對應(yīng)的COM或者DCM,除此之外還有一些buffer功能等不在我們此系列介紹范圍內(nèi)。
二.PduR模塊及其發(fā)送函數(shù),發(fā)送確認(rèn)函數(shù)
在PDUR中實現(xiàn)發(fā)送報文的函數(shù)是PduR_Transmit
這個函數(shù)被PduR_ComTransmit和PduR_DcmTransmit調(diào)用,上層模塊COM以及DCM模塊通過這兩個函數(shù)和PduR模塊交互,實現(xiàn)發(fā)送報文的。在這個PduR_Transmit中,同樣是按照IPDUID去索引對應(yīng)的配置結(jié)構(gòu)體數(shù)組成員,找到對應(yīng)PDU的對應(yīng)RoutingPaths,對RoutingPaths中配置的目標(biāo)PDU進(jìn)行分發(fā),根據(jù)配置的目標(biāo)模塊調(diào)用對應(yīng)的下層CAN發(fā)送函數(shù)如Canif_transmit或者CanTp_Transmit…. 說起來比較抽象,我們看看一個具體的配置實例。
下面是RoutingPaths的配置:
const PduRRoutingPath_type * const PduRRoutingPaths[] = {
&PduRRoutingPath_PDU_ID_UDS_PHYS_TX,
&PduRRoutingPath_PDU_ID_UDS_FUNC_TX,
&PduRRoutingPath_PDU_ID_UDS_PHYS_RX,
&PduRRoutingPath_PDU_ID_UDS_FUNC_RX,
&PduRRoutingPath_Pdu_Tx_272T,
&PduRRoutingPath_Pdu_Tx_273T,
&PduRRoutingPath_Pdu_Rx_256R,
NULL_PTR
};
在配置中,對每個IPDU都配置了對應(yīng)的RoutingPaths,
其中的一個RoutingPath配置實例如下:
const PduRRoutingPath_type PduRRoutingPath_PDU_ID_UDS_PHYS_TX = {
.SrcModule = PDUR_DCM,
.SrcPduId = 0,
.SduLength = 0,
.PduRDestPdus = PduRDestinations_PDU_ID_UDS_PHYS_TX
};
RoutingPath中定義了SrcModule,用以說明這個PDU來源于什么模塊,同時也定義了他要傳輸?shù)降哪繕?biāo)pdu組。
const PduRDestPdu_type * const PduRDestinations_PDU_ID_UDS_PHYS_TX[] = {
&PduRDestination_PDU_ID_UDS_PHYS_TX_PduRDestination,
NULL_PTR
};
在目標(biāo)PDU組中你可以定義多個PduRDestPdu,在PduRDestPdu中定義了目標(biāo)模塊。即這個pdu數(shù)據(jù)需要去的模塊。
const PduRDestPdu_type PduRDestination_PDU_ID_UDS_PHYS_TX_PduRDestination = {
.DestModule = PDUR_CANTP,
.DestPduId = CANTP_PDU_ID_UDS_PHYS_TX,
.DataProvision = PDUR_NO_PROVISION,
.TxBufferRef = NULL_PTR
};
按照示例配置分析分配過程,假如現(xiàn)在上層傳過來一個pduid為0的PDU,按照0索引找到
PduRRoutingPath_PDU_ID_UDS_PHYS_TX作為RoutingPath。遍歷這個RoutingPath配置的所有目標(biāo)PDU組
獲取對應(yīng)PDU的destination.根據(jù)destination的DestModule(PDUR_DCM),調(diào)用對應(yīng)的Transmit函數(shù)(CanTp_Transmit)。向?qū)?yīng)模塊的Transmit函數(shù)傳入DestPduId。完成報文發(fā)送。這是整個PduR_Transmit的報文發(fā)送的路由過程
Std_ReturnType PduR_Transmit(PduIdType PduId, const PduInfoType* PduInfo, uint8 serviceId) {
PDUR_VALIDATE_INITIALIZED(serviceId,E_NOT_OK);
PDUR_VALIDATE_PDUPTR(serviceId, PduInfo, E_NOT_OK);
PDUR_VALIDATE_PDUID(serviceId, PduId, E_NOT_OK);
Std_ReturnType retVal = E_OK;
const PduRRoutingPath_type *route = PduRConfig- >RoutingPaths[PduId];
uint8 i = 0;
for (i = 0; route- >PduRDestPdus[i] != NULL; i++) {
const PduRDestPdu_type * destination = route- >PduRDestPdus[i];
retVal |= PduR_RouteTransmit(destination, PduInfo);
}
return retVal;
}
Std_ReturnType PduR_RouteTransmit(const PduRDestPdu_type * destination, const PduInfoType * pduInfo) {
Std_ReturnType retVal = E_NOT_OK;
switch (destination- >DestModule) {
case PDUR_CANIF:
#if PDUR_CANIF_SUPPORT == STD_ON
retVal = CanIf_Transmit(destination- >DestPduId, pduInfo);
#endif
break;
case PDUR_COM:
#if PDUR_COM_SUPPORT == STD_ON
Com_RxIndication(destination- >DestPduId, pduInfo);
#endif
break;
case PDUR_LINIF:
#if PDUR_LINIF_SUPPORT == STD_ON
retVal = LinIf_Transmit(destination- >DestPduId, pduInfo);
#endif
break;
case PDUR_CANTP:
#if PDUR_CANTP_SUPPORT == STD_ON
retVal = CanTp_Transmit(destination- >DestPduId, pduInfo);
#endif
break;
case PDUR_SOADIF:
#if PDUR_SOAD_SUPPORT == STD_ON
retVal = SoAdIf_Transmit(destination- >DestPduId, pduInfo);
#endif
break;
case PDUR_SOADTP:
#if PDUR_SOAD_SUPPORT == STD_ON
retVal = SoAdTp_Transmit(destination- >DestPduId, pduInfo);
#endif
break;
case PDUR_J1939TP:
#if PDUR_J1939TP_SUPPORT == STD_ON
retVal = J1939Tp_Transmit(destination- >DestPduId, pduInfo);
#endif
break;
default:
retVal = E_NOT_OK;
break;
}
return retVal;
}
在PDUR中實現(xiàn)報文發(fā)送確認(rèn)的函數(shù)是PduR_TxConfirmation,其被PduR_CanIfTxConfirmation調(diào)用,也被PduR_CanTpTxConfirmation調(diào)用。其和報文發(fā)送的邏輯類似。只不過最后調(diào)用的是對應(yīng)模塊的Confirmation函數(shù)。
總結(jié):PDUR這個模塊把各個報文收發(fā)的分配路徑做了抽象。上層調(diào)用PDUR的發(fā)送接口傳輸數(shù)據(jù),傳入IPDU ID即可根據(jù)PDUR的Routing Path配置知道這些IPDU應(yīng)該下發(fā)給哪些下層模塊.同理對于接收也是這樣。
-
CAN總線
+關(guān)注
關(guān)注
145文章
1971瀏覽量
132059 -
路由器
+關(guān)注
關(guān)注
22文章
3790瀏覽量
115698 -
PDU
+關(guān)注
關(guān)注
0文章
96瀏覽量
17198 -
DCM
+關(guān)注
關(guān)注
0文章
165瀏覽量
26864 -
CAN模塊
+關(guān)注
關(guān)注
0文章
25瀏覽量
8943
發(fā)布評論請先 登錄
CBE1系列SDI視音頻數(shù)字光發(fā)送機
零基礎(chǔ)學(xué)FPGA(十二)一步一腳印之基于FIFO的串口發(fā)送機
零基礎(chǔ)學(xué)FPGA(十二)基于FIFO的串口發(fā)送機設(shè)計全流程
關(guān)于“小墨同學(xué)”推出的零基礎(chǔ)FPGA“基于FIFO的串口發(fā)送機設(shè)計全流程”相關(guān)部分討論
為什么NRF24L01模塊作為發(fā)送機時卻發(fā)不出數(shù)據(jù)呢
有線電視系統(tǒng)調(diào)幅激光發(fā)送機和接收機入網(wǎng)技術(shù)條件和測量方法 G
GYT_143-2000_有線電視系統(tǒng)調(diào)幅激光發(fā)送機和接收機
CBE1系列SDI視音頻數(shù)字光發(fā)送機
CBE2系列SDI數(shù)字視音頻光發(fā)送機
FPGA視頻教程:SF-EP1C開發(fā)板-基于FIFO的串口發(fā)送機設(shè)計

DLS11 網(wǎng)關(guān)中繼器(LTE-LoRA) 數(shù)據(jù)發(fā)送機制

評論