0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

AUTOSAR中CAN信號(hào)是如何觸發(fā)COM回調(diào)的呢?

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

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

CAN驅(qū)動(dòng)中,回調(diào)函數(shù)通常是通過中斷或輪詢的方式觸發(fā)的。當(dāng)CAN控制器接收或發(fā)送CAN數(shù)據(jù)幀時(shí),CAN控制器會(huì)產(chǎn)生相應(yīng)的中斷或狀態(tài)變化,在中斷服務(wù)例程(ISR)中或輪詢循環(huán)中,CAN驅(qū)動(dòng)會(huì)調(diào)用相應(yīng)的回調(diào)函數(shù)來處理這些CAN事件。

第一種回調(diào),可以按照收到信號(hào)的順序觸發(fā)COM層的回調(diào),因?yàn)槭盏降男盘?hào)會(huì)存在fifo里,這就可以按照順序觸發(fā)。

先說結(jié)論:當(dāng)Can_MainFunction_Read 處理接收到的消息時(shí),CanIf層將調(diào)用PduR層的PduR_CanIfRxIndication 函數(shù)。然后,PduR層將該消息路由到COM層,并調(diào)用Com_RxIndication 函數(shù)。最后,當(dāng)COM層處理接收到的消息時(shí),它將觸發(fā)配置的回調(diào)函數(shù)。

為了在接收到CAN消息時(shí)觸發(fā)COM層的回調(diào),需要遵循以下步驟:

配置CanIf層:確保在CanIf層為接收到的CAN消息配置了相應(yīng)的CanIfRxPdu。這包括為其指定一個(gè)PduId,并將其與期望的CAN ID 和數(shù)據(jù)長(zhǎng)度相關(guān)聯(lián)。

配置PduR層:在PduR層,創(chuàng)建一個(gè)路由從CanIf層到Com層。這可以通過在PduR中定義PduRRoutingPath并關(guān)聯(lián)CanIf的PduId 和Com層的PduId 來實(shí)現(xiàn)。

配置COM層:在COM層,為接收到的CAN消息定義一個(gè)接收IPDU,并指定一個(gè)回調(diào)函數(shù)。這個(gè)回調(diào)函數(shù)將在接收到新消息時(shí)被調(diào)用。通常,回調(diào)函數(shù)在接收到消息后會(huì)對(duì)其進(jìn)行處理,例如將數(shù)據(jù)傳輸?shù)綉?yīng)用程序。

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

這種回調(diào)是通過COM收到CAN的PduID,遍歷一個(gè)數(shù)組,之后根據(jù)返回的數(shù)字idx再去遍歷回調(diào)數(shù)組,根據(jù)idx來判斷要執(zhí)行哪個(gè)回調(diào),這個(gè)函數(shù)的執(zhí)行是在 Com_RxIndication 里執(zhí)行的。

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

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

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

也就是調(diào)用的是下面這兩個(gè)函數(shù),注意根據(jù)配置要區(qū)分Basic CAN和Full CAN;

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

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

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

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

在這個(gè)過程中,當(dāng)CAN控制器接收到一個(gè)CAN數(shù)據(jù)幀時(shí),CAN控制器會(huì)將CAN數(shù)據(jù)幀存儲(chǔ)在FIFO Buffer中。Basic CAN模塊在輪詢CAN控制器的接收緩沖區(qū)時(shí),會(huì)從FIFO Buffer中讀取CAN數(shù)據(jù)幀,并將CAN數(shù)據(jù)幀中的信號(hào)解析出來。解析后的信號(hào)將被傳遞到CanIf模塊中,以便上層模塊進(jìn)行處理。

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

將接收到的CAN數(shù)據(jù)幀解析的信號(hào)傳遞到CanIf模塊;

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

之后將數(shù)據(jù)在傳到PDUR,之后在傳到COM。

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

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

第二種回調(diào),ComNotification是一個(gè)接口,用于通知上層模塊有新的數(shù)據(jù)到達(dá)或數(shù)據(jù)發(fā)送完成。

在代碼中可以是通過一個(gè)TASK來循環(huán)執(zhí)行 Com_MainFunctionRx 這個(gè)任務(wù),Com_MainFunctionRx是一個(gè)COM模塊的主任務(wù)函數(shù),用于處理接收到的數(shù)據(jù)。當(dāng)Com_MainFunctionRx函數(shù)接收到數(shù)據(jù)后,可以通過調(diào)用ComNotification來觸發(fā)通知事件,通知上層應(yīng)用程序進(jìn)行處理。

