登录
虹科分享|关于阻塞函数和非阻塞函数
虹科汽车电子
2022-07-05
1121
我要咨询
虹科汽车电子
73 内容
10w+阅读
21粉丝
+关注
描述
关于阻塞函数和非阻塞函数
在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
Java
非
阻塞
通信研究
2009-08-10
297
verilog中
阻塞
赋值和
非
阻塞
赋值
2011-03-15
6981
深入理解
阻塞
和
非
阻塞
赋值
2016-04-22
637
简述
阻塞
赋值和
非
阻塞
赋值的可综合性
2021-05-12
2670
Verilog语言中
阻塞
和
非
阻塞
赋值的不同
2021-08-17
6313
简述Verilog HDL中
阻塞
语句和
非
阻塞
语句的区别
2021-12-02
5935
时序逻辑中的
阻塞
和
非
阻塞
2022-03-15
2940
Linux驱动学习笔记:
阻塞
/
非
阻塞
IO
2023-06-12
649
阻塞
与
非
阻塞
通信的区别
阻塞
和
非
阻塞
应用场景
2023-06-15
5811
一文了解
阻塞
赋值与
非
阻塞
赋值
2023-07-07
2051
阻塞
赋值与
非
阻塞
赋值
2023-09-12
959
非
阻塞
的的connect()
函数
如何编写
2023-11-11
1433
什么是
阻塞
和
非
阻塞
?
2024-03-25
436
全部
0
条评论
快来发表一下你的评论吧 !
发送
登录/注册
×
20
完善资料,
赚取积分