网站首页

人工智能P2P分享搜索全网发布信息网站地图标签大全

当前位置:诺佳网 > 电子/半导体 > 测量仪表 >

虹科分享|关于阻塞函数和非阻塞函数

时间:2022-07-05 14:38

人气:

作者:admin

标签: 函数 

导读:关于阻塞函数和非阻塞函数在CAN和LIN相关的开发库里,不可避免的会出现“收”和“发”的函数。如何快速有效的处理数据,是开发中重要的事项。...

关于阻塞函数和非阻塞函数

CAN和LIN相关的开发库里,不可避免的会出现“收”和“发”的函数。如何快速有效的处理数据,是开发中重要的事项。但实际上单路CAN由于波特率的限制,数据量并不会很大:以常用的500k为例,如果按照总线负载率为30%左右,那么需要在1ms处理1~2次数据即可。相比之下常用的以太网一般都要在100M的速率以上了。


c9d32c48-f95b-11ec-a2f4-dac502259ad0.png

因为系统的底层,例如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年+技术经验和水平,一致赢得客户极好口碑。虹科车辆网络事业部致力于为您提供最专业的服务。

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信