第二十一 事件(第一部分)
一、基本概念
- 事件是一种实现线程间通信的机制,主要用于实现线程间的同步,但事件通信只能是事件类型的通信,无数据传输。其可以实现一对多,多对多的同步
- 事件集合用 32 位无符号整型变量来表示,每一位代表一个事件,线程通过“逻辑与”或“逻辑或”与一个或多个事件建立关联,形成一个事件集。
- 线程可以通过创建事件来实现事件的触发和等待操作。
RT-Thread 的事件仅用于同步,不提供数据传输功能
当线程等待事件同步时,可以通过 32 个事件标志和这个事件信息标记来判断当前接收的事件是否满足同步条件。
二、事件应用场景
RT-Thread 的事件用于事件类型的通讯,无数据传输。
——可用事件来做标志位,判断某些事件是否发生了,然后根据结果做处理
例子:
在某些场合,可能需要多个时间发生了才能进行下一步操作,比如一些危险机器的启动,需要检查各项指标,当指标不达标的时候,无法启动,但是检查各个指标的时候,不能一下子检测完毕啊,所以,需要事件来做统一的等待,当所有的事件都完成了,那么机器才允许启动。
三、事件运作机制
用户可以自定义通过传入参数选择读取模式 option,自行选择是等待所有感兴趣的事件还是等待感兴趣的任意一个事件。
**事件不与线程相关联,事件相互独立,**一个 32 位的变量(事件集合 set),用于标识该线程发生的事件类型,其中每一位表示一种事件类型(0 表示该事件类型未发生、1 表示该事件类型已经发生),一共 32 种事件类型
事件唤醒机制,当线程因为等待某个或者多个事件发生而进入阻塞态,当事件发生的时候会被唤醒
-
线程 1 对事件 3 或事件 5 感兴趣(逻辑或 RT_EVENT_FLAG_OR),当发生其中的某一个事件都会被唤醒,并且执行相应操作。
-
线程 2 对事件 3 与事件 5 感兴趣(逻辑与RT_EVENT_FLAG_AND),当且仅当事件 3 与事件 5 都发生的时候,线程 2 才会被唤醒,如果只有一个其中一个事件发生,那么线程还是会继续等待事件发生。
-
如果接在收事件函数中 option 设置了清除事件位,那么当线程唤醒后将把事件 3 和事件 5 的事件标志清零,否则事件标志将依然存在。