前言
本文学习RT-Thread的事件集,事件集也是线程间同步的机制之一,一个事件集可以包含多个事件,利用事件集可以完成一对多,多对多的线程间同步。将理论讲事件集的工作机制以及相关函数,后面用RTT&正点原子联合出品的潘多拉开发板进行实验。
一、事件集的工作机制
1、一个线程与多个事件的关系可设置为:其中任意一个事件唤醒线程,或几个事件都到达后才唤醒线程进行后续的处理;同样,事件也可以是多个线程同步多个事件。
2、RT-Thread 定义的事件集有以下特点:(1)事件只与线程相关,事件间相互独立。(2)事件仅用于同步,不提供数据传输功能;(3)事件无排队性,即多次向线程发送同一事件 (如果线程还未来得及读走),其效果等同于只发送一次。
3、每个线程都拥有一个事件信息标记,它有三个属性,分别是 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)。
![事件集工作示意图](https://i-blog.csdnimg.cn/blog_migrate/7b763e19f162c9fe1f1b681e25b13344.png)
二、事件集的相关函数
1、创建动态事件集函数
当创建一个事件集时,内核首先创建一个事件集控制块,然后对该事件集控制块进行基本的初始化。
rt_event_t rt_event_create(const char* name, rt_uint8_t flag);
(1)入口参数:
name:事件集的名称。
flag:事件集的标志,它可以取如下数值:RT_IPC_FLAG_FIFO 或RT_IPC_FLAG_PRIO。
(2)返回值:
RT_NULL: