RT-Thread学习笔记八——线程间通讯(事件)

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

目录

1.概念

2.工作原理

3.事件API

 3.1静态事件

   3.1.1 静态事件的创建

3.1.2 静态事件的删除

3.2动态事件

3.2.1 动态事件的创建

3.2.2 动态事件的删除

3.3 事件的发送和接收

3.3.1 事件的发送

3.3.2 事件的接收

4.C语言位操作(事件标志位置1)

4.1 左移

4.2 左移赋值运算符

4.3 右移 

5.实际使用代码


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)。

3.2动态事件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赴遥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值