登录
虹科分享|关于阻塞函数和非阻塞函数
虹科汽车电子
2022-07-05
759
我要咨询
虹科汽车电子
73 内容
7.3w阅读
17粉丝
+关注
描述
关于阻塞函数和非阻塞函数
在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年+技术经验和水平,一致赢得客户极好口碑。虹科车辆网络事业部致力于为您提供最专业的服务。
打开APP阅读更多精彩内容
点击阅读全文
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
相关推荐
函数
Verilog
阻塞
和
非
阻塞
原理分析
2009-11-23
0
linux串口通信
阻塞
与
非
阻塞
问题。
2011-07-14
0
【分享】Verilog中
阻塞
与
非
阻塞
语句
2016-11-03
0
fpga基础篇(一):
阻塞
与
非
阻塞
赋值
2017-04-05
0
阻塞
(=)与
非
阻塞
(<=)介绍
2018-07-03
0
【技巧分享】FPGA至简设计-
阻塞
赋值与
非
阻塞
赋值
2020-04-24
0
同步与异步,
阻塞
与
非
阻塞
的区别是什么
2021-01-26
0
阻塞
与
非
阻塞
赋值的区别是什么?
2021-05-10
0
使用sleep
函数
将程序
阻塞
2021-07-14
0
请问如何从
阻塞
过渡到
非
阻塞
I2C?
2023-02-06
0
closesocket
函数
调用会
阻塞
是怎么回事?
2023-02-13
0
时序逻辑中的
阻塞
和非
阻塞
2022-03-15
2588
Linux驱动学习笔记:
阻塞
/非
阻塞
IO
2023-06-12
416
非
阻塞
的的connect()
函数
如何编写
2023-11-11
615
全部
0
条评论
快来发表一下你的评论吧 !
发送
登录/注册
×
20
完善资料,
赚取积分