事件集(Event)
事件集可以看作公交⻋站的场景。线程可以等待多个事件发⽣,⽐如等待公交⻋或等待同伴到
达。如果满⾜某个或某⼏个条件,线程将被唤醒继续执⾏。
事件集的⼯作机制
事件集⽤于线程间的同步,可以让线程等待⼀个或多个事件的触发:
逻辑与(AND):线程等待多个事件同时发⽣才被唤醒。
逻辑或(OR):线程只需等待其中⼀个事件发⽣即可被唤醒。
RT_IPC_FLAG_PRIO
表⽰优先级等待,
RT_IPC_FLAG_FIFO
表⽰先进先出等待。
==api:
rt_event_create:⽤于动态创建事件对象。
rt_event_init:⽤于静态初始化事件对象。
rt_event_delete:⽤于删除动态事件对象。
rt_event_detach:⽤于卸载静态初始化的事件对象。
rt_event_send:发送事件,触发指定的事件标志位。
rt_event_recv:接收事件,线程根据等待条件阻塞,直到指定事件发⽣
```
rt_event_t event = RT_NULL;
// 运动员线程:等待两个裁判信号
void athlete_entry(void *parameter)
{
rt_uint32_t received;
rt_kprintf("运动员: 等待裁判的准备信号和开始信号\n");
// 等待两个事件:准备信号(位1)
// 和开始信号(位2)
rt_event_recv(event, (1<<1 | 1<<2), RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, &received);
// 两个事件都收到,运动员起跑
rt_kprintf("运动员: 收到准备信号和开始信号,准备起跑!\n");
}
// 裁判1线程:发送准备信号
void referee1_entry(void *parameter)
{
rt_thread_mdelay(500);
// 模拟准备时间
rt_kprintf("裁判1: 发送准备信号\n");
rt_event_send(event, (1<<1));
// 发送准备信号事件(位1)
rt_thread_mdelay(1);
}
// 裁判2线程:发送开始信号
void referee2_entry(void *parameter)
{
rt_thread_mdelay(100);
// 模拟准备时间
rt_kprintf("裁判2: 发送开始信号\n");
rt_event_send(event, (1<<2));
// 发送开始信号事件(位2)
rt_thread_mdelay(1);
}
int main(void)
{
// 初始化事件对象
event = rt_event_create("event", RT_IPC_FLAG_PRIO);
// 创建运动员线程
rt_thread_t athlete_tid = rt_thread_create("athlete", athlete_entry,
RT_NULL, 1024, 25, 10);
// 创建裁判1线程
rt_thread_t referee1_tid = rt_thread_create("referee1", referee1_entry,
RT_NULL, 1024, 25, 10);
// 创建裁判2线程
rt_thread_t referee2_tid = rt_thread_create("referee2", referee2_entry,
RT_NULL, 1024, 25, 10);
// 启动线程
rt_thread_startup(athlete_tid);
rt_thread_startup(referee1_tid);
rt_thread_startup(referee2_tid);
return 0;
}

3685

被折叠的 条评论
为什么被折叠?



