0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

虹科汽车电子 2022-07-05 14:38 次阅读

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    3868

    浏览量

    61308
收藏 人收藏

    评论

    相关推荐

    如何在8051单片机上编程一个阻塞延迟函数

    术语阻塞意味着微控制器的主代码在整个延迟期间被阻塞(什么都不做)。对于小的延迟和简单的问题,这通常是可以接受的,但可能导致不可接受的操作。
    发表于 02-29 11:48 133次阅读

    verilog同步和异步的区别 verilog阻塞赋值和非阻塞赋值的区别

    Verilog是一种硬件描述语言,用于设计和模拟数字电路。在Verilog中,同步和异步是用来描述数据传输和信号处理的两种不同方式,而阻塞赋值和非阻塞赋值是两种不同的赋值方式。本文将详细解释
    的头像 发表于 02-22 15:33 365次阅读

    阻塞态可以直接到运行态吗

    阻塞态即是指进程或线程在等待某种事件或资源时暂时停止执行的状态。在计算机系统中,由于各种原因,进程或线程可能会进入阻塞态,等待着能够继续执行的条件成熟。 在绝大多数情况下,阻塞态到运行态并不是直接
    的头像 发表于 11-17 11:43 1036次阅读

    阻塞的的connect()函数如何编写

    由于网络编程涉及很多细节和技巧,一直想写篇文章来总结下这方面的心得与经验,希望对来者有一点帮助,那就善莫大焉了。 一、非阻塞的的connect()函数如何编写 我们知道用connect()函数默认
    的头像 发表于 11-11 16:23 621次阅读
    非<b class='flag-5'>阻塞</b>的的connect()<b class='flag-5'>函数</b>如何编写

    安全模块的串口收发,想实现阻塞要怎么操作?

    改成阻塞的收发,需要修改那些地方呢?
    发表于 10-28 06:58

    STM32怎么实现一个阻塞性的串口屏收发?

    STM32怎么实现一个阻塞性的串口屏收发
    发表于 10-24 08:15

    什么是阻塞?怎么设计才能满足阻塞指标?

    阻塞就是外部有阻塞干扰信号的时候,设备还可以正常运行。一般分为带内阻塞和带外阻塞,由于直放站都是做宽带设备,一般只提带外阻塞
    的头像 发表于 10-10 11:22 655次阅读

    网络IO模型:阻塞与非阻塞

    阻塞 IO 模型 在Linux ,默认情况下所有的 socket 都是阻塞的,一个典型的读操作流程如图所示。 阻塞和非阻塞的概念描述的是用户线程调用内核 IO 操作的方式:
    的头像 发表于 10-08 17:16 484次阅读
    网络IO模型:<b class='flag-5'>阻塞</b>与非<b class='flag-5'>阻塞</b>

    阻塞赋值与非阻塞赋值

    ”=“阻塞赋值与”
    的头像 发表于 09-12 09:06 645次阅读
    <b class='flag-5'>阻塞</b>赋值与非<b class='flag-5'>阻塞</b>赋值

    在verilog语句中,阻塞赋值和小于等于均使用符号“<=”,如何区分<=所表示的含义?

    )中,\"<=\"作为阻塞赋值的一部分。 verilog中,一个语法结构不可能同时允许“表达式”和“语句”, 如果某处可以出现表达式,那么就不允许出现语句; 如果
    发表于 08-08 09:32

    一文了解阻塞赋值与非阻塞赋值

    今天给大家普及一下阻塞赋值和非阻塞赋值的相关知识
    的头像 发表于 07-07 14:15 1456次阅读
    一文了解<b class='flag-5'>阻塞</b>赋值与非<b class='flag-5'>阻塞</b>赋值

    阻塞与非阻塞通信的区别 阻塞和非阻塞应用场景

    阻塞通信(Blocking Communication):当进行阻塞通信时,调用者在发起一个I/O操作后会被阻塞,直到该操作完成返回才能继续执行后续代码。
    的头像 发表于 06-15 17:32 4114次阅读

    Linux驱动学习笔记:阻塞/非阻塞IO

    在应用程序中,使用open函数打开一个`/dev`目录下的一个设备文件时,默认是以阻塞的方式打开。
    发表于 06-12 16:22 416次阅读
    Linux驱动学习笔记:<b class='flag-5'>阻塞</b>/非<b class='flag-5'>阻塞</b>IO

    Verilog中阻塞和非阻塞赋值金规

    对于VerilogHDL语言中,经常在always模块中,面临两种赋值方式:阻塞赋值和非阻塞赋值。对于初学者,往往非常迷惑这两种赋值方式的用法,本章节主要介绍这两种文章的用法。其实,有时候概念稍微不清楚,Bug就会找到我们,下面一文扫清
    的头像 发表于 06-01 09:21 572次阅读

    如何使用中断的快速/阻塞SPI?

    我正在寻找一种几乎连续发送 SPI 数据而不阻塞 CPU 的方法。我通常使用 PlatformIO / Arduino SDK 进行开发,其 SPI 类仅支持 SPI 的阻塞写入。我在 RTOS
    发表于 05-29 08:01