外观
事件集示例
2025-10-29
概述
本示例演示线程间如何通过事件集进行通信和同步。通过初始化一个事件集和两个线程,实现一个线程等待关心的事件发生,另一个线程发送事件,且接收线程先后使用"逻辑或"与"逻辑与"两种方式接收事件的功能。帮助用户掌握事件集这一线程间同步机制的使用方法。
事件集的作用
事件集(event)是一种重要的线程间同步机制,用于线程间的通信与同步。它允许应用程序在事件发生时执行特定的代码,而不需要轮询或阻塞等待事件的发生。事件集可以用于处理各种类型的异步事件,例如按键按下、定时器超时、串口数据接收等。
创建工程点击展开
依次点击 “文件” -> “新建” -> "RT-Thread RuiChing App 项目"。

在弹出新建向导中选择 开发版 、BSP: 、示例 、 调试器/下载器。选择好之后点击 “完成”。

点击 “完成” 后,等待工程创建完成。

创建完成。

构建工程点击展开
单击工程使工程进入 Active-Debug 模式。

点击工具栏上的构建按钮进行工程编译。

构建成功后,会显示构建成功的信息。

固件下载点击展开
固化设备树

固化 APP

核心代码
事件集示例相关 API
rt_event_init:初始化事件集,指定名称为 event 且支持优先级继承;rt_event_send: 发送事件;rt_event_recv:以 “逻辑或” 方式等待 EVENT_FLAG3 或 EVENT_FLAG5 事件,接收到后打印事件信息并清除标志;以 “逻辑与” 方式等待 EVENT_FLAG3 和 EVENT_FLAG5 事件都发生,接收到后打印信息并清除标志;rt_event_detach:分离事件集;
applications/event_example.c
static void thread1_recv_event(void *param)
{
rt_uint32_t e;
if (rt_event_recv(&event, (EVENT_FLAG3 | EVENT_FLAG5),
RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER,
&e) == RT_EOK) // 逻辑或接收事件
{
rt_kprintf("thread1: OR recv event 0x%x\n", e);
}
rt_kprintf("thread1: delay 1s to prepare the second event\n");
rt_thread_mdelay(1000);
if (rt_event_recv(&event, (EVENT_FLAG3 | EVENT_FLAG5),
RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER,
&e) == RT_EOK) // 逻辑与接收事件
{
rt_kprintf("thread1: AND recv event 0x%x\n", e);
}
rt_event_detach(&event); // 脱离事件
rt_kprintf("thread1 leave.\n");
}
static void thread2_send_event(void *param)
{
rt_kprintf("thread2: send event3\n");
rt_event_send(&event, EVENT_FLAG3); // 发送事件 FLAG3
rt_thread_mdelay(200);
rt_kprintf("thread2: send event5\n");
rt_event_send(&event, EVENT_FLAG5); // 发送事件 FLAG5
rt_thread_mdelay(200);
rt_kprintf("thread2: send event3\n");
rt_event_send(&event, EVENT_FLAG3); // 发送事件 FLAG3
rt_kprintf("thread2 leave.\n");
}运行示例
操作步骤
- 将程序下载到开发板
- 打开串口终端连接开发板
- 输入
event_example命令
预期结果
- 线程 2 依次发送 event3、event5、event3 事件
- 线程 1 先以逻辑或方式接收任意一个事件
- 线程 1 延时 1 秒后,以逻辑与方式等待两个事件都发生
- 最终两个线程都正常退出
rtt 终端
msh />event_example
thread2: send event3
thread1: OR recv event 0x8
thread1: delay 1s to prepare the second event
thread2: send event5
thread2: send event3
thread2 leave.
thread1: AND recv event 0x28
thread1 leave.