200字
RTOS事件标志组 N
2026-03-19
2026-03-23

一、事件标志组

事件标志组

事件标志位:用一个位,来表示事件是否发生

事件标志组是一组事件标志位的集合, 可以简单的理解事件标志组,就是一个整数。

事件标志组的特点

事件标志组的特点:

  • 它的每一个位表示一个事件(高8位不算)

  • 每一位事件的含义,由用户自己决定,如:bit0表示按键是否按下,bit1表示是否接受到消息 … …

    这些位的值为1:表示事件发生了;值为0:表示事件未发生

  • 任意任务或中断都可以读写这些位

  • 可以等待某一位成立,或者等待多位同时成立

事件标志组的标志变量

一个事件组就包含了一个EventBits_t 数据类型的变量,变量类型 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 

EventBits_t 实际上是一个 16 位或 32 位无符号的数据类型

虽然使用了 32 位无符号的数据类型变量来存储事件标志, 但其中的高8位用作存储事件标志组的控制信息,低24位用作存储事件标志 ,所以说一个事件组最多可以存储 24 个事件标志!

image

事件标志组与队列、信号量的区别?

功能 唤醒对象 事件清除
队列、信号量 事件发生时,只会唤醒一个任务 是消耗型的资源,队列的数据被读走就没了;信号量被获取后就减少了
事件标志组 事件发生时,会唤醒所有符合条件的任务,可以理解为“广播”的作用 被唤醒的任务有两个选择,可以让事件保留不动,也可以清除事件

相关API函数介绍

函数 描述
xEventGroupCreate() 使用动态方式创建事件标志组
使用静态方式创建事件标志组
清零事件标志位
在中断中清零事件标志位
设置事件标志位
在中断中设置事件标志位
xEventGroupCreateStatic()
xEventGroupClearBits()
xEventGroupClearBitsFromISR()
xEventGroupSetBits()
xEventGroupSetBitsFromISR()
xEventGroupWaitBits() 等待事件标志位
xEventGroupSync() 设置事件标志位,并等待事件标志位
更多事件标志组相关的API函数介绍请查阅[《FreeRTOS开发指南》](assets/FreeRTOS开发指南_V1.5-20231208111236-nsvx19r.pdf)-- 第十六章“FreeRTOS事件标志组”

动态方式创建事件标志组函数

EventGroupHandle_t xEventGroupCreate ( void ) ;

返回值 描述
NULL 事件标志组创建失败
其他值 事件标志组创建成功,返回其句柄

清除事件标志位函数

EventBits_t xEventGroupClearBits

EventBits_t  xEventGroupClearBits( EventGroupHandle_t   xEventGroup,
                                   const EventBits_t    uxBitsToClear) 
形参 描述
xEventGroup 待操作的事件标志组句柄
uxBitsToSet 待清零的事件标志位
返回值 描述
整数 清零事件标志位之前事件组中事件标志位的值

设置事件标志位函数

EventBits_t xEventGroupSetBits

EventBits_t   xEventGroupSetBits(  EventGroupHandle_t   xEventGroup,
                                   const EventBits_t    uxBitsToSet ) 
形参 描述
xEventGroup 待操作的事件标志组句柄
uxBitsToSet 待设置的事件标志位
返回值 描述
整数 函数返回时,事件组中的事件标志位值

等待事件标志位API函数

EventBits_t xEventGroupWaitBits

EventBits_t   xEventGroupWaitBits(   EventGroupHandle_t   xEventGroup,
                                     const EventBits_t    uxBitsToWaitFor,
                                     const BaseType_t     xClearOnExit,
                                     const BaseType_t     xWaitForAllBits,
                                     TickType_t           xTicksToWait  )
形参 描述
xEvenrGroup 等待的事件标志组句柄
uxBitsToWaitFor 等待的事件标志位,可以用逻辑或等待多个事件标志位
xClearOnExit 成功等待到事件标志位后,清除事件组中对应的事件标志位, pdTRUE :清除uxBitsToWaitFor指定位; pdFALSE:不清除
xWaitForAllBits 等待uxBitsToWaitFor 中的所有事件标志位(逻辑与) pdTRUE:等待的位,全部为1 pdFALSE:等待的位,某个为1
xTicksToWait 等待的阻塞时间
返回值 描述
等待的事件标志位值 等待事件标志位成功,返回等待到的事件标志位
其他值 等待事件标志位失败,返回事件组中的事件标志位

特点:可以等待某一位、也可以等待多位

等到期望的事件后,还可以清除某些位

同步函数

EventBits_t xEventGroupSync

EventBits_t     xEventGroupSync(   EventGroupHandle_t   xEventGroup,
                                   const EventBits_t    uxBitsToSet,
                                   const EventBits_t    uxBitsToWaitFor,
                                   TickType_t           xTicksToWait) 
形参 描述
xEventGroup 等待事件标志所在事件组
uxBitsToSet 达到同步点后,要设置的事件标志
uxBitsToWaitFor 等待的事件标志
xTicksToWait 等待的阻塞时间
返回值 描述
等待的事件标志位值 等待事件标志位成功,返回等待到的事件标志位
其他值 等待事件标志位失败,返回事件组中的事件标志位

例子:

Task1:做饭

Task2:做菜

Task1做好自己的事之后,需要等待菜也做好,大家在一起吃饭。

特点:同步!

事件标志组实验

image

总结

FreeRTOS事件标志组(课堂总结).pdf

FreeRTOS事件标志组.emmx

评论