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

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

3天內不再提示

虹科分享|關于阻塞函數(shù)和非阻塞函數(shù)

虹科汽車電子 ? 2022-07-05 14:38 ? 次閱讀

關于阻塞函數(shù)和非阻塞函數(shù)

CAN和LIN相關的開發(fā)庫里,不可避免的會出現(xiàn)“收”和“發(fā)”的函數(shù)。如何快速有效的處理數(shù)據(jù),是開發(fā)中重要的事項。但實際上單路CAN由于波特率的限制,數(shù)據(jù)量并不會很大:以常用的500k為例,如果按照總線負載率為30%左右,那么需要在1ms處理1~2次數(shù)據(jù)即可。相比之下常用的以太網(wǎng)一般都要在100M的速率以上了。


c9d32c48-f95b-11ec-a2f4-dac502259ad0.png

因為系統(tǒng)的底層,例如WINDOWS,在處理文件、串口等使用的是同樣的函數(shù),所以CAN、LIN處理起來可以運用這些相關的經(jīng)驗。回歸到正題,讀寫函數(shù)可以分為阻塞函數(shù)和非阻塞函數(shù)兩種,它們處理起來的方式是不一樣的。

阻塞函數(shù)(blocking):在執(zhí)行時會阻塞當前線程,通常會有一個超時時間。

非阻塞函數(shù)(non-blocking):不會阻塞當前線程,直接返回結果,通常會有一個對應的緩存。

讓我們舉兩個例子說明:

在UDS的API中獲取ECU返回的數(shù)據(jù)采用阻塞函數(shù)。例如,我們在用27服務獲取seed,如果我們沒有成功獲取seed,那么接下來的步驟也無法進行下去。所以阻塞函數(shù)會迫使我們去等待結果;如果執(zhí)行失敗,需要做錯誤處理,例如重新嘗試進行獲取。

如果阻塞函數(shù)的超時時間設置為0,就會和非阻塞函數(shù)類似(有些阻塞函數(shù)超時時間為0,可能意味著永遠也讀不到數(shù)據(jù)了,因為它們總是想要讀取來自“未來”的內容)。

在底層的basic API中,CAN的接收采用了非阻塞函數(shù),設備將把讀到的數(shù)據(jù)放到緩存里,而函數(shù)將從緩存里讀取數(shù)據(jù)。如果緩存里沒有數(shù)據(jù),函數(shù)會立刻返回無數(shù)據(jù),而不會等待“不確定的”下一個數(shù)據(jù)。也就是說無論何種情況,函數(shù)都會立刻返回結果。

在我們處理CAN數(shù)據(jù)時,可以周期性(例如20ms)讀取數(shù)據(jù),讀到無數(shù)據(jù)之后,做其它的事情,例如通過dbc獲取信號值并顯示。函數(shù)不會等待20ms直到新的CAN幀出現(xiàn)在總線上,也防止了丟幀的情況。因為普通的CAN通信,我們無法在程序層面判斷何時會接收到新的數(shù)據(jù)。

另外,有時我們也會想要保證數(shù)據(jù)是“新的”,而不是躺在緩存里不知道多久之前的內容,那么在讀取數(shù)據(jù)前先清空緩存會是一個不錯的選擇。

END

虹科車輛網(wǎng)絡

虹科車輛網(wǎng)絡事業(yè)部在汽車總線行業(yè)經(jīng)驗超過10年,與世界知名的CAN、LIN總線供應商PEAK-System、Lipowsky、IHR等合作10年之久,提供領域內頂尖水平的CAN/LIN分析儀和測試方案,同時也提供汽車以太網(wǎng),時間敏感網(wǎng)絡(TSN)的仿真測試工具和方案。虹科自主研發(fā)的EOL測試軟硬件系統(tǒng)已經(jīng)在業(yè)內完成多次安裝和測試,事業(yè)部所有成員都受過國內外專業(yè)培訓,并獲得專業(yè)資格認證,工程師平均5年+技術經(jīng)驗和水平,一致贏得客戶極好口碑。虹科車輛網(wǎng)絡事業(yè)部致力于為您提供最專業(yè)的服務。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 函數(shù)
    +關注

    關注

    3

    文章

    4277

    瀏覽量

    62323
