前言
最近在研究AUTOSAR通信協(xié)議棧的時候產(chǎn)生了以下幾個問題:
(1)Lin數(shù)據(jù)由linif的調(diào)度表觸發(fā)發(fā)送的話,com怎么控制Lin類型的PDU停止和發(fā)送了?
(2)怎么保證NM報文先發(fā)送的?
本文先梳理一遍通信協(xié)議棧的一些關(guān)鍵概念及重要機制,然后回答這些問題。
正文
1.Lin報文的發(fā)送機制
Lin報文的發(fā)送機制在<<Can/Lin報文的觸發(fā)發(fā)送(Trigger Transmit) >>一文中已經(jīng)詳細講解過,這里再簡單回顧下。
Lin報文的周期發(fā)送是通過調(diào)度表實現(xiàn)的,而Lin調(diào)度表存在于LinIf模塊,LinIf模塊在周期調(diào)用調(diào)度表的時候通過callback的方式實現(xiàn)IPDU的trigger transmit,也就是向上獲取到sdu數(shù)據(jù),然后調(diào)用Lin_SendFrame發(fā)送報文。調(diào)度表中的報文都是需要周期發(fā)送處理的報文,對于偶發(fā)sporadic frame的發(fā)送,COM --> PDUR -->CanIf_Transmit中設(shè)置發(fā)送flag,實現(xiàn)偶發(fā)幀發(fā)送。我們這里主要討論Lin周期報文的發(fā)送機制。
LinIf模塊實現(xiàn)Lin調(diào)度表中報文的周期發(fā)送,且所有報文都是通過調(diào)用pdur模塊的PduR_TriggerTransmit的callback函數(shù)完成sdu數(shù)據(jù)的獲取。
LinIf模塊調(diào)用PduR_LinIfTriggerTransmit函數(shù)來獲取PDU數(shù)據(jù),如果獲取數(shù)據(jù)成功,則調(diào)用LinIf_SendFrame往LinDriver發(fā)送數(shù)據(jù),如果獲取數(shù)據(jù)失敗則不會發(fā)送Lin報文。
那也就是說,如果找到PduR_LinIfTriggerTransmit返回失敗的原因也就找到了LinIf停止發(fā)送報文的原因。
繼續(xù)往下分析PduR_LinIfTriggerTransmit函數(shù),PduR_LinIfTriggerTransmit --> Com_TriggerTransmit
分析Com_TriggerTransmit函數(shù)
Com_TriggerTransmit函數(shù)會首先會檢查PDU所在的PduGroup是否Started了,如果沒有Started,則Com_TriggerTransmit函數(shù)返回E_NOT_OK。、
也就是說如果PDU所在的PduGroup沒有Started則Com_TriggerTransmit返回E_NOT_OK,PduR_LinIfTriggerTransmit返回失敗,則LinIf_ManiFunction_<
2.NM報文和App報文的發(fā)送
如果我們使用Can網(wǎng)絡(luò)管理的話,那么Can網(wǎng)絡(luò)管理報文由CanNm模塊控制發(fā)送,而應(yīng)用報文的發(fā)送是由Com模塊和ComM模塊協(xié)同管理發(fā)送的,那么問題就來了:
NM報文由CanNm模塊控制發(fā)送,App報文由Com/ComM模塊控制發(fā)送,那么我們怎么保證每次上電/Reset后NM報文首先發(fā)送到總線上去了?
AUTOSAR標準里面沒有規(guī)定NM報文和APP報文誰先發(fā)送出去的配置。但是NM模塊提供了一個
Std_ReturnType Nm_GetState(
NetworkHandleType nmNetworkHandle,
Nm_StateType* nmStatePtr,
Nm_ModeType* nmModePtr
)
接口可以獲取當前NM模式和狀態(tài),如果我們在請求ComM到FullCom前先確包NM模式進入到Network狀態(tài)的話,那么NM報文一定會在APP報文之前發(fā)送出去。
Example:
Nm_StateType NmCurrentState; Nm_ModeType NmCurrentMode; Nm_GetState(ComMConf_ComMChannel_ComMChannel_Can_Network_0,&NmCurrentState,&NmCurrentMode); if(( NM_MODE_SYNCHRONIZE == NmCurrentMode )||( NM_MODE_NETWORK == NmCurrentMode )) { ComM_RequestComMode(ComMConf_ComMUser_ComMUser_Can_Network_0,COMM_FULL_COMMUNICATION); ComM_RequestComMode(ComMConf_ComMUser_ComMUser_Can_Network_1,COMM_FULL_COMMUNICATION); }
3.問題回答
問題1:Lin數(shù)據(jù)由Linif的調(diào)度表觸發(fā)發(fā)送的話,com怎么控制所有Lin報文所在的PDU的停止和發(fā)送了?
答:LinIf通過LinIf_MainFunction --> PduR_LinIfTriggerTransmit --> Com_TriggerTransmit獲取Lin報文的PDU數(shù)據(jù),如果獲取失敗則不會調(diào)用LinIf_SendFrame發(fā)送報文。而Com_TriggerTransmit函數(shù)在獲取PDU數(shù)據(jù)時首先會檢查PDU所在的PduGroup是否Started,如果沒有Started則Com_TriggerTransmit返回E_NOT_OK,最終LinIf_MainFunction停止往驅(qū)動發(fā)送報文,也就停發(fā)Lin報文。也就是說,我們通過BswM調(diào)用Com模塊提供的Com_IpduGroupStart,Com_IpduGroupStop同樣能控制Lin報文的停止和發(fā)送。
問題2:怎么保證NM報文先發(fā)送的?
答:需要手寫代碼或者通過BswM模式控制和仲裁實現(xiàn)。具體就是在請求APP報文所在Network進入到FullCom之前確保NM模式已經(jīng)進入了NetWork狀態(tài)。
審核編輯:劉清
-
CAN總線
+關(guān)注
關(guān)注
145文章
1946瀏覽量
130726 -
AUTOSAR
+關(guān)注
關(guān)注
10文章
360瀏覽量
21552 -
PDU
+關(guān)注
關(guān)注
0文章
94瀏覽量
16977 -
LIN
+關(guān)注
關(guān)注
4文章
216瀏覽量
40273 -
通信協(xié)議棧
+關(guān)注
關(guān)注
0文章
7瀏覽量
6170
原文標題:AUTOSAR LIN通信協(xié)議棧問題總結(jié)
文章出處:【微信號:eng2mot,微信公眾號:汽車ECU開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論