當(dāng)數(shù)據(jù)更新時(shí),COM層會(huì)檢查所有與該數(shù)據(jù)相關(guān)聯(lián)的ComNotification,并將其標(biāo)記為“待觸發(fā)”。然后,COM層會(huì)在稍后的時(shí)間點(diǎn)觸發(fā)已標(biāo)記為“待觸發(fā)”的ComNotification,并將相關(guān)的數(shù)據(jù)對(duì)象ID作為參數(shù)傳遞給應(yīng)用程序。

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

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

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

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

假設(shè)收到的是信號(hào)組,遍歷所有COM收到的信號(hào)組,如果信號(hào)組的數(shù)據(jù)完整,就觸發(fā)ComNotification的,進(jìn)入到下一個(gè)處理。

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

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

當(dāng)Com接收到一個(gè)PDU時(shí),它會(huì)根據(jù)配置選擇是將PDU緩存起來還是直接調(diào)用應(yīng)用程序提供的回調(diào)函數(shù)。如果選擇了緩存,那么PDU將被緩存起來,并等待應(yīng)用程序調(diào)用Com_ReceiveSignal或Com_ReceiveSignalGroup函數(shù)時(shí)進(jìn)行處理;如果選擇了直接調(diào)用回調(diào)函數(shù),則會(huì)將PDU的數(shù)據(jù)傳遞給應(yīng)用程序提供的回調(diào)函數(shù)進(jìn)行處理。

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

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

Com_CacheOrCallRxDeferredCbkFctPtr,用于緩存或調(diào)用接收到PDU時(shí)的回調(diào)函數(shù)。

當(dāng)Com接收到一個(gè)PDU時(shí),它會(huì)根據(jù)配置選擇是將PDU緩存起來還是直接調(diào)用應(yīng)用程序提供的回調(diào)函數(shù)。如果選擇了緩存,那么回調(diào)函數(shù)的索引將被緩存起來,并等待應(yīng)用程序調(diào)用Com_ReceiveSignal或Com_ReceiveSignalGroup函數(shù)時(shí)進(jìn)行處理;如果選擇了直接調(diào)用回調(diào)函數(shù),則會(huì)將PDU的數(shù)據(jù)傳遞給應(yīng)用程序提供的回調(diào)函數(shù)進(jìn)行處理。

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

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

對(duì)比兩種回調(diào):

ComRxPduCallout的觸發(fā)順序可以按照接收到PDU的順序進(jìn)行,因?yàn)樵?strong>處理每個(gè)PDU時(shí),COM模塊都會(huì)等待應(yīng)用程序返回處理狀態(tài),然后再繼續(xù)處理下一個(gè)PDU。因此,如果應(yīng)用程序處理PDU的順序與PDU到達(dá)的順序相同,則ComRxPduCallout的回調(diào)也會(huì)按照PDU到達(dá)的順序進(jìn)行。

ComNotification是一種機(jī)制,允許應(yīng)用程序在數(shù)據(jù)更新事件發(fā)生時(shí)執(zhí)行自定義邏輯,并不要求應(yīng)用程序返回狀態(tài)值。當(dāng)COM模塊檢測(cè)到數(shù)據(jù)更新事件時(shí),它會(huì)對(duì)與更新事件相關(guān)聯(lián)的數(shù)據(jù)對(duì)象注冊(cè)的ComNotification進(jìn)行回調(diào),并將相關(guān)的數(shù)據(jù)對(duì)象ID作為參數(shù)傳遞給應(yīng)用程序。ComNotification的觸發(fā)順序不能按照接收到PDU的順序進(jìn)行,因?yàn)樵跀?shù)據(jù)更新事件發(fā)生時(shí),COM模塊無法確定哪些數(shù)據(jù)對(duì)象會(huì)發(fā)生更新以及它們的更新順序

舉例:

假設(shè)有兩個(gè)節(jié)點(diǎn)A和B,它們之間通過CAN總線進(jìn)行通信。節(jié)點(diǎn)A向節(jié)點(diǎn)B發(fā)送兩個(gè)數(shù)據(jù)對(duì)象1和2。首先,節(jié)點(diǎn)A發(fā)送數(shù)據(jù)對(duì)象1,然后發(fā)送數(shù)據(jù)對(duì)象2,節(jié)點(diǎn)B按照接收到PDU的順序先接收到了數(shù)據(jù)對(duì)象1,然后接收到了數(shù)據(jù)對(duì)象2。此時(shí),如果節(jié)點(diǎn)B上的應(yīng)用程序使用ComRxPduCallout來處理PDU,并且在處理PDU時(shí)需要訪問其他節(jié)點(diǎn)發(fā)送的數(shù)據(jù)對(duì)象,那么ComRxPduCallout的回調(diào)順序?qū)凑展?jié)點(diǎn)發(fā)送的順序進(jìn)行。因此,節(jié)點(diǎn)B上的應(yīng)用程序?qū)凑?->2的順序處理PDU,并且可以在處理PDU時(shí)訪問先收到的數(shù)據(jù)對(duì)象1。

