关于阻塞函数和非阻塞函数
在CAN和LIN相关的开发库里,不可避免的会出现“收”和“发”的函数。如何快速有效的处理数据,是开发中重要的事项。但实际上单路CAN由于波特率的限制,数据量并不会很大:以常用的500k为例,如果按照总线负载率为30%左右,那么需要在1ms处理1~2次数据即可。相比之下常用的以太网一般都要在100M的速率以上了。
因为系统的底层,例如WINDOWS,在处理文件、串口等使用的是同样的函数,所以CAN、LIN处理起来可以运用这些相关的经验。回归到正题,读写函数可以分为阻塞函数和非阻塞函数两种,它们处理起来的方式是不一样的。
阻塞函数(blocking):在执行时会阻塞当前线程,通常会有一个超时时间。
非阻塞函数(non-blocking):不会阻塞当前线程,直接返回结果,通常会有一个对应的缓存。
让我们举两个例子说明:
在UDS的API中获取ECU返回的数据采用阻塞函数。例如,我们在用27服务获取seed,如果我们没有成功获取seed,那么接下来的步骤也无法进行下去。所以阻塞函数会迫使我们去等待结果;如果执行失败,需要做错误处理,例如重新尝试进行获取。
如果阻塞函数的超时时间设置为0,就会和非阻塞函数类似(有些阻塞函数超时时间为0,可能意味着永远也读不到数据了,因为它们总是想要读取来自“未来”的内容)。
在底层的basic API中,CAN的接收采用了非阻塞函数,设备将把读到的数据放到缓存里,而函数将从缓存里读取数据。如果缓存里没有数据,函数会立刻返回无数据,而不会等待“不确定的”下一个数据。也就是说无论何种情况,函数都会立刻返回结果。
在我们处理CAN数据时,可以周期性(例如20ms)读取数据,读到无数据之后,做其它的事情,例如通过dbc获取信号值并显示。函数不会等待20ms直到新的CAN帧出现在总线上,也防止了丢帧的情况。因为普通的CAN通信,我们无法在程序层面判断何时会接收到新的数据。
另外,有时我们也会想要保证数据是“新的”,而不是躺在缓存里不知道多久之前的内容,那么在读取数据前先清空缓存会是一个不错的选择。
END
虹科车辆网络
虹科车辆网络事业部在汽车总线行业经验超过10年,与世界知名的CAN、LIN总线供应商PEAK-System、Lipowsky、IHR等合作10年之久,提供领域内顶尖水平的CAN/LIN分析仪和测试方案,同时也提供汽车以太网,时间敏感网络(TSN)的仿真测试工具和方案。虹科自主研发的EOL测试软硬件系统已经在业内完成多次安装和测试,事业部所有成员都受过国内外专业培训,并获得专业资格认证,工程师平均5年+技术经验和水平,一致赢得客户极好口碑。虹科车辆网络事业部致力于为您提供最专业的服务。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网
网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
函数
+关注
关注
3文章
4327浏览量
62567
发布评论请先 登录
相关推荐
socket编程中的阻塞与非阻塞
在网络编程中, socket 是一个非常重要的概念,它提供了一个抽象层,使得开发者可以不必关心底层的网络通信细节。 socket 编程中的阻塞与非阻塞模式是两种不同的操作方式,它们对程序的响应性
SUMIF函数与SUMIFS函数的区别
SUMIF函数和SUMIFS函数都是Excel中用于条件求和的函数,它们可以帮助用户根据特定的条件对数据进行求和。尽管它们的基本功能相似,但在使用场景和功能上存在一些差异。以下是对这两个函数
socket阻塞和非阻塞的区别是什么
在计算机编程中,socket 是一种通信端点,用于在网络中进行数据传输。Socket 可以是阻塞的或非阻塞的,这两种模式在处理数据传输时有不同的行为。 阻塞模式(Blocking Mo
求助,关于CyU3PUsbHostEpWaitForCompletion函数中的阻塞问题求解
(非主线程)调用该函数时,CyU3PUsbHostEpWaitForCompletion 函数经常阻塞,虽然指定了超时值,但从未返回。
我想应该在主程序线程中调用该
发表于 07-23 07:57
请问IDF里TCP的recv()函数阻塞时会不会释放CPU引起任务切换?
如果不会,那我在recv()阻塞时想让其他任务也可以执行是不是只能把有recv的这个任务优先级调低?
发表于 06-25 08:24
测试ESP-IDF ESP32C6,创建线程调用recvform接收数据发现一直被阻塞,如何解决?
没问题的,但是创建线程调用recvform接收数据发现一直被阻塞,现在怀疑是wifi event的回调函数占用了CPU导致接收线程被阻塞了。请问有什么比较好的解决方法吗?
发表于 06-05 08:22
如何在8051单片机上编程一个阻塞延迟函数?
术语阻塞意味着微控制器的主代码在整个延迟期间被阻塞(什么都不做)。对于小的延迟和简单的问题,这通常是可以接受的,但可能导致不可接受的操作。
发表于 02-29 11:48
•780次阅读
verilog同步和异步的区别 verilog阻塞赋值和非阻塞赋值的区别
Verilog是一种硬件描述语言,用于设计和模拟数字电路。在Verilog中,同步和异步是用来描述数据传输和信号处理的两种不同方式,而阻塞赋值和非阻塞赋值是两种不同的赋值方式。本文将详细解释
关于CSD Capsense ISR的几个疑问求解
Capsense 在扫描过程中是需要CPU参与的吧,这主要体现哪些方面需要占用CPU的资源?
3、如果CSD占用CPU的资源,由于按键扫描时间太长,会导致其他任务得不到及时处理,采用非阻塞的方式(即
发表于 02-01 08:31
以太网阻塞的常见原因与解决方法
以太网阻塞的常见原因与解决方法 以太网阻塞是指在以太网中数据流量增加超过网络设备处理能力的情况下,导致网络性能下降、延迟增加、丢包率上升等问题。下面将详细讨论以太网阻塞的常见原因及解决方法。 一
评论