關(guān)于阻塞函數(shù)和非阻塞函數(shù)
在CAN和LIN相關(guān)的開發(fā)庫里,不可避免的會(huì)出現(xiàn)“收”和“發(fā)”的函數(shù)。如何快速有效的處理數(shù)據(jù),是開發(fā)中重要的事項(xiàng)。但實(shí)際上單路CAN由于波特率的限制,數(shù)據(jù)量并不會(huì)很大:以常用的500k為例,如果按照總線負(fù)載率為30%左右,那么需要在1ms處理1~2次數(shù)據(jù)即可。相比之下常用的以太網(wǎng)一般都要在100M的速率以上了。
因?yàn)橄到y(tǒng)的底層,例如WINDOWS,在處理文件、串口等使用的是同樣的函數(shù),所以CAN、LIN處理起來可以運(yùn)用這些相關(guān)的經(jīng)驗(yàn)。回歸到正題,讀寫函數(shù)可以分為阻塞函數(shù)和非阻塞函數(shù)兩種,它們處理起來的方式是不一樣的。
阻塞函數(shù)(blocking):在執(zhí)行時(shí)會(huì)阻塞當(dāng)前線程,通常會(huì)有一個(gè)超時(shí)時(shí)間。
非阻塞函數(shù)(non-blocking):不會(huì)阻塞當(dāng)前線程,直接返回結(jié)果,通常會(huì)有一個(gè)對(duì)應(yīng)的緩存。
讓我們舉兩個(gè)例子說明:
在UDS的API中獲取ECU返回的數(shù)據(jù)采用阻塞函數(shù)。例如,我們?cè)谟?7服務(wù)獲取seed,如果我們沒有成功獲取seed,那么接下來的步驟也無法進(jìn)行下去。所以阻塞函數(shù)會(huì)迫使我們?nèi)サ却Y(jié)果;如果執(zhí)行失敗,需要做錯(cuò)誤處理,例如重新嘗試進(jìn)行獲取。
如果阻塞函數(shù)的超時(shí)時(shí)間設(shè)置為0,就會(huì)和非阻塞函數(shù)類似(有些阻塞函數(shù)超時(shí)時(shí)間為0,可能意味著永遠(yuǎn)也讀不到數(shù)據(jù)了,因?yàn)樗鼈兛偸窍胍x取來自“未來”的內(nèi)容)。
在底層的basic API中,CAN的接收采用了非阻塞函數(shù),設(shè)備將把讀到的數(shù)據(jù)放到緩存里,而函數(shù)將從緩存里讀取數(shù)據(jù)。如果緩存里沒有數(shù)據(jù),函數(shù)會(huì)立刻返回?zé)o數(shù)據(jù),而不會(huì)等待“不確定的”下一個(gè)數(shù)據(jù)。也就是說無論何種情況,函數(shù)都會(huì)立刻返回結(jié)果。
在我們處理CAN數(shù)據(jù)時(shí),可以周期性(例如20ms)讀取數(shù)據(jù),讀到無數(shù)據(jù)之后,做其它的事情,例如通過dbc獲取信號(hào)值并顯示。函數(shù)不會(huì)等待20ms直到新的CAN幀出現(xiàn)在總線上,也防止了丟幀的情況。因?yàn)槠胀ǖ腃AN通信,我們無法在程序?qū)用媾袛嗪螘r(shí)會(huì)接收到新的數(shù)據(jù)。
另外,有時(shí)我們也會(huì)想要保證數(shù)據(jù)是“新的”,而不是躺在緩存里不知道多久之前的內(nèi)容,那么在讀取數(shù)據(jù)前先清空緩存會(huì)是一個(gè)不錯(cuò)的選擇。
END
虹科車輛網(wǎng)絡(luò)
虹科車輛網(wǎng)絡(luò)事業(yè)部在汽車總線行業(yè)經(jīng)驗(yàn)超過10年,與世界知名的CAN、LIN總線供應(yīng)商PEAK-System、Lipowsky、IHR等合作10年之久,提供領(lǐng)域內(nèi)頂尖水平的CAN/LIN分析儀和測(cè)試方案,同時(shí)也提供汽車以太網(wǎng),時(shí)間敏感網(wǎng)絡(luò)(TSN)的仿真測(cè)試工具和方案。虹科自主研發(fā)的EOL測(cè)試軟硬件系統(tǒng)已經(jīng)在業(yè)內(nèi)完成多次安裝和測(cè)試,事業(yè)部所有成員都受過國(guó)內(nèi)外專業(yè)培訓(xùn),并獲得專業(yè)資格認(rèn)證,工程師平均5年+技術(shù)經(jīng)驗(yàn)和水平,一致贏得客戶極好口碑。虹科車輛網(wǎng)絡(luò)事業(yè)部致力于為您提供最專業(yè)的服務(wù)。
聲明:本文內(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)投訴
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4346瀏覽量
62968
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
socket編程中的阻塞與非阻塞
在網(wǎng)絡(luò)編程中, socket 是一個(gè)非常重要的概念,它提供了一個(gè)抽象層,使得開發(fā)者可以不必關(guān)心底層的網(wǎng)絡(luò)通信細(xì)節(jié)。 socket 編程中的阻塞與非阻塞模式是兩種不同的操作方式,它們對(duì)程序的響應(yīng)性
SUMIF函數(shù)與SUMIFS函數(shù)的區(qū)別
SUMIF函數(shù)和SUMIFS函數(shù)都是Excel中用于條件求和的函數(shù),它們可以幫助用戶根據(jù)特定的條件對(duì)數(shù)據(jù)進(jìn)行求和。盡管它們的基本功能相似,但在使用場(chǎng)景和功能上存在一些差異。以下是對(duì)這兩個(gè)函數(shù)
Verilog HDL的基礎(chǔ)知識(shí)
本文繼續(xù)介紹Verilog HDL基礎(chǔ)知識(shí),重點(diǎn)介紹賦值語句、阻塞與非阻塞、循環(huán)語句、同步與異步、函數(shù)與任務(wù)語法知識(shí)。
socket阻塞和非阻塞的區(qū)別是什么
在計(jì)算機(jī)編程中,socket 是一種通信端點(diǎn),用于在網(wǎng)絡(luò)中進(jìn)行數(shù)據(jù)傳輸。Socket 可以是阻塞的或非阻塞的,這兩種模式在處理數(shù)據(jù)傳輸時(shí)有不同的行為。 阻塞模式(Blocking Mo
求助,關(guān)于CyU3PUsbHostEpWaitForCompletion函數(shù)中的阻塞問題求解
(非主線程)調(diào)用該函數(shù)時(shí),CyU3PUsbHostEpWaitForCompletion 函數(shù)經(jīng)常阻塞,雖然指定了超時(shí)值,但從未返回。
我想應(yīng)該在主程序線程中調(diào)用該
發(fā)表于 07-23 07:57
如何在espconn_gethostbyname上創(chuàng)建阻塞線程?
在 espconn_gethostbyname 上創(chuàng)建阻塞線程
發(fā)表于 07-10 07:45
請(qǐng)問IDF里TCP的recv()函數(shù)阻塞時(shí)會(huì)不會(huì)釋放CPU引起任務(wù)切換?
如果不會(huì),那我在recv()阻塞時(shí)想讓其他任務(wù)也可以執(zhí)行是不是只能把有recv的這個(gè)任務(wù)優(yōu)先級(jí)調(diào)低?
發(fā)表于 06-25 08:24
請(qǐng)問怎們?cè)O(shè)置socket套接字的rec函數(shù)的阻塞時(shí)間?
請(qǐng)問怎們?cè)O(shè)置socket套接字的rec函數(shù)的阻塞時(shí)間?
發(fā)表于 06-24 06:14
請(qǐng)問使用lwip創(chuàng)建socket,該如何做到非阻塞的接收發(fā)送數(shù)據(jù)?
請(qǐng)問使用lwip創(chuàng)建socket,該如何做到非阻塞的接收發(fā)送數(shù)據(jù)?
發(fā)表于 06-19 06:02
如何讓write行為具有阻塞特性?
spp_vfs_write 與 PC 端 socket 溝通:esp32 write, PC read.若 PC 端不執(zhí)行 read 行為,esp32 持續(xù) spp_vfs_write ,數(shù)據(jù)會(huì)發(fā)送到 PC 端嗎?還是在 esp32 設(shè)備端 ?謝謝。另如何讓 write 行為具有阻塞特性?謝謝。
發(fā)表于 06-11 07:23
測(cè)試ESP-IDF ESP32C6,創(chuàng)建線程調(diào)用recvform接收數(shù)據(jù)發(fā)現(xiàn)一直被阻塞,如何解決?
沒問題的,但是創(chuàng)建線程調(diào)用recvform接收數(shù)據(jù)發(fā)現(xiàn)一直被阻塞,現(xiàn)在懷疑是wifi event的回調(diào)函數(shù)占用了CPU導(dǎo)致接收線程被阻塞了。請(qǐng)問有什么比較好的解決方法嗎?
發(fā)表于 06-05 08:22
函數(shù)指針與回調(diào)函數(shù)的應(yīng)用實(shí)例
通常我們說的指針變量是指向一個(gè)整型、字符型或數(shù)組等變量,而函數(shù)指針是指向函數(shù)。
函數(shù)指針可以像一般函數(shù)一樣,用于調(diào)用函數(shù)、傳遞參數(shù)。
如何在8051單片機(jī)上編程一個(gè)阻塞延遲函數(shù)?
術(shù)語阻塞意味著微控制器的主代碼在整個(gè)延遲期間被阻塞(什么都不做)。對(duì)于小的延遲和簡(jiǎn)單的問題,這通常是可以接受的,但可能導(dǎo)致不可接受的操作。
發(fā)表于 02-29 11:48
?858次閱讀
verilog同步和異步的區(qū)別 verilog阻塞賦值和非阻塞賦值的區(qū)別
Verilog是一種硬件描述語言,用于設(shè)計(jì)和模擬數(shù)字電路。在Verilog中,同步和異步是用來描述數(shù)據(jù)傳輸和信號(hào)處理的兩種不同方式,而阻塞賦值和非阻塞賦值是兩種不同的賦值方式。本文將詳細(xì)解釋
評(píng)論