FreeRTOS 体验教程:7.如何用事件Event实现FreeRTOS多线程通信?

FreeRTOS 事件功能使用教程

在 FreeRTOS 中,事件(Event)是一种用于实现线程间通信的机制。
事件的使用依赖于动态申请内存,只要启用了 configSUPPORT_DYNAMIC_ALLOCATION 宏,事件相关的功能即可使用。此外,为了使用事件相关的函数,还需要包含特定的头文件。
本文将详细介绍如何在 FreeRTOS 中定义和使用事件。

1. 添加头文件

首先,我们需要包含 FreeRTOS 事件功能所需的头文件 event_groups

#include "event_groups.h"

image.png

2. 声明事件句柄并创建事件

定义一个事件句柄,并使用 xEventGroupCreate 函数创建事件:

void createEvent(void)
{
	if (eventHandle == NULL)
	{
		eventHandle = xEventGroupCreate();
	}
}

image.png

3. 创建事件示例的线程

线程1:

线程1 每 3 秒发送一次特定事件,循环执行。它首先发送事件位 1(1<<0),然后是事件位 4(1<<3)和事件位 6(1<<5)。

// 伪代码
while (1) 
{         
	vTaskDelay(xDelay);         
	xEventGroupSetBits(xEventGroup, (1 << 0)); // 事件1         
	vTaskDelay(xDelay);         
	xEventGroupSetBits(xEventGroup, (1 << 3)); // 事件4         
	vTaskDelay(xDelay);         
	xEventGroupSetBits(xEventGroup, (1 << 5)); // 事件6     
} 

image.png

线程2:

线程2 等待事件1 或者 事件4,最大超时时间为 10 秒,读取事件后不清除。
image.png

线程3:

线程3 等待事件1 以及 事件6,同时满足两个事件触发才会唤醒执行,最大等待时间为无限阻塞。
image.png

注意事项

  1. 在实际使用中,确保事件组中定义的事件位不冲突,以避免混淆。
  2. 当事件组用于多个任务时,要注意线程安全,确保事件组的操作是原子的。

4. 烧写验证

将上述代码烧写到设备中进行验证。您应该会看到以下行为:

  1. 线程1 每隔 3 秒发送一次事件。事件按顺序依次发送,循环进行。
  2. 线程2 会在等待到事件 1 或事件 4 后唤醒执行,并打印相应的信息。如果在 10 秒内没有收到事件,它将超时并继续等待。
  3. 线程3 会在同时收到事件 1 和事件 6 后才会唤醒执行,并打印相应的信息。
    image.png

通过本教程,我们详细介绍了如何在 FreeRTOS 中使用事件机制来实现线程间的通信。通过定义事件组、创建和操作事件,可以轻松实现不同任务之间的同步和通信,提高系统的实时性和稳定性。 希望这篇文章能够帮助您更好地理解和使用 FreeRTOS 的事件机制。如果有任何疑问或需要进一步的指导,欢迎在评论区留言,我们将尽快回复。

对应的 demo 源码, 请点击 RtosExPro at freertos_communication_event

也可扫码关注博主同名公众号"不解之榬",回复 “freeRTOS” 获取
不解之榬

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值