相反,如果節(jié)點(diǎn)B上的應(yīng)用程序使用ComNotification來處理數(shù)據(jù)更新事件,并且在處理數(shù)據(jù)更新事件時(shí)需要訪問其他節(jié)點(diǎn)發(fā)送的數(shù)據(jù)對(duì)象,那么ComNotification不一定按照節(jié)點(diǎn)發(fā)送順序執(zhí)行。例如,如果數(shù)據(jù)對(duì)象1和2之間存在依賴關(guān)系,并且在數(shù)據(jù)對(duì)象2更新前,數(shù)據(jù)對(duì)象1也會(huì)發(fā)生更新,那么節(jié)點(diǎn)2上的應(yīng)用程序可能會(huì)在接收到數(shù)據(jù)對(duì)象2更新事件前先接收到數(shù)據(jù)對(duì)象1的更新事件。因此,節(jié)點(diǎn)B上的應(yīng)用程序不能保證按照節(jié)點(diǎn)發(fā)送順序執(zhí)行,因?yàn)楦率录捻樞蚩赡芘c節(jié)點(diǎn)發(fā)送順序不同。

ComNotification的接收對(duì)象的依存關(guān)系是通過ComSignal的更新順序來判斷的。在標(biāo)準(zhǔn)的AUTOSAR架構(gòu)中,ComSignal是一個(gè)最小的數(shù)據(jù)單元,用于在不同的ECU之間傳輸數(shù)據(jù)。ComSignal可以表示為一個(gè)信號(hào),例如車速、轉(zhuǎn)速等。ComSignal可以在ECU之間交換,也可以在ECU內(nèi)部使用。每個(gè)ComSignal都可以擁有一個(gè)或多個(gè)ComSignalGroup,其中每個(gè)ComSignalGroup包含一組相關(guān)的ComSignal。這些ComSignal可以具有不同的數(shù)據(jù)類型、精度、單位和值范圍。ComSignalGroup可以在ECU之間交換,也可以在ECU內(nèi)部使用。

當(dāng)一個(gè)ComSignal或ComSignalGroup的值發(fā)生變化時(shí),ComNotification會(huì)將更新事件通知給所有已注冊(cè)該ComSignal或ComSignalGroup的應(yīng)用程序。應(yīng)用程序可以在接收到更新事件時(shí)執(zhí)行自定義邏輯。

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

總之,ComNotification的接收對(duì)象的依存關(guān)系是基于ComSignal的更新順序來判斷的。如果多個(gè)ComSignal的更新順序存在依賴關(guān)系,那么它們的接收對(duì)象之間也會(huì)存在依賴關(guān)系。應(yīng)用程序需要確保在接收到依賴的ComSignal的更新事件后再處理當(dāng)前ComSignal的更新事件,以避免使用不一致的數(shù)據(jù)。







