<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

AUTOSAR中CAN信號是如何觸發COM回調的呢?

832065824 ? 來源:CSDN ? 2023-11-01 10:26 ? 次閱讀

在AUTOSAR中,COM模塊提供了兩種機制來處理接收到的PDU:ComRxPduCalloutComNotification

CAN驅動中,回調函數通常是通過中斷或輪詢的方式觸發的。當CAN控制器接收或發送CAN數據幀時,CAN控制器會產生相應的中斷或狀態變化,在中斷服務例程(ISR)中或輪詢循環中,CAN驅動會調用相應的回調函數來處理這些CAN事件。

第一種回調,可以按照收到信號的順序觸發COM層的回調,因為收到的信號會存在fifo里,這就可以按照順序觸發。

先說結論:當Can_MainFunction_Read 處理接收到的消息時,CanIf層將調用PduR層的PduR_CanIfRxIndication 函數。然后,PduR層將該消息路由到COM層,并調用Com_RxIndication 函數。最后,當COM層處理接收到的消息時,它將觸發配置的回調函數。

為了在接收到CAN消息時觸發COM層的回調,需要遵循以下步驟:

配置CanIf層:確保在CanIf層為接收到的CAN消息配置了相應的CanIfRxPdu。這包括為其指定一個PduId,并將其與期望的CAN ID 和數據長度相關聯。

配置PduR層:在PduR層,創建一個路由從CanIf層到Com層。這可以通過在PduR中定義PduRRoutingPath并關聯CanIf的PduId 和Com層的PduId 來實現。

配置COM層:在COM層,為接收到的CAN消息定義一個接收IPDU,并指定一個回調函數。這個回調函數將在接收到新消息時被調用。通常,回調函數在接收到消息后會對其進行處理,例如將數據傳輸到應用程序。

d981b538-785d-11ee-939d-92fbcf53809c.png

這種回調是通過COM收到CAN的PduID,遍歷一個數組,之后根據返回的數字idx再去遍歷回調數組,根據idx來判斷要執行哪個回調,這個函數的執行是在 Com_RxIndication 里執行的。

d98c7900-785d-11ee-939d-92fbcf53809c.png

通過davinci配置可以看出,CAN Controller中RXprocessing是polling模式,那么callout的回調觸發是在polling模式下觸發;

d9a21a08-785d-11ee-939d-92fbcf53809c.png

也就是調用的是下面這兩個函數,注意根據配置要區分Basic CAN和Full CAN;

d9b03b88-785d-11ee-939d-92fbcf53809c.png

d9bc8e38-785d-11ee-939d-92fbcf53809c.png

假設,現在進來的信號是通過Basic can進來的,在Polling模式下,Basic CAN模塊是通過輪詢CAN控制器中的接收緩沖區(mailBox)來接收CAN數據幀,【也就是如果是報文如果在FilterMask里的,數據可以通過CAN傳給canif,否則,不管

d9c9d6e2-785d-11ee-939d-92fbcf53809c.png

在這個過程中,當CAN控制器接收到一個CAN數據幀時,CAN控制器會將CAN數據幀存儲在FIFO Buffer中。Basic CAN模塊在輪詢CAN控制器的接收緩沖區時,會從FIFO Buffer中讀取CAN數據幀,并將CAN數據幀中的信號解析出來。解析后的信號將被傳遞到CanIf模塊中,以便上層模塊進行處理。

d9f4359a-785d-11ee-939d-92fbcf53809c.png

將接收到的CAN數據幀解析的信號傳遞到CanIf模塊;

da123298-785d-11ee-939d-92fbcf53809c.png

之后將數據在傳到PDUR,之后在傳到COM。

da1e9ef2-785d-11ee-939d-92fbcf53809c.png

da260a8e-785d-11ee-939d-92fbcf53809c.png

第二種回調,ComNotification是一個接口,用于通知上層模塊有新的數據到達或數據發送完成。

在代碼中可以是通過一個TASK來循環執行 Com_MainFunctionRx 這個任務,Com_MainFunctionRx是一個COM模塊的主任務函數,用于處理接收到的數據。當Com_MainFunctionRx函數接收到數據后,可以通過調用ComNotification來觸發通知事件,通知上層應用程序進行處理。

當數據更新時,COM層會檢查所有與該數據相關聯的ComNotification,并將其標記為“待觸發”。然后,COM層會在稍后的時間點觸發已標記為“待觸發”的ComNotification,并將相關的數據對象ID作為參數傳遞給應用程序。

da3fd0cc-785d-11ee-939d-92fbcf53809c.png

da544b92-785d-11ee-939d-92fbcf53809c.png

da5ed47c-785d-11ee-939d-92fbcf53809c.png

da75ec5c-785d-11ee-939d-92fbcf53809c.png

假設收到的是信號組,遍歷所有COM收到的信號組,如果信號組的數據完整,就觸發ComNotification的,進入到下一個處理。

