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

因為系統(tǒng)的底層,例如WINDOWS,在處理文件、串口等使用的是同樣的函數(shù),所以CAN、LIN處理起來可以運(yùn)用這些相關(guān)的經(jīng)驗。回歸到正題,讀寫函數(shù)可以分為阻塞函數(shù)和非阻塞函數(shù)兩種,它們處理起來的方式是不一樣的。
阻塞函數(shù)(blocking):在執(zhí)行時會阻塞當(dāng)前線程,通常會有一個超時時間。
非阻塞函數(shù)(non-blocking):不會阻塞當(dāng)前線程,直接返回結(jié)果,通常會有一個對應(yīng)的緩存。
讓我們舉兩個例子說明:
在UDS的API中獲取ECU返回的數(shù)據(jù)采用阻塞函數(shù)。例如,我們在用27服務(wù)獲取seed,如果我們沒有成功獲取seed,那么接下來的步驟也無法進(jìn)行下去。所以阻塞函數(shù)會迫使我們?nèi)サ却Y(jié)果;如果執(zhí)行失敗,需要做錯誤處理,例如重新嘗試進(jìn)行獲取。
如果阻塞函數(shù)的超時時間設(shè)置為0,就會和非阻塞函數(shù)類似(有些阻塞函數(shù)超時時間為0,可能意味著永遠(yuǎn)也讀不到數(shù)據(jù)了,因為它們總是想要讀取來自“未來”的內(nèi)容)。
在底層的basic API中,CAN的接收采用了非阻塞函數(shù),設(shè)備將把讀到的數(shù)據(jù)放到緩存里,而函數(shù)將從緩存里讀取數(shù)據(jù)。如果緩存里沒有數(shù)據(jù),函數(shù)會立刻返回?zé)o數(shù)據(jù),而不會等待“不確定的”下一個數(shù)據(jù)。也就是說無論何種情況,函數(shù)都會立刻返回結(jié)果。
在我們處理CAN數(shù)據(jù)時,可以周期性(例如20ms)讀取數(shù)據(jù),讀到無數(shù)據(jù)之后,做其它的事情,例如通過dbc獲取信號值并顯示。函數(shù)不會等待20ms直到新的CAN幀出現(xiàn)在總線上,也防止了丟幀的情況。因為普通的CAN通信,我們無法在程序?qū)用媾袛嗪螘r會接收到新的數(shù)據(jù)。
另外,有時我們也會想要保證數(shù)據(jù)是“新的”,而不是躺在緩存里不知道多久之前的內(nèi)容,那么在讀取數(shù)據(jù)前先清空緩存會是一個不錯的選擇。
END
虹科車輛網(wǎng)絡(luò)
虹科車輛網(wǎng)絡(luò)事業(yè)部在汽車總線行業(yè)經(jīng)驗超過10年,與世界知名的CAN、LIN總線供應(yīng)商PEAK-System、Lipowsky、IHR等合作10年之久,提供領(lǐng)域內(nèi)頂尖水平的CAN/LIN分析儀和測試方案,同時也提供汽車以太網(wǎng),時間敏感網(wǎng)絡(luò)(TSN)的仿真測試工具和方案。虹科自主研發(fā)的EOL測試軟硬件系統(tǒng)已經(jīng)在業(yè)內(nèi)完成多次安裝和測試,事業(yè)部所有成員都受過國內(nèi)外專業(yè)培訓(xùn),并獲得專業(yè)資格認(rèn)證,工程師平均5年+技術(shù)經(jīng)驗和水平,一致贏得客戶極好口碑。虹科車輛網(wǎng)絡(luò)事業(yè)部致力于為您提供最專業(yè)的服務(wù)。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4408瀏覽量
66967
發(fā)布評論請先 登錄
相關(guān)推薦
熱點(diǎn)推薦
飛凌嵌入式ElfBoard-文件I/O的深入學(xué)習(xí)之阻塞I/O與非阻塞I/O
操作,這是普通文件本質(zhì)上決定的。
非阻塞式I/O,即使沒有數(shù)據(jù)可讀,也不會被阻塞、而是會立馬返回。
1.4.1.2 實(shí)踐
從前面介紹的open函數(shù)可以看到,打開文件時可以使用O_NON
發(fā)表于 12-01 13:07
虹科動態(tài) | 虹科×長城汽車技術(shù)交流日圓滿落幕!
11月25日,虹科攜手長城汽車在保定·長城技術(shù)中心成功舉辦“虹科X長城汽車技術(shù)交流日”系列workshop活動,與長城技術(shù)中心的各位工程師共同展望行業(yè)發(fā)展前景,為雙方未來更多的生態(tài)合作
CH32V307 串口發(fā)送阻塞的原因?怎么解決?
*/
modbus_set_rx_mode(master);
modbus發(fā)送,不知為何阻塞在rt_device_write,初始化 find open 正常
發(fā)表于 09-18 06:06
【HZ-RK3568開發(fā)板免費(fèi)體驗】基于 Select Poll的TCP發(fā)服務(wù)器
資源的操作。這種模式使用中不是很普遍。
非阻塞和阻塞的概念相對應(yīng),指在不能立刻得到結(jié)果之前,該函數(shù)不會阻塞當(dāng)前線程,而會立刻返回。
1.3
發(fā)表于 08-19 22:01
詳解hal_entry入口函數(shù)
當(dāng)使用RTOS時,程序從main函數(shù)開始進(jìn)行線程調(diào)度;當(dāng)沒有使用RTOS時,C語言程序的入口函數(shù)main函數(shù)調(diào)用了hal_entry函數(shù)。由于我們新建的工程是沒有選用RTOS的,因此,
posix函數(shù)異常怎么解決?
測試發(fā)現(xiàn)所有和絕對時間相關(guān)的函數(shù)都是異常的 這該怎么解決目前測試過的有
mq_timedreceive
mq_timedsend
sem_timedwait
pthread_cond_timedwait
pselect
全都是異常的 要不然就立即返回 要不然就一直阻塞永
發(fā)表于 06-12 07:48
CH32V307串口發(fā)送阻塞的原因?如何解決?
*/
modbus_set_rx_mode(master);
modbus發(fā)送,不知為何阻塞在rt_device_write,初始化 find open 正常
發(fā)表于 06-11 08:05
在testbench中如何使用阻塞賦值和非阻塞賦值
本文詳細(xì)闡述了在一個testbench中,應(yīng)該如何使用阻塞賦值與非阻塞賦值。首先說結(jié)論,建議在testbench中,對時鐘信號(包括分頻時鐘)使用阻塞賦值,對其他同步信號使用
函數(shù)指針的六個常見應(yīng)用場景
函數(shù)指針在嵌入式開發(fā)中有著廣泛的應(yīng)用,它讓代碼更加靈活,減少冗余,提高可擴(kuò)展性。很多時候,我們需要根據(jù)不同的情況動態(tài)調(diào)用不同的函數(shù),而函數(shù)指針正是實(shí)現(xiàn)這一需求的重要工具。本文將介紹六個常見的函
詳解RTOS中的Hook函數(shù)
Hook函數(shù)是RTOS中的一個關(guān)鍵特性,通過該函數(shù),用戶可以增強(qiáng)對任務(wù)管理的控制,定義系統(tǒng)行為。
解鎖TSMaster fifo函數(shù):報文讀取的高效方法
前言:TSMaster目前有兩種讀取報文的模式:回調(diào)函數(shù)模式和fifo模式。fifo函數(shù)是TSMaster近期新增的函數(shù),本文將重點(diǎn)介紹fifo模塊。關(guān)于回調(diào)
虹科直播回放 | IO-Link技術(shù)概述與虹科IO-Link OEM
虹科「一站式通訊解決方案」系列直播第1期圓滿落幕!本期主題為「IO-Link技術(shù)概述與虹科IO-LinkOEM」感謝各位朋友的熱情參與!本期直播中虹
“串口阻塞”你真的會用嗎?
很久才會發(fā)出來,一下子出來很多數(shù)據(jù)”。經(jīng)過幫客戶檢查應(yīng)用程序源碼,發(fā)現(xiàn)應(yīng)用程序在串口阻塞方面沒有做正確的處理,修改后解決。非阻塞打開串口open("/dev/tty
西門子TIA Portal中函數(shù)FC和函數(shù)塊FB的相互轉(zhuǎn)換
描述 本文將介紹在西門子 TIA Portal 中使用 Add-In 插件實(shí)現(xiàn)函數(shù) FC 和函數(shù)塊 FB 的相互轉(zhuǎn)換的方法和步驟。 第1步: 添加 PLC 設(shè)備。 選擇西門子 CPU 1214C
關(guān)聯(lián)接口函數(shù)與libmodbus移植
可以發(fā)現(xiàn),除了modbus.h包含的接口函數(shù)之外,modbus-rtu.h和modbus-tcp.h也包含了必要的接口函數(shù)。

虹科分享|關(guān)于阻塞函數(shù)和非阻塞函數(shù)
評論