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