da913e80-785d-11ee-939d-92fbcf53809c.png

daab112a-785d-11ee-939d-92fbcf53809c.png

當Com接收到一個PDU時,它會根據配置選擇是將PDU緩存起來還是直接調用應用程序提供的回調函數。如果選擇了緩存,那么PDU將被緩存起來,并等待應用程序調用Com_ReceiveSignal或Com_ReceiveSignalGroup函數時進行處理;如果選擇了直接調用回調函數,則會將PDU的數據傳遞給應用程序提供的回調函數進行處理。

dab68398-785d-11ee-939d-92fbcf53809c.png

dac20754-785d-11ee-939d-92fbcf53809c.png

Com_CacheOrCallRxDeferredCbkFctPtr,用于緩存或調用接收到PDU時的回調函數。

當Com接收到一個PDU時,它會根據配置選擇是將PDU緩存起來還是直接調用應用程序提供的回調函數。如果選擇了緩存,那么回調函數的索引將被緩存起來,并等待應用程序調用Com_ReceiveSignal或Com_ReceiveSignalGroup函數時進行處理;如果選擇了直接調用回調函數,則會將PDU的數據傳遞給應用程序提供的回調函數進行處理。

dadd7b4c-785d-11ee-939d-92fbcf53809c.png

daf64e10-785d-11ee-939d-92fbcf53809c.png

對比兩種回調:

ComRxPduCallout的觸發順序可以按照接收到PDU的順序進行,因為在處理每個PDU時,COM模塊都會等待應用程序返回處理狀態,然后再繼續處理下一個PDU。因此,如果應用程序處理PDU的順序與PDU到達的順序相同,則ComRxPduCallout的回調也會按照PDU到達的順序進行。

ComNotification是一種機制,允許應用程序在數據更新事件發生時執行自定義邏輯,并不要求應用程序返回狀態值。當COM模塊檢測到數據更新事件時,它會對與更新事件相關聯的數據對象注冊的ComNotification進行回調,并將相關的數據對象ID作為參數傳遞給應用程序。ComNotification的觸發順序不能按照接收到PDU的順序進行,因為在數據更新事件發生時,COM模塊無法確定哪些數據對象會發生更新以及它們的更新順序。

舉例:

假設有兩個節點A和B,它們之間通過CAN總線進行通信。節點A向節點B發送兩個數據對象1和2。首先,節點A發送數據對象1,然后發送數據對象2,節點B按照接收到PDU的順序先接收到了數據對象1,然后接收到了數據對象2。此時,如果節點B上的應用程序使用ComRxPduCallout來處理PDU,并且在處理PDU時需要訪問其他節點發送的數據對象,那么ComRxPduCallout的回調順序將按照節點發送的順序進行。因此,節點B上的應用程序將按照1->2的順序處理PDU,并且可以在處理PDU時訪問先收到的數據對象1。

相反,如果節點B上的應用程序使用ComNotification來處理數據更新事件,并且在處理數據更新事件時需要訪問其他節點發送的數據對象,那么ComNotification不一定按照節點發送順序執行。例如,如果數據對象1和2之間存在依賴關系,并且在數據對象2更新前,數據對象1也會發生更新,那么節點2上的應用程序可能會在接收到數據對象2更新事件前先接收到數據對象1的更新事件。因此,節點B上的應用程序不能保證按照節點發送順序執行,因為更新事件的順序可能與節點發送順序不同。

ComNotification的接收對象的依存關系是通過ComSignal的更新順序來判斷的。在標準的AUTOSAR架構中,ComSignal是一個最小的數據單元,用于在不同的ECU之間傳輸數據。ComSignal可以表示為一個信號,例如車速、轉速等。ComSignal可以在ECU之間交換,也可以在ECU內部使用。每個ComSignal都可以擁有一個或多個ComSignalGroup,其中每個ComSignalGroup包含一組相關的ComSignal。這些ComSignal可以具有不同的數據類型、精度、單位和值范圍。ComSignalGroup可以在ECU之間交換,也可以在ECU內部使用。

當一個ComSignal或ComSignalGroup的值發生變化時,ComNotification會將更新事件通知給所有已注冊該ComSignal或ComSignalGroup的應用程序。應用程序可以在接收到更新事件時執行自定義邏輯。

ComNotification的接收對象的依存關系是基于ComSignal的更新順序來判斷的。如果多個ComSignal的更新順序存在依賴關系,那么它們的接收對象之間也會存在依賴關系。例如,如果一個ComSignal的更新依賴于另一個ComSignal的更新,那么它們的接收對象之間也會存在依賴關系。在這種情況下,應用程序需要確保在接收到依賴的ComSignal的更新事件后再處理當前ComSignal的更新事件,以避免使用不一致的數據。

總之,ComNotification的接收對象的依存關系是基于ComSignal的更新順序來判斷的。如果多個ComSignal的更新順序存在依賴關系,那么它們的接收對象之間也會存在依賴關系。應用程序需要確保在接收到依賴的ComSignal的更新事件后再處理當前ComSignal的更新事件,以避免使用不一致的數據。







審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 接收機
    +關注

    關注

    8

    文章

    1136

    瀏覽量

    52818
  • AUTOSAR
    +關注

    關注

    9

    文章

    333

    瀏覽量

    21268
  • CAN控制器
    +關注

    關注

    3

    文章

    74

    瀏覽量

    14943
  • 回調函數
    +關注

    關注

    0

    文章

    87

    瀏覽量

    11478

原文標題:AUTOSAR中CAN信號是如何觸發COM回調的

文章出處:【微信號:汽車電子嵌入式,微信公眾號:汽車電子嵌入式】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    GUI調函數

    GUI調函數在哪里編寫?
    發表于 03-21 12:37

    如何使用iMatrix平臺中列表標簽(gridjqGrid)調方法

    調事件:列表字段可設置,點擊事件、下拉框切換事件、雙擊事件、失去焦點事件,這些事件在【系統元數據管理】à【列表管理】à字段信息,編輯時觸發
    發表于 04-23 15:16

    STemWin中用到很多回調函數,這些調函數是什么時候被觸發的?

    STemWin中用到很多回調函數,函數內的case分支有初始化對話框,窗口重繪,和屏幕動作信息等這些調函數是什么時候被觸發的?
    發表于 03-22 17:35

    淺析調函數

    調用于層間協作,上層將本層函數安裝在下層,這個函數就是調,而下層在一定條件下觸發調,例如作為一個驅動,是一個底層,他在收到一個數據時,
    發表于 08-06 06:10

    請問LWIP調函數如何傳遞參數?

    問題是“注冊調函數”的“注冊”怎么理解?從實驗現象來看,似乎只要以太網收到了有效數據就會觸發調
    發表于 03-27 04:35

    怎么通過rt_device_t判斷是哪個串口觸發調函數

    當有多個串口共同注冊一個調函數,怎么通過rt_device_t判斷是那個串口觸發調函數?想使用rt_device_t里面的user_d
    發表于 11-14 14:44

    在哪里可以找到CAN驅動程序的演示Autosar代碼

    我想獲得STM32F4VET6CAN驅動程序的演示Autosar代碼?在哪里可以找到
    發表于 12-13 08:10

    CAN總線使用擴展ID觸發FIFO調怎么解決

    我正在為我的 CAN 總線使用擴展 ID。我想過濾 ID 0x12。當我收到包含 ID 0x12 的擴展 ID 幀時,我的代碼運行良好。如果收到的 ID 不是 0x12,則不會觸發 FIFO
    發表于 12-13 08:30

    CAN發送和串口發送是不是不能放在定時器的調函數?

    大家好!如果想用CAN或串口25ms的間隔往外發送一條信息,該怎么做?我嘗試把發送語句放到定時器的調函數,程序可以編譯,但是運行時會報
    發表于 02-10 14:38

    怎么通過rt_device_t判斷是那個串口觸發調函數?

    當有多個串口共同注冊一個調函數,怎么通過rt_device_t判斷是那個串口觸發調函數?想使用rt_device_t里面的user_d
    發表于 02-21 11:22

    如何檢測由未知CAN ID觸發的中斷信號?

    我們面臨著總線上 CAN 信號的問題。 flex can0已知有60個CAN ID,所以我們使用了60個郵箱ID。 這 60 個郵箱中斷
    發表于 05-09 13:52

    在哪里可以找到在s32k配置調函數的例子?

    嗨社區我需要測量 ptd0、pte11、ptd1 的頻率,然后我嘗試配置所有通道 iam 配置一個通道,但我配置了輸入,它必須調用回調函數它沒有調用任何調函數我去了 ic_pal 示例 int該示例不會調用回
    發表于 06-08 07:35

    AUTOSAR CAN時鐘同步問題

    請問有沒有AUTOSAR CAN時鐘同步的能運行的代碼,或者有沒有能做這一塊的大佬,主要是CanTsyn和STBM這兩個模塊的。有償,價格都好商量,急需。
    發表于 11-09 00:00

    AUTOSAR CAN網絡管理協議

    AUTOSAR_SWS_CANNetworkManagement AUTOSAR CAN網絡管理協議,4.4.0版本
    發表于 08-01 11:09 ?15次下載

    一文解析AUTOSAR CAN網絡管理

    AUTOSAR CAN 網絡管理是一個獨立于硬件的協議,只能在 CAN 上使用。它的主要目的是協調網絡的正常運行和總線休眠模式之間的轉換。
    的頭像 發表于 09-09 10:32 ?3349次閱讀
    一文解析<b class='flag-5'>AUTOSAR</b> <b class='flag-5'>CAN</b>網絡管理
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>