外观
事件集示例
2026-05-15
概述
本文介绍如何在 睿擎工业开发平台 中创建并运行事件集示例工程,通过初始化一个事件集和两个线程,实现线程间的事件通信与同步。接收线程先后使用"逻辑或"与"逻辑与"两种方式接收事件,帮助读者快速掌握事件集这一线程间同步机制的使用方法。
事件集简介
事件集(event)是一种重要的线程间同步机制,用于线程间的通信与同步。它允许应用程序在事件发生时执行特定的代码,而不需要轮询或阻塞等待事件的发生。事件集可以用于处理各种类型的异步事件,例如按键按下、定时器超时、串口数据接收等。
构建与烧录
创建工程点击展开
依次点击 “文件” -> “新建” -> "RT-Thread RuiChing App 项目"。

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

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

创建完成。

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

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

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

固件下载点击展开
固化驱动

固化 APP

核心示例代码
事件集示例相关 API
rt_event_init:初始化事件集,指定名称为 event 且支持优先级继承rt_event_send:发送事件,将指定的事件标志位置位,唤醒等待该事件的线程rt_event_recv:接收事件,支持逻辑或和逻辑与两种模式,可设置超时时间
event_example.c
static void _ev_thread1_entry(void *param)
{
rt_uint32_t e = 0;
while (1)
{
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("event: receive 0x%x\n", e);
}
rt_thread_mdelay(10);
}
}
static void _ev_thread2_entry(void *param)
{
while (1)
{
rt_kprintf("event: send EVENT_FLAG3\n");
rt_event_send(&_event, EVENT_FLAG3);// 发送事件 FLAG3
rt_thread_mdelay(200);
rt_kprintf("event: send EVENT_FLAG5\n");
rt_event_send(&_event, EVENT_FLAG5);// 发送事件 FLAG5
rt_thread_mdelay(300);
}
}
int event_example(void)
{
rt_event_init(&_event, EVENT_NAME, RT_IPC_FLAG_PRIO);// 初始化事件集
rt_thread_init(&_ev_thread1, THREAD1_NAME, _ev_thread1_entry, RT_NULL,
&_ev_thread1_stack[0], sizeof(_ev_thread1_stack),
THREAD_PRIORITY - 1, THREAD_TIMESLICE);
rt_thread_startup(&_ev_thread1);
rt_thread_init(&_ev_thread2, THREAD2_NAME, _ev_thread2_entry, RT_NULL,
&_ev_thread2_stack[0], sizeof(_ev_thread2_stack),
THREAD_PRIORITY, THREAD_TIMESLICE);
rt_thread_startup(&_ev_thread2);
return 0;
}运行示例
操作步骤
- 将程序下载到开发板
- 打开串口终端连接开发板
- 输入
event_example命令
预期结果
- 线程 2 依次循环发送 event3、event5 事件
- 线程 1 始终以逻辑或方式接收任意一个事件
- 线程 1 接收成功后自动清除事件标志,并延时 10 毫秒
- 最终两个线程在 while(1) 中无限循环,不主动退出
RT-Thread 终端
msh />event_example
msh />event: send EVENT_FLAG3
event: receive 0x8
event: send EVENT_FLAG5
event: receive 0x20
event: send EVENT_FLAG3
event: receive 0x8
event: send EVENT_FLAG5
event: receive 0x20
event: send EVENT_FLAG3
event: receive 0x8
event: send EVENT_FLAG5
event: receive 0x20
...