在AUTOSAR中,COM模塊提供了兩種機制來處理接收到的PDU:ComRxPduCallout和ComNotification
在CAN驅(qū)動中,回調(diào)函數(shù)通常是通過中斷或輪詢的方式觸發(fā)的。當CAN控制器接收或發(fā)送CAN數(shù)據(jù)幀時,CAN控制器會產(chǎn)生相應(yīng)的中斷或狀態(tài)變化,在中斷服務(wù)例程(ISR)中或輪詢循環(huán)中,CAN驅(qū)動會調(diào)用相應(yīng)的回調(diào)函數(shù)來處理這些CAN事件。
第一種回調(diào),可以按照收到信號的順序觸發(fā)COM層的回調(diào),因為收到的信號會存在fifo里,這就可以按照順序觸發(fā)。
先說結(jié)論:當Can_MainFunction_Read 處理接收到的消息時,CanIf層將調(diào)用PduR層的PduR_CanIfRxIndication 函數(shù)。然后,PduR層將該消息路由到COM層,并調(diào)用Com_RxIndication 函數(shù)。最后,當COM層處理接收到的消息時,它將觸發(fā)配置的回調(diào)函數(shù)。
為了在接收到CAN消息時觸發(fā)COM層的回調(diào),需要遵循以下步驟:
配置CanIf層:確保在CanIf層為接收到的CAN消息配置了相應(yīng)的CanIfRxPdu。這包括為其指定一個PduId,并將其與期望的CAN ID 和數(shù)據(jù)長度相關(guān)聯(lián)。
配置PduR層:在PduR層,創(chuàng)建一個路由從CanIf層到Com層。這可以通過在PduR中定義PduRRoutingPath并關(guān)聯(lián)CanIf的PduId 和Com層的PduId 來實現(xiàn)。
配置COM層:在COM層,為接收到的CAN消息定義一個接收IPDU,并指定一個回調(diào)函數(shù)。這個回調(diào)函數(shù)將在接收到新消息時被調(diào)用。通常,回調(diào)函數(shù)在接收到消息后會對其進行處理,例如將數(shù)據(jù)傳輸?shù)綉?yīng)用程序。
這種回調(diào)是通過COM收到CAN的PduID,遍歷一個數(shù)組,之后根據(jù)返回的數(shù)字idx再去遍歷回調(diào)數(shù)組,根據(jù)idx來判斷要執(zhí)行哪個回調(diào),這個函數(shù)的執(zhí)行是在 Com_RxIndication 里執(zhí)行的。
通過davinci配置可以看出,CAN Controller中RXprocessing是polling模式,那么callout的回調(diào)觸發(fā)是在polling模式下觸發(fā);
也就是調(diào)用的是下面這兩個函數(shù),注意根據(jù)配置要區(qū)分Basic CAN和Full CAN;
假設(shè),現(xiàn)在進來的信號是通過Basic can進來的,在Polling模式下,Basic CAN模塊是通過輪詢CAN控制器中的接收緩沖區(qū)(mailBox)來接收CAN數(shù)據(jù)幀,【也就是如果是報文如果在FilterMask里的,數(shù)據(jù)可以通過CAN傳給canif,否則,不管】
在這個過程中,當CAN控制器接收到一個CAN數(shù)據(jù)幀時,CAN控制器會將CAN數(shù)據(jù)幀存儲在FIFO Buffer中。Basic CAN模塊在輪詢CAN控制器的接收緩沖區(qū)時,會從FIFO Buffer中讀取CAN數(shù)據(jù)幀,并將CAN數(shù)據(jù)幀中的信號解析出來。解析后的信號將被傳遞到CanIf模塊中,以便上層模塊進行處理。
將接收到的CAN數(shù)據(jù)幀解析的信號傳遞到CanIf模塊;
之后將數(shù)據(jù)在傳到PDUR,之后在傳到COM。
第二種回調(diào),ComNotification是一個接口,用于通知上層模塊有新的數(shù)據(jù)到達或數(shù)據(jù)發(fā)送完成。
在代碼中可以是通過一個TASK來循環(huán)執(zhí)行 Com_MainFunctionRx 這個任務(wù),Com_MainFunctionRx是一個COM模塊的主任務(wù)函數(shù),用于處理接收到的數(shù)據(jù)。當Com_MainFunctionRx函數(shù)接收到數(shù)據(jù)后,可以通過調(diào)用ComNotification來觸發(fā)通知事件,通知上層應(yīng)用程序進行處理。
當數(shù)據(jù)更新時,COM層會檢查所有與該數(shù)據(jù)相關(guān)聯(lián)的ComNotification,并將其標記為“待觸發(fā)”。然后,COM層會在稍后的時間點觸發(fā)已標記為“待觸發(fā)”的ComNotification,并將相關(guān)的數(shù)據(jù)對象ID作為參數(shù)傳遞給應(yīng)用程序。
假設(shè)收到的是信號組,遍歷所有COM收到的信號組,如果信號組的數(shù)據(jù)完整,就觸發(fā)ComNotification的,進入到下一個處理。
當Com接收到一個PDU時,它會根據(jù)配置選擇是將PDU緩存起來還是直接調(diào)用應(yīng)用程序提供的回調(diào)函數(shù)。如果選擇了緩存,那么PDU將被緩存起來,并等待應(yīng)用程序調(diào)用Com_ReceiveSignal或Com_ReceiveSignalGroup函數(shù)時進行處理;如果選擇了直接調(diào)用回調(diào)函數(shù),則會將PDU的數(shù)據(jù)傳遞給應(yīng)用程序提供的回調(diào)函數(shù)進行處理。
Com_CacheOrCallRxDeferredCbkFctPtr,用于緩存或調(diào)用接收到PDU時的回調(diào)函數(shù)。
當Com接收到一個PDU時,它會根據(jù)配置選擇是將PDU緩存起來還是直接調(diào)用應(yīng)用程序提供的回調(diào)函數(shù)。如果選擇了緩存,那么回調(diào)函數(shù)的索引將被緩存起來,并等待應(yīng)用程序調(diào)用Com_ReceiveSignal或Com_ReceiveSignalGroup函數(shù)時進行處理;如果選擇了直接調(diào)用回調(diào)函數(shù),則會將PDU的數(shù)據(jù)傳遞給應(yīng)用程序提供的回調(diào)函數(shù)進行處理。
對比兩種回調(diào):
ComRxPduCallout的觸發(fā)順序可以按照接收到PDU的順序進行,因為在處理每個PDU時,COM模塊都會等待應(yīng)用程序返回處理狀態(tài),然后再繼續(xù)處理下一個PDU。因此,如果應(yīng)用程序處理PDU的順序與PDU到達的順序相同,則ComRxPduCallout的回調(diào)也會按照PDU到達的順序進行。
ComNotification是一種機制,允許應(yīng)用程序在數(shù)據(jù)更新事件發(fā)生時執(zhí)行自定義邏輯,并不要求應(yīng)用程序返回狀態(tài)值。當COM模塊檢測到數(shù)據(jù)更新事件時,它會對與更新事件相關(guān)聯(lián)的數(shù)據(jù)對象注冊的ComNotification進行回調(diào),并將相關(guān)的數(shù)據(jù)對象ID作為參數(shù)傳遞給應(yīng)用程序。ComNotification的觸發(fā)順序不能按照接收到PDU的順序進行,因為在數(shù)據(jù)更新事件發(fā)生時,COM模塊無法確定哪些數(shù)據(jù)對象會發(fā)生更新以及它們的更新順序。
舉例:
假設(shè)有兩個節(jié)點A和B,它們之間通過CAN總線進行通信。節(jié)點A向節(jié)點B發(fā)送兩個數(shù)據(jù)對象1和2。首先,節(jié)點A發(fā)送數(shù)據(jù)對象1,然后發(fā)送數(shù)據(jù)對象2,節(jié)點B按照接收到PDU的順序先接收到了數(shù)據(jù)對象1,然后接收到了數(shù)據(jù)對象2。此時,如果節(jié)點B上的應(yīng)用程序使用ComRxPduCallout來處理PDU,并且在處理PDU時需要訪問其他節(jié)點發(fā)送的數(shù)據(jù)對象,那么ComRxPduCallout的回調(diào)順序?qū)凑展?jié)點發(fā)送的順序進行。因此,節(jié)點B上的應(yīng)用程序?qū)凑?->2的順序處理PDU,并且可以在處理PDU時訪問先收到的數(shù)據(jù)對象1。
相反,如果節(jié)點B上的應(yīng)用程序使用ComNotification來處理數(shù)據(jù)更新事件,并且在處理數(shù)據(jù)更新事件時需要訪問其他節(jié)點發(fā)送的數(shù)據(jù)對象,那么ComNotification不一定按照節(jié)點發(fā)送順序執(zhí)行。例如,如果數(shù)據(jù)對象1和2之間存在依賴關(guān)系,并且在數(shù)據(jù)對象2更新前,數(shù)據(jù)對象1也會發(fā)生更新,那么節(jié)點2上的應(yīng)用程序可能會在接收到數(shù)據(jù)對象2更新事件前先接收到數(shù)據(jù)對象1的更新事件。因此,節(jié)點B上的應(yīng)用程序不能保證按照節(jié)點發(fā)送順序執(zhí)行,因為更新事件的順序可能與節(jié)點發(fā)送順序不同。
ComNotification的接收對象的依存關(guān)系是通過ComSignal的更新順序來判斷的。在標準的AUTOSAR架構(gòu)中,ComSignal是一個最小的數(shù)據(jù)單元,用于在不同的ECU之間傳輸數(shù)據(jù)。ComSignal可以表示為一個信號,例如車速、轉(zhuǎn)速等。ComSignal可以在ECU之間交換,也可以在ECU內(nèi)部使用。每個ComSignal都可以擁有一個或多個ComSignalGroup,其中每個ComSignalGroup包含一組相關(guān)的ComSignal。這些ComSignal可以具有不同的數(shù)據(jù)類型、精度、單位和值范圍。ComSignalGroup可以在ECU之間交換,也可以在ECU內(nèi)部使用。
當一個ComSignal或ComSignalGroup的值發(fā)生變化時,ComNotification會將更新事件通知給所有已注冊該ComSignal或ComSignalGroup的應(yīng)用程序。應(yīng)用程序可以在接收到更新事件時執(zhí)行自定義邏輯。
ComNotification的接收對象的依存關(guān)系是基于ComSignal的更新順序來判斷的。如果多個ComSignal的更新順序存在依賴關(guān)系,那么它們的接收對象之間也會存在依賴關(guān)系。例如,如果一個ComSignal的更新依賴于另一個ComSignal的更新,那么它們的接收對象之間也會存在依賴關(guān)系。在這種情況下,應(yīng)用程序需要確保在接收到依賴的ComSignal的更新事件后再處理當前ComSignal的更新事件,以避免使用不一致的數(shù)據(jù)。
總之,ComNotification的接收對象的依存關(guān)系是基于ComSignal的更新順序來判斷的。如果多個ComSignal的更新順序存在依賴關(guān)系,那么它們的接收對象之間也會存在依賴關(guān)系。應(yīng)用程序需要確保在接收到依賴的ComSignal的更新事件后再處理當前ComSignal的更新事件,以避免使用不一致的數(shù)據(jù)。
審核編輯:劉清
-
接收機
+關(guān)注
關(guān)注
8文章
1222瀏覽量
54398 -
AUTOSAR
+關(guān)注
關(guān)注
10文章
376瀏覽量
22530 -
CAN控制器
+關(guān)注
關(guān)注
3文章
75瀏覽量
15294 -
回調(diào)函數(shù)
+關(guān)注
關(guān)注
0文章
88瀏覽量
11865
原文標題:AUTOSAR中CAN信號是如何觸發(fā)COM回調(diào)的
文章出處:【微信號:汽車電子嵌入式,微信公眾號:汽車電子嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
cyusb3014的usbTouart的dma通道配置,請問為什么回調(diào)函數(shù)無法觸發(fā)?
STemWin中用到很多回調(diào)函數(shù),這些回調(diào)函數(shù)是什么時候被觸發(fā)的?
請問LWIP中的回調(diào)函數(shù)如何傳遞參數(shù)?
怎么通過rt_device_t判斷是哪個串口觸發(fā)的回調(diào)函數(shù)
在哪里可以找到CAN驅(qū)動程序中的演示Autosar代碼呢
CAN總線使用擴展ID觸發(fā)FIFO回調(diào)怎么解決呢
CAN發(fā)送和串口發(fā)送是不是不能放在定時器的回調(diào)函數(shù)中?
怎么通過rt_device_t判斷是那個串口觸發(fā)的回調(diào)函數(shù)?
如何檢測由未知CAN ID觸發(fā)的中斷信號?
C語言函數(shù)的回調(diào)函數(shù)
AUTOSAR CAN網(wǎng)絡(luò)管理協(xié)議
根據(jù)回調(diào)機制注冊事件并處理回調(diào)VI
應(yīng)用筆記 | 淺談STM32庫里的回調(diào)函數(shù)

評論