avatar

松果工作室

欢迎光临

  • 首页
  • freeRTOS
  • ESP
  • 开发手册
  • 快速笔记
  • 个人收藏
  • 工具
Home 事件组(Event Group)
文章

事件组(Event Group)

Posted 2023-12-8 Updated 2023-12- 8
By YCP
8~11 min read

使用流程

  • 创建事件组句柄
  • 定义事件组标志位
  • Task1:事件组标志位置 1
  • Task2:创建等待事件组事件;检测事件组标志位是否置 1

注意事项

待补充,纯属一个 Flag。

代码示例

#include <FreeRTOS.h>
#include <task.h>
#include <event_groups.h>

// 创建事件组句柄
EventGroupHandle_t eventGroup;

// 定义事件标志位
#define EVENT_BIT_0 (1 << 0)
#define EVENT_BIT_1 (1 << 1)

// 任务1:发送事件(设置事件标志位)
void vTaskSetEvent(void *pvParameters) {
    (void)pvParameters;

    while (1) {
        // 模拟事件的发生,设置事件标志位
        xEventGroupSetBits(eventGroup, EVENT_BIT_0);
        vTaskDelay(pdMS_TO_TICKS(1000)); // 任务延时 1 秒
        xEventGroupSetBits(eventGroup, EVENT_BIT_1);
        vTaskDelay(pdMS_TO_TICKS(1000)); // 任务延时 1 秒
    }
}

// 任务2:等待事件的发生
void vTaskWaitForEvent(void *pvParameters) {
    (void)pvParameters;

    EventBits_t uxBits;
    const EventBits_t uxBitsToWaitFor = EVENT_BIT_0 | EVENT_BIT_1;

    while (1) {
        // 等待指定事件标志位的发生
        uxBits = xEventGroupWaitBits(
            eventGroup,
            uxBitsToWaitFor,
            pdTRUE,  // 清除等待的事件标志位
            pdFALSE, // 只等待所有位都被设置
            portMAX_DELAY  // 无超时
        );

        // 检查所需事件是否已经发生
        if ((uxBits & uxBitsToWaitFor) == uxBitsToWaitFor) {
            // 所有所需事件已经发生
            // 执行相应操作,例如打印消息
            printf("Both events occurred!\n");
        } else {
            // 未等到所有所需事件的发生
            // 可以执行相应操作
            printf("Waiting for events...\n");
        }
    }
}

void main() {
    // 创建事件组
    eventGroup = xEventGroupCreate();

    // 创建任务1和任务2
    xTaskCreate(vTaskSetEvent, "TaskSetEvent", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
    xTaskCreate(vTaskWaitForEvent, "TaskWaitForEvent", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
}
重学 freeRTOS
freeRTOS
License:  CC BY 4.0
Share

Further Reading

May 9, 2024

freeRTOS 高精度定时任务

vTaskDelayUntil()能精确地在每 50ms 调用这个函数 void TASKF(void *ptr) { TickType_t xLastWakeTime; xLastWakeTime = xTaskGetTickCount(); while (1) { vTask

Dec 8, 2023

事件组(Event Group)

使用流程 创建事件组句柄 定义事件组标志位 Task1:事件组标志位置 1 Task2:创建等待事件组事件;检测事件组标志位是否置 1 注意事项 待补充,纯属一个 Flag。 代码示例 #include <FreeRTOS.h> #include <task.h> #

Dec 7, 2023

软件定时器(Software Timer)

使用流程 创建定时器句柄 启动定时器 注意事项 启动定时器后,延时一个周期再执行定时器回调,不会立刻执行。因此,当定时器句柄中的 pdTure 改成 pdFalse,这就是个延时任务。 延时任务执行一次之后,如果再次执行xTimerStart,会再次执行一次延时任务。 代码示例 #include "

OLDER

软件定时器(Software Timer)

NEWER

蓝牙广播(Broadcast)

Recently Updated

  • ESP32(八) 简单的webserver
  • ESP32(七) NVS
  • ESP32(四) STA & AP
  • 多级菜单
  • ESP32(五) ESP32 OTA

Trending Tags

WCH Linux Elec freeRTOS STM ESP Flutter Others SwiftUI

Contents

©2025 松果工作室. Some rights reserved.

Using the Halo theme Chirpy