審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接收機(jī)
    +關(guān)注

    關(guān)注

    8

    文章

    1181

    瀏覽量

    53474
  • AUTOSAR
    +關(guān)注

    關(guān)注

    10

    文章

    362

    瀏覽量

    21583
  • CAN控制器
    +關(guān)注

    關(guān)注

    3

    文章

    74

    瀏覽量

    15035
  • 回調(diào)函數(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    87

    瀏覽量

    11562

原文標(biāo)題:AUTOSAR中CAN信號(hào)是如何觸發(fā)COM回調(diào)的

文章出處:【微信號(hào):汽車電子嵌入式,微信公眾號(hào):汽車電子嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STemWin中用到很多回調(diào)函數(shù),這些調(diào)函數(shù)是什么時(shí)候被觸發(fā)的?

    STemWin中用到很多回調(diào)函數(shù),函數(shù)內(nèi)的case分支有初始化對(duì)話框,窗口重繪,和屏幕動(dòng)作信息等這些調(diào)函數(shù)是什么時(shí)候被觸發(fā)的?
    發(fā)表于 03-22 17:35

    請(qǐng)問LWIP調(diào)函數(shù)如何傳遞參數(shù)?

    問題是“注冊(cè)調(diào)函數(shù)”的“注冊(cè)”怎么理解?從實(shí)驗(yàn)現(xiàn)象來看,似乎只要以太網(wǎng)收到了有效數(shù)據(jù)就會(huì)觸發(fā)調(diào)
    發(fā)表于 03-27 04:35

    怎么通過rt_device_t判斷是哪個(gè)串口觸發(fā)調(diào)函數(shù)

    當(dāng)有多個(gè)串口共同注冊(cè)一個(gè)調(diào)函數(shù),怎么通過rt_device_t判斷是那個(gè)串口觸發(fā)調(diào)函數(shù)?想使用rt_device_t里面的user_d
    發(fā)表于 11-14 14:44

    在哪里可以找到CAN驅(qū)動(dòng)程序的演示Autosar代碼

    我想獲得STM32F4VET6CAN驅(qū)動(dòng)程序的演示Autosar代碼?在哪里可以找到
    發(fā)表于 12-13 08:10

    CAN總線使用擴(kuò)展ID觸發(fā)FIFO調(diào)怎么解決

    我正在為我的 CAN 總線使用擴(kuò)展 ID。我想過濾 ID 0x12。當(dāng)我收到包含 ID 0x12 的擴(kuò)展 ID 幀時(shí),我的代碼運(yùn)行良好。如果收到的 ID 不是 0x12,則不會(huì)觸發(fā) FIFO
    發(fā)表于 12-13 08:30

    CAN發(fā)送和串口發(fā)送是不是不能放在定時(shí)器的調(diào)函數(shù)?

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

    怎么通過rt_device_t判斷是那個(gè)串口觸發(fā)調(diào)函數(shù)?

    當(dāng)有多個(gè)串口共同注冊(cè)一個(gè)調(diào)函數(shù),怎么通過rt_device_t判斷是那個(gè)串口觸發(fā)調(diào)函數(shù)?想使用rt_device_t里面的user_d
    發(fā)表于 02-21 11:22

    如何檢測(cè)由未知CAN ID觸發(fā)的中斷信號(hào)?

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

    AUTOSAR CAN時(shí)鐘同步問題

    請(qǐng)問有沒有AUTOSAR CAN時(shí)鐘同步的能運(yùn)行的代碼,或者有沒有能做這一塊的大佬,主要是CanTsyn和STBM這兩個(gè)模塊的。有償,價(jià)格都好商量,急需。
    發(fā)表于 11-09 00:00

    C語言函數(shù)的調(diào)函數(shù)

    來源:嵌入式客棧 1 什么是調(diào)函數(shù)?首先什么是調(diào)? 我的理解是:把一段可執(zhí)行的代碼像參數(shù)傳遞那樣傳給其他代碼,而這段代碼會(huì)在某個(gè)時(shí)刻被
    的頭像 發(fā)表于 09-11 09:57 ?4134次閱讀

    AUTOSAR CAN網(wǎng)絡(luò)管理協(xié)議

    AUTOSAR_SWS_CANNetworkManagement AUTOSAR CAN網(wǎng)絡(luò)管理協(xié)議,4.4.0版本
    發(fā)表于 08-01 11:09 ?16次下載

    根據(jù)調(diào)機(jī)制注冊(cè)事件并處理調(diào)VI

    通過事件調(diào)注冊(cè)函數(shù)(Register Event Callback)注冊(cè)一個(gè)調(diào)VI,在事件發(fā)生時(shí)會(huì)運(yùn)行該回調(diào)VI,通常用于注冊(cè)和處理.N
    的頭像 發(fā)表于 11-24 09:15 ?2295次閱讀

    labview事件調(diào)的使用

    介紹LabVIEW事件調(diào)的使用方法,可以用于處理執(zhí)行時(shí)間較長(zhǎng)的異步事件
    的頭像 發(fā)表于 08-24 16:38 ?4416次閱讀
    labview<b class='flag-5'>中</b>事件<b class='flag-5'>回</b><b class='flag-5'>調(diào)</b>的使用

    應(yīng)用筆記 | 淺談STM32庫里的調(diào)函數(shù)

    關(guān)鍵字:調(diào)函數(shù),HAL庫 ? 目錄預(yù)覽 1.調(diào)函數(shù) 2.STM32固件庫里的調(diào)函數(shù) 3.S
    的頭像 發(fā)表于 09-14 17:10 ?3669次閱讀
    應(yīng)用筆記 | 淺談STM32庫里的<b class='flag-5'>回</b><b class='flag-5'>調(diào)</b>函數(shù)

    AUTOSAR通信與CAN協(xié)議的關(guān)系

    的概念,允許應(yīng)用層組件(如軟件組件和ECU抽象層)通過定義良好的接口進(jìn)行通信。 1. 通信服務(wù): AUTOSAR提供了一系列通信服務(wù),包括復(fù)雜驅(qū)動(dòng)通信(COM)、網(wǎng)絡(luò)管理(NM)、診斷通信(DCM)和CAN通信(
    的頭像 發(fā)表于 12-17 14:57 ?184次閱讀