一、事件标志组
事件标志组
事件标志位:用一个位,来表示事件是否发生
事件标志组是一组事件标志位的集合, 可以简单的理解事件标志组,就是一个整数。
事件标志组的特点
事件标志组的特点:
-
它的每一个位表示一个事件(高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 个事件标志!

事件标志组与队列、信号量的区别?
| 功能 | 唤醒对象 | 事件清除 |
|---|---|---|
| 队列、信号量 | 事件发生时,只会唤醒一个任务 | 是消耗型的资源,队列的数据被读走就没了;信号量被获取后就减少了 |
| 事件标志组 | 事件发生时,会唤醒所有符合条件的任务,可以理解为“广播”的作用 | 被唤醒的任务有两个选择,可以让事件保留不动,也可以清除事件 |
相关API函数介绍
| 函数 | 描述 |
|---|---|
| xEventGroupCreate() | 使用动态方式创建事件标志组 使用静态方式创建事件标志组 清零事件标志位 在中断中清零事件标志位 设置事件标志位 在中断中设置事件标志位 |
| xEventGroupCreateStatic() | |
| xEventGroupClearBits() | |
| xEventGroupClearBitsFromISR() | |
| xEventGroupSetBits() | |
| xEventGroupSetBitsFromISR() | |
| xEventGroupWaitBits() | 等待事件标志位 |
| xEventGroupSync() | 设置事件标志位,并等待事件标志位 |
动态方式创建事件标志组函数
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做好自己的事之后,需要等待菜也做好,大家在一起吃饭。
特点:同步!
事件标志组实验
