RT-Thread学习笔记(12):事件

事件特点

在这里插入图片描述

RT-Thread提供的事件具有如下特点:

  • 事件只与线程相关联,事件相互独立,一个32位的事件集合(set变量),用于标识该线程发生的事件类型,其中每一位表示一种事件类型(0表示该事件类型未发生、1表示该事件类型已经发生),一共32种事件类型
  • 事件仅用于同步,不提供数据传输功能
  • 事件无排队性,即多次向线程发送同一事件(如果线程还未来得及读走),等效于只发送一次。
  • 允许多个线程对同一事件进行读写操作
  • 支持事件等待超时机制

在 RT-Thread 中,每个线程都拥有一个事件信息标记,它有三个属性,分别是 RT_EVENT_FLAG_AND(逻辑与),RT_EVENT_FLAG_OR(逻辑或)以及 RT_EVENT_FLAG_CLEAR(清除标记)。当线程等待事件同步时,可以通过 32 个事件标志和这个事件信息标记来判断当前接收的事件是否满足同步条件。
事件集工作示意图
如上图所示,线程 #1 的事件标志中第 1 位和第 30 位被置位,如果事件信息标记位设为逻辑与,则表示线程 #1 只有在事件 1 和事件 30 都发生以后才会被触发唤醒,如果事件信息标记位设为逻辑或,则事件 1 或事件 30 中的任意一个发生都会触发唤醒线程 #1。如果信息标记同时设置了清除标记位,则当线程 #1 唤醒后将主动把事件 1 和事件 30 清为零,否则事件标志将依然存在(即置 1)。

事件可使用于多种场合,它能够在一定程度上替代信号量,用于线程间同步。一个线程或中断服务例程发送一个事件给事件对象,而后等待的线程被唤醒并对相应的事件进行处理。但是它与信号量不同的是,事件的发送操作是不可累计的,而信号量的释放动作是可累计的。事件另外一个特性是,接收线程可等待多种事件,即多个事件对应一个线程或多个线程。同时按照线程等待的参数,可选择是“逻辑或”触发还是“逻辑与”触发。这个特性也是信号量等所不具备的,信号量只能识别单一同步动作,而不能同时等待多个事件的同步
各个事件可分别发送或一起发送给事件对象,而线程可以等待多个事件,线程仅对感兴趣的事件进行关注。当有它们感兴趣的事件发生时并且符合感兴趣的条件,线程将被唤醒并进行后续的处理动作。

运作机制

在这里插入图片描述
线程1对事件3或事件5感兴趣(逻辑或RT_EVENT_FLAG_OR),当发生其中的某一个事件都会被唤醒,并且执行相应操作。而线程2对事件3与事件5感兴趣(逻辑与RT_EVENT_FLAG_AND),当且仅当事件3与事件5都发生的时候,线程2才会被唤醒,如果只有一个其中一个事件发生,那么线程还是会继续等待事件发生。如果接在收事件函数中option设置了清除事件位,那么当线程唤醒后将把事件3和事件5的事件标志清零,否则事件标志将依然存在。

事件控制块

在这里插入图片描述
本节笔记参考于:野火-《RT-Thread内核实现与应用开发实战》
韦东山 《RT-Thread完全开发手册之内核机制》
以及RT-Thread官网:事件集

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值