收藏 人收藏

    評論

    相關推薦

    socket編程中的阻塞阻塞

    在網(wǎng)絡編程中, socket 是一個非常重要的概念,它提供了一個抽象層,使得開發(fā)者可以不必關心底層的網(wǎng)絡通信細節(jié)。 socket 編程中的阻塞阻塞模式是兩種不同的操作方式,它們對程序的響應性
    的頭像 發(fā)表于 11-01 16:13 ?101次閱讀

    Verilog HDL的基礎知識

    本文繼續(xù)介紹Verilog HDL基礎知識,重點介紹賦值語句、阻塞阻塞、循環(huán)語句、同步與異步、函數(shù)與任務語法知識。
    的頭像 發(fā)表于 10-24 15:00 ?138次閱讀
    Verilog HDL的基礎知識

    socket阻塞阻塞的區(qū)別是什么

    在計算機編程中,socket 是一種通信端點,用于在網(wǎng)絡中進行數(shù)據(jù)傳輸。Socket 可以是阻塞的或阻塞的,這兩種模式在處理數(shù)據(jù)傳輸時有不同的行為。 阻塞模式(Blocking Mo
    的頭像 發(fā)表于 08-16 11:13 ?534次閱讀

    求助,關于CyU3PUsbHostEpWaitForCompletion函數(shù)中的阻塞問題求解

    主線程)調用該函數(shù)時,CyU3PUsbHostEpWaitForCompletion 函數(shù)經(jīng)常阻塞,雖然指定了超時值,但從未返回。 我想應該在主程序線程中調用該
    發(fā)表于 07-23 07:57

    請問IDF里TCP的recv()函數(shù)阻塞時會不會釋放CPU引起任務切換?

    如果不會,那我在recv()阻塞時想讓其他任務也可以執(zhí)行是不是只能把有recv的這個任務優(yōu)先級調低?
    發(fā)表于 06-25 08:24

    請問怎們設置socket套接字的rec函數(shù)阻塞時間?

    請問怎們設置socket套接字的rec函數(shù)阻塞時間?
    發(fā)表于 06-24 06:14

    請問使用lwip創(chuàng)建socket,該如何做到阻塞的接收發(fā)送數(shù)據(jù)?

    請問使用lwip創(chuàng)建socket,該如何做到阻塞的接收發(fā)送數(shù)據(jù)?
    發(fā)表于 06-19 06:02

    什么是阻塞阻塞?

    什么是阻塞阻塞?我們就用管道的讀寫來舉例子。
    的頭像 發(fā)表于 03-25 10:04 ?448次閱讀

    如何在8051單片機上編程一個阻塞延遲函數(shù)?

    術語阻塞意味著微控制器的主代碼在整個延遲期間被阻塞(什么都不做)。對于小的延遲和簡單的問題,這通常是可以接受的,但可能導致不可接受的操作。
    發(fā)表于 02-29 11:48 ?685次閱讀

    verilog同步和異步的區(qū)別 verilog阻塞賦值和阻塞賦值的區(qū)別

    Verilog是一種硬件描述語言,用于設計和模擬數(shù)字電路。在Verilog中,同步和異步是用來描述數(shù)據(jù)傳輸和信號處理的兩種不同方式,而阻塞賦值和阻塞賦值是兩種不同的賦值方式。本文將詳細解釋
    的頭像 發(fā)表于 02-22 15:33 ?1433次閱讀

    isnan函數(shù)的使用方法

    isnan函數(shù)是一種用于檢查特定值是否為“數(shù)字”的函數(shù)。在Python中,該函數(shù)屬于math模塊,并提供了一種簡單的方法來區(qū)分數(shù)字和數(shù)字
    的頭像 發(fā)表于 11-30 16:24 ?2859次閱讀

    什么事件會使執(zhí)行變成阻塞

    執(zhí)行阻塞是指當一個進程無法繼續(xù)執(zhí)行時被掛起的狀態(tài)。這可以由多種事件引起,下面詳細介紹了一些常見的情況: I/O操作阻塞:在進行文件讀寫、網(wǎng)絡通信、數(shù)據(jù)庫訪問等I/O操作時,如果所需的數(shù)據(jù)還沒有
    的頭像 發(fā)表于 11-17 14:08 ?845次閱讀

    運行狀態(tài)變?yōu)?b class='flag-5'>阻塞狀態(tài)的條件

    在計算機科學中,阻塞是指當一個進程(或線程)由于等待某種外部事件的發(fā)生,無法繼續(xù)執(zhí)行的狀態(tài)。阻塞可能會在不同的情況下發(fā)生,例如等待用戶輸入、等待數(shù)據(jù)從網(wǎng)絡到達、等待磁盤讀寫完成等等。本文將詳細探討
    的頭像 發(fā)表于 11-17 11:45 ?1578次閱讀

    阻塞態(tài)可以直接到運行態(tài)嗎

    阻塞態(tài)即是指進程或線程在等待某種事件或資源時暫時停止執(zhí)行的狀態(tài)。在計算機系統(tǒng)中,由于各種原因,進程或線程可能會進入阻塞態(tài),等待著能夠繼續(xù)執(zhí)行的條件成熟。 在絕大多數(shù)情況下,阻塞態(tài)到運行態(tài)并不是直接
    的頭像 發(fā)表于 11-17 11:43 ?2227次閱讀

    阻塞狀態(tài)和等待狀態(tài)的區(qū)別

    阻塞狀態(tài)和等待狀態(tài)是計算機領域中常用的術語,用來描述進程或線程的狀態(tài)。盡管這兩個狀態(tài)在表面上有些相似,但它們有著本質上的區(qū)別。本文將詳盡、詳實、細致地討論阻塞狀態(tài)和等待狀態(tài)之間的區(qū)別,包括定義
    的頭像 發(fā)表于 11-17 11:33 ?3544次閱讀