FreeRTOS 事件标志组

📅 2026/7/17 10:45:12 👁️ 阅读次数 📝 资讯
FreeRTOS 事件标志组

一、事件标志组简介

1. 事件标志组介绍

事件标志位:单独 1 个二进制位,标记某一件事件是否发生。 事件标志组:多个事件标志位组成的集合,底层本质是一个无符号整数。

2. 事件标志组核心特点

  1. 变量中高 8 位用于内核控制,只有低 24 位有效做事件标志,最多支持 24 个独立事件;
  2. 每一位含义用户自定义:例 bit0 = 按键按下、bit1 = 串口收到数据、bit2 = 传感器就绪;
  3. bit=1:事件已发生;bit=0:事件未发生;
  4. 任务、中断服务函数都能读写标志位;
  5. 等待模式两种:等待任意一位触发 / 等待全部多位同时触发。

3. 底层数据类型 EventBits_t

typedef TickType_t EventBits_t; #if ( configUSE_16_BIT_TICKS == 1 ) typedef uint16_t TickType_t; #else typedef uint32_t TickType_t; #endif #define configUSE_16_BIT_TICKS 0 // 默认32位模式
  • 32 位模式:低 24 位存事件,高 8 位内核自用;最多 24 个事件标志;
  • 16 位模式:低 8 位存事件,高 8 位内核自用;最多 8 个事件标志;

重点:不能使用高 8 位做自定义事件位,会破坏内核状态。

4. 事件标志组 vs 队列 / 信号量 核心区别

  1. 信号量:计数 / 互斥,用于资源互斥、任务通知资源可用,消耗型,一次只能传递一个 “许可”;
  2. 队列:存储完整数据,用于任务间传递缓存、结构体、数值;
  3. 事件标志组:只记录事件 “是否发生”,无数据、不消耗;多事件并行记录,适合多条件等待(多按键、多外设就绪同步);
  • 信号量 / 队列:1 次触发只能唤醒 1 个等待任务;
  • 事件标志组:置位后所有满足等待条件的任务都会被唤醒;
  • 信号量数值用完自动清零;事件标志可选择自动清零或保持置 1。

二、事件标志组全套 API 详解

1. 创建事件标志组(动态创建)

EventGroupHandle_t xEventGroupCreate( void );
  • 返回值:
    • 非 NULL:事件标志组句柄,创建成功;
    • NULL:堆内存不足,创建失败;
  • 头文件依赖:#include "event_groups.h"
  • 配置宏开启:configUSE_EVENT_GROUPS = 1

2. 清除标志位 xEventGroupClearBits

EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear );
参数
  • xEventGroup:事件标志组句柄;
  • uxBitsToClear:要清零的位掩码,例(1<<0)|(1<<1)清除 bit