目录
1.概念
事件常用于线程间同步,在操作系统中,可以实现利用事件一对一,一对多或者多对多的同步,即一个线程可以根据一个事件触发,或多个事件同时发生才触发,同理,一个事件也可以同时触发多个线程,或多个事件触发多个线程。
多个事件的集合称为事件集,常用一个32位无符号整型变量表示,变量的每一位代表一个事件,线程通过“逻辑与” 和“逻辑或”与一个事件或多个事件关联,逻辑或称为独立型同步,逻辑与称为关联型同步。
ps:事件只能进行线程间同步,不能进行线程间通信。
我们常用全局变量作为标志位来进行线程间同步,但这一做法在实时操作系统中,会造成代码可读性差,代码管理困难的问题,因此使用事件,他比信号量使用范围广,适用情况灵活,可一对一,一对多和多对多。
2.工作原理
每个线程对于事件都有三个对应的标志位,逻辑与(RT_EVENT_FLAG_AND),逻辑或(RT_EVENT_FLAG_OR)和清除标记(RT_EVENT_FLAG_CLEAR)。
若线程的事件标志中第一位和第三位被置为1,事件信息标志位被置为逻辑或,则代表此时事件1和事件3任何一个发生都会触发线程的运行:
若线程事件信息标志位被置为逻辑与,则代表此时事件1和事件3必须同时发生才会触发线程的运行。
如果信息标志位还设置了清除标记位,则代表线程触发运行后会将事件标志清0,如果没有设置,则线程运行结束后事件1和事件3仍为原来的置1状态。
3.事件API
事件与线程,信号量,互斥量类似,对应API仍然分为静态/动态事件创建,删除,事件的发送和接收。
3.1静态事件
3.1.1 静态事件的创建
rt_event_init (rt_event_t event,
const char * name,
rt_uint8_t flag
)


参数为指向事件的指针,事件集名称和标志,标志为两种,先进先出模式和优先级模式。两种模式的含义前面有提到,不再赘述。
创建时需要首先创建一个事件集指针(static struct rt_event event),然后对该指针取地址即可创建事件集。如下:
/* 事件控制块 */
static struct rt_event event;
rt_err_t result ;
/* 初始化事件对象 */
result = rt_event_init(&event, "event", RT_IPC_FLAG_FIFO); //创建静态事件
3.1.2 静态事件的删除
rt_event_detach ( rt_event_t event )

静态事件的删除,参数为静态事件的指针。注意使用时取地址(&event)。
RT-Thread事件机制详解与应用实例

本文详细介绍了RT-Thread操作系统中的事件机制,包括事件的概念、工作原理、API使用方法,如静态和动态事件的创建与删除,以及事件的发送和接收。事件在多线程同步中起到关键作用,支持一对一、一对多和多对多的同步模式。通过位操作设置事件标志,线程根据事件标志进行响应。示例代码展示了如何创建线程接收和发送事件,以及如何利用事件进行线程间的同步交互。
最低0.47元/天 解锁文章
314

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



