前言
最近在研究AUTOSAR通信協議棧的時候發現對IPDU的Trigger Transmit很是疑惑,產生了以下幾個問題:
(1)Com模塊的IPDU的trigger發送和CanIf或者Can模塊的Trigger發送一樣嗎?
(2)怎么通過CanIf模塊發送trigger IPDU?
(3)哪個模塊完成Can trigger IPDU的判斷?
(4)請說明Can IPDR的Trigger Transmit的整個過程?
(5)Lin IPUD和Can IPDU的trigger transmit有何異同?
本文先梳理一遍CAN、LIN報文的發送過程,然后回答這些問題。
AUTOSAR 通信服務-Com模塊概念詳解
AUTOSAR 通信服務-PDU Router
AUTOSAR CAN通信協議棧分析(3)-CanIf
Can通信協議棧分析(1)-Can Driver
正文
1.CAN報文IPDU的發送過程
1.1 COM模塊發送IPDU
在COM模塊中,周期報文通過Com_MainFunctionTx周期調度函數發送,事件觸發型報文通過Com_TriggerIPDUSend通信服務接口發送。無論是Com_MainFunctionTx還是Com_TriggerIPDUSend最后都是調用PDUR模塊的PduR_ComTransmit來發送報文,且傳入到PduR模塊的PduInfo->SDU數據buffer指針不為NULL。
1.2 PDUR模塊發送IPDU
強調Com模塊過來的Can IPDU->SDU一定不為NULL是因為它會影響報文的發送方式(1.3章節詳解)。PduR模塊對于Com模塊的CAN IPDU直接調用CanIf_Transmit發送,CanIf收到IPDU發送請求后直接調用CanDriver的接口發送報文,Copy Data到CanController發送。
PduR模塊的PduRestPdu配置容器提供了PduRDestPduDatProvision配置參數來配置每一個發送報文是直接發送還是觸發式發送。
Note: 在ETAS的集成配置環境ISOLAR中這個參數無論配置成啥都不影響PduR模塊的配置代碼。個人認為這個PduR模塊對于Can報文的發送都是直接調用CanIf_Transmit,確實不需要這個參數,所以到底是ISOLAR有問題還是確實這個參數不影響代碼的生成還有待研究。
1.3 CanIf模塊發送IPDU
CanIf模塊提供CanIfTrggerTransmitSupport配置參數來配置CanIf模塊是否支持Trigger方式發送報文。
CanIf為每一Tx IPDU提供了CanIfTxPduTriggerTransmit的配置參數。如果該報文的上層發送模塊是PduR模塊且配置了該參數為True,這在PduR模塊就是生成PduR_CanIfTriggerTransmit的函數。
1.3.1 DIRECT發送
CanIf模塊的CanIf_Transmit接口函數本身并不會判斷傳入的IPDU是否是需要Trigger發送(僅僅會做一些Det的檢測),而是直接調用Can_Write來發送IPDU,由Can模塊通過傳入的IpduInfo->Sdu是否為NULL來確定是DIRECT發送還是TRIGGER發送IPDU。
如果是IpduInfo->Sdu不為NULL,則為DIRECT發送方式,Can_Write直接完成Copy Data into controller完成報文的發送。
1.3.2 Trigger發送
如果是IpduInfo->Sdu為NULL,則為TRIGGER發送方式,Can_Write --> CanIf_TriggerTransmit --> PduR_CanIfTriggerTransmit --> Com_TriggerTransmit完成IpduInfo->Sdu into Controller的數據拷貝,也就是所謂的Trigger數據發送。
1.4 Can模塊發送IPDU
Can模塊提供CanTriggerTransmitEnable配置參數來配置是否使用Trigger Transmit功能。Can模塊完成IPDUD最終的Trigger發送。
2.LIN報文IPUD的發送過程
2.1 COM模塊發送IPDU
COM模塊統一了所有IPUD的處理方式,和1.1節完全一樣。
2.2 PDUR模塊發送IPDU
Lin報文的周期發送是通過調度表實現的,而Lin調度表存在于LinIf模塊,LinIf模塊在周期調用調度表的時候通過callback的方式實現IPDU的trigger transmit,也就是向上獲取到sdu數據,然后調用Lin_SendFrame發送報文。調度表中的報文都是需要周期發送處理的報文,對于偶發sporadic frame的發送,COM --> PDUR -->CanIf_Transmit中設置發送flag,實現偶發幀發送。
2.2.2 Lin非偶發幀sporadic frame發送
2.3 LinIf模塊發送IPDU
LinIf模塊實現Lin調度表中報文的周期發送,且所有報文都是通過調用pdur模塊的PduR_TriggerTransmit的callback函數完成sdu數據的獲取。
LinIf模塊的LinIfTxPdu配置容器中提供了LinifTxTriggerTransmitUL的配置參數,但是這個參數依賴于LinIfUserTxUL參數,如果LinIfUserTxUL配置為PDUR,則LinifTxTriggerTransmitUL參數不管有無配置,則
2.4 Lin模塊發送IPDU
Lin模塊沒有trigger transmit的判斷,提供Lin_SendFrame的接口即可。
3.問題回答
問題1:Com模塊的IPDU的trigger發送和CanIf或者Can模塊的Trigger發送一樣嗎?
答:Com模塊的IPDU的trigger發送和CanIf或者Can模塊的Trigger發送不一樣。
Com模塊的trigger transmit是某個事件觸發是調用Com_TriggerIPDUSend發送IPDU,但是無論是Com的周期發送Com_MainFunctionTx還是Com_TriggerIPDUSend發送IPDU,都是調用PduR_ComTransmit,而PDUR->CanIf->Can對于Com來的IPDU都是統一以DIRECT的方式直接Copy Data到Can Controller。
CanIf模塊本身不做IPDU是否需要trigger transmit的判斷,而是直接將IpudInfoPtr傳遞給Can模塊,Can模塊中通過IpduInfoPtr->Sdu是否為NULL來絕對是使用DIRECT的方式還是trigger transmit/也就是向上調用callback后set buffer來發送報文。
問題2:怎么通過CanIf模塊發送trigger IPDU?
答:CanIfUser(可以自定義一個模塊,或者是其他模塊)在調用CanIf_Transmti發送報文的時候傳入的IpduInfoPtr->Sdu == NULL同時CAN模塊需要enable trigger transmit就可以實現CAN IPDU使用CanIf模塊trigger transmit。
問題3:哪個模塊完成Can trigger IPDU的判斷?
答:CanDriver模塊。
問題4:請說明Can IPDR的Trigger Transmit的整個過程?
答:CanDriver模塊通過判斷CanIf模塊傳入的IpduInfoPtr-Sdu為NULL且Can模塊enbale了trigger transmit后調用CanIf_TriggerTransmt -> PduR_TriggerTransmt -> Com_TriggerTransmt完成Copy Data into Controller的數據拷貝操作,之后通過Can發送報文。
問題5:Lin IPDU和Can IPDU的trigger transmit有何異同?
答:
相同點:IPDU的trigger transmit都是最后調用Com_TriggerTransmit函數實現的。
不同點:Lin IPDU如果是非偶發幀(sporadic frame)在通過調度表發送時都是使用trigger transmit分方式發送的且COM -> PDUR對LIN IPDU的發送無影響;而Can IPDU的周期發送主要是通過COM -> PDUR向下傳遞IpduInfoPtr通過DIRECT方式發送的。
審核編輯:郭婷
-
CAN
+關注
關注
57文章
2762瀏覽量
464008 -
LIN
+關注
關注
4文章
218瀏覽量
40317
原文標題:Can/Lin報文的觸發發送(Trigger Transmit)
文章出處:【微信號:汽車電子嵌入式,微信公眾號:汽車電子嵌入式】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論