FreeRTOS 事件功能使用教程
在 FreeRTOS 中,事件(Event)是一种用于实现线程间通信的机制。
事件的使用依赖于动态申请内存,只要启用了 configSUPPORT_DYNAMIC_ALLOCATION
宏,事件相关的功能即可使用。此外,为了使用事件相关的函数,还需要包含特定的头文件。
本文将详细介绍如何在 FreeRTOS 中定义和使用事件。
1. 添加头文件
首先,我们需要包含 FreeRTOS 事件功能所需的头文件 event_groups
:
#include "event_groups.h"
2. 声明事件句柄并创建事件
定义一个事件句柄,并使用 xEventGroupCreate
函数创建事件:
void createEvent(void)
{
if (eventHandle == NULL)
{
eventHandle = xEventGroupCreate();
}
}
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
}
线程2:
线程2 等待事件1 或者 事件4,最大超时时间为 10 秒,读取事件后不清除。
线程3:
线程3 等待事件1 以及 事件6,同时满足两个事件触发才会唤醒执行,最大等待时间为无限阻塞。
注意事项
- 在实际使用中,确保事件组中定义的事件位不冲突,以避免混淆。
- 当事件组用于多个任务时,要注意线程安全,确保事件组的操作是原子的。
4. 烧写验证
将上述代码烧写到设备中进行验证。您应该会看到以下行为:
- 线程1 每隔 3 秒发送一次事件。事件按顺序依次发送,循环进行。
- 线程2 会在等待到事件 1 或事件 4 后唤醒执行,并打印相应的信息。如果在 10 秒内没有收到事件,它将超时并继续等待。
- 线程3 会在同时收到事件 1 和事件 6 后才会唤醒执行,并打印相应的信息。
通过本教程,我们详细介绍了如何在 FreeRTOS 中使用事件机制来实现线程间的通信。通过定义事件组、创建和操作事件,可以轻松实现不同任务之间的同步和通信,提高系统的实时性和稳定性。 希望这篇文章能够帮助您更好地理解和使用 FreeRTOS 的事件机制。如果有任何疑问或需要进一步的指导,欢迎在评论区留言,我们将尽快回复。
对应的 demo 源码, 请点击 RtosExPro at freertos_communication_event
也可扫码关注博主同名公众号"不解之榬",回复 “freeRTOS” 获取