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