事件
优质
小牛编辑
127浏览
2023-12-01
一个线程等待事件,另一个线程发送事件
一个线程等待事件,另一个线程发送事件
源码
/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2018-08-24 yangjie the first version *//* * 程序清单:事件例程 * * 程序会初始化2个线程及初始化一个静态事件对象 * 一个线程等待于事件对象上,以接收事件; * 一个线程发送事件 (事件3/事件5)*/#include <rtthread.h>#define THREAD_PRIORITY 9#define THREAD_TIMESLICE 5#define EVENT_FLAG3 (1 << 3)#define EVENT_FLAG5 (1 << 5)/* 事件控制块 */static struct rt_event event;ALIGN(RT_ALIGN_SIZE)static char thread1_stack[1024];static struct rt_thread thread1;/* 线程1入口函数 */static void thread1_recv_event(void *param){ rt_uint32_t e; /* 第一次接收事件,事件3或事件5任意一个可以触发线程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("thread1: OR recv event 0x%x\n", e); } rt_kprintf("thread1: delay 1s to prepare the second event\n"); rt_thread_mdelay(1000); /* 第二次接收事件,事件3和事件5均发生时才可以触发线程1,接收完后清除事件标志 */ 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_kprintf("thread1 leave.\n");}ALIGN(RT_ALIGN_SIZE)static char thread2_stack[1024];static struct rt_thread thread2;/* 线程2入口 */static void thread2_send_event(void *param){ rt_kprintf("thread2: send event3\n"); rt_event_send(&event, EVENT_FLAG3); rt_thread_mdelay(200); rt_kprintf("thread2: send event5\n"); rt_event_send(&event, EVENT_FLAG5); rt_thread_mdelay(200); rt_kprintf("thread2: send event3\n"); rt_event_send(&event, EVENT_FLAG3); rt_kprintf("thread2 leave.\n");}int event_sample(void){ rt_err_t result; /* 初始化事件对象 */ result = rt_event_init(&event, "event", RT_IPC_FLAG_FIFO); if (result != RT_EOK) { rt_kprintf("init event failed.\n"); return -1; } rt_thread_init(&thread1, "thread1", thread1_recv_event, RT_NULL, &thread1_stack[0], sizeof(thread1_stack), THREAD_PRIORITY - 1, THREAD_TIMESLICE); rt_thread_startup(&thread1); rt_thread_init(&thread2, "thread2", thread2_send_event, RT_NULL, &thread2_stack[0], sizeof(thread2_stack), THREAD_PRIORITY, THREAD_TIMESLICE); rt_thread_startup(&thread2); return 0;}/* 导出到 msh 命令列表中 */MSH_CMD_EXPORT(event_sample, event sample);