以坐公交车为例说明事件集,在公交站等公交车时可能有以下几种情况:
这里,可以
信号量主要用于“一对一”的线程同步;当需要“一对多”、“多对一”、“多对多”的同步时,就需要事件集来处理了。
RT-Thread 中的事件集用一个 32 位无符号整型变量来表示,变量中的一个位代表一个事件,线程通过“逻辑与”或“逻辑或”与一个或多个事件建立关联形成一个事件组合。
事件的“逻辑或” 也称为是独立型同步,指的是线程与任何事件之一发生同步,只要有一个事件发生,即满足条件。
事件的“逻辑与” 也称为是关联型同步,指的是线程与若干事件都发生同步,只有这些事件全部发生,才满足条件。
事件集的工作机制

在 RT-Thread 中,事件集控制块是操作系统用于管理事件的一个数据结构。
struct rt_event
{
struct rt_ipc_object parent; /**< 继承自 ipc 对象 */
rt_uint32_t set; /**< event set */ **32 位无符号整型变量,变量中**的**一个位**代表**一个事件**
};
typedef struct rt_event *rt_event_t;
// 定义静态事件集
struct rt_event static_evt;
// 定义动态事件集
rt_event_t dynamic_evt;
初始化与脱离(针对于静态事件集)
**//** **决定了信号量的值为0的时候,多个线程等待信号量的排列方式
// |**
**// 静态事件集的初始化 事件集指针 事件集名称 事件集标志位————————————> RT_IPC_FLAG_FIFO—————先进先出,先进入线程等待队列的线程将优先获得事件集**
rt_err_t rt_event_init(rt_event_t event, const char *name, rt_uint8_t flag); // **|———>** **RT_IPC_FLAG_PRIO—————线程将按照优先级的方式排队等候事件集,优先级高的线程将优先获得事件集**
**// 通过这个函数,可以将静态事件集,加入,系统的,对象管理器**
// **静态事件集的脱离 事件集指针**
rt_err_t rt_event_detach(rt_event_t event); // **不再使用**这个**静态事件集**的**时**候,用于**将静态事件集从系统的,对象管理器,中移除,释放系统资源**
创建与删除(针对于动态事件集)
// **动态事件集的创建 事件集名称 事件集标志位————> 1.RT_IPC_FLAG_FIFO** 2.**RT_IPC_FLAG_PRIO**
rt_event_t rt_event_create(const char *name, rt_uint8_t flag); // 需要**动态申请**事件集所占的**内存空间**
// **创建成功之后**,得到 rt_event_t dynamic_evt 的**指针**,**需要进行判断**一下,如果 dynamic_evt **不为 NULL**,那么说明**创建成功**了,那么接下来就可以**对新创建的**这个**动态事件集**进行**操作**
// **动态事件集的删除 事件集指针**
rt_err_t rt_event_delete(rt_event_t event); // **不再使用**这个**动态事件集**的**时**候,用于**将动态事件集从系统的,对象管理器,中移除,释放系统资源**
发送事件标志
既可以在线程中使用这个API去发送,也可以在中断(ISR)中使用这个API去发送
向指定的事件集对象发送一个或多个事件标志(Event Flags)。
**// 发送事件标志 事件集指针 要发送的事件标志**
rt_err_t rt_event_send(rt_event_t event, rt_uint32_t set); // 发送**事件集中**的**第0个事件的事件标志**:set = 0x01 , 发送事件集中的**第3个事件的事件标志**:set = 0x08
// 发送事件标志0x01(第1位)
rt_event_send(&my_event, 0x01);
使用场景
接收事件标志
从事件集对象中接收指定的事件标志,并根据选项进行条件匹配,唤醒正在等待这些事件的线程。若事件未就绪,线程可能挂起等待。
**// 0 立即返回(不阻塞)
// 控制事件匹配方式 RT_WAITING_FOREVER = -1 永久等待
// 接收事件集中的事件标志 事件集指针 要接收的事件标志 接收选项 等待超时时间(单位: Tick) 输出参数,用于保存接收到的实际事件标志set(可设为NULL,若无需记录具体标志)**
rt_err_t rt_event_recv(rt_event_t event, rt_uint32_t set, rt_uint8_t option,rt_int32_t timeout, rt_uint32_t *recved);
RT_EVENT_FLAG_AND————关联型同步
RT_EVENT_FLAG_OR—————独立型同步
RT_EVENT_FLAG_CLEAR——可与其他选项组合,如果选择这个FLAG,那么线程唤醒后,系统会自动清除set中对应的位
使用场景