目录
一. 事件标志组简介
1.1 事件标志位
事件标志位用于表明某个事件是否发生。
比如下面的几个例子:
1. 当收到一条消息并且把这条消息处理完以后,就可以将某个位(标志) 置1;当队列中没有消息需要处理的时候,就可以将这个位(标志) 置0。2. 当把队列中的消息通过网络发送以后,就可以将某个位(标志) 置1,当没有数据需要从网络发送出去的话,就可以这个位(标志) 置0。
3. 当需要向网络中发送一个心跳信息,将某个位(标志)置1。现在不需要项网络中发送心跳信息,这个位(标志)置0。
1.2 事件标志组
事件标志组是一组事件标志位的集合, 可以简单的理解事件标志组,就是一个整数。
同样,以上面列出的三个例子为例:
事件标志组bit0 表示队列中的消息是否处理掉。
事件标志组bit1 表示是否有信息需要从网络中发送出去。
事件标志组bit2 表示现在是否需要向网路发送心跳信息。
1.3 事件标志组的特点
① 它的每一个位表示一个事件(高8位不算)
② 每一位事件的含义,由用户自己决定,如:bit0表示按键是否按下,bit1表示是否接受到消息
③ 任意任务或中断都可以读写这些位
④ 可以等待某一位成立,或者等待多位同时成立
1.4 事件标志组和事件标志位的数据类型
一个事件组就包含了一个 EventBits_t 数据类型的变量,当configUSE_16_BIT_TICKS为 1 的时候,事件标志组可以存储 16 个事件位,当 configUSE_16_BIT_TICKS 为 0 的时候,事件标志组可以存储 32 个事件位。
但是,虽然使用了 16位 或者 32 位无符号的数据类型变量来存储事件标志, 但其中的高8位用作存储事件标志组的控制信息,低8位 或者 低24位用作存储事件标志 ,所以说一个事件组最多可以存储 24 个事件标志!
变量类型 EventBits_t 的定义如下所示:
#if( configUSE_16_BIT_TICKS == 1 )
typedef uint16_t TickType_t;
#define portMAX_DELAY ( TickType_t ) 0xffff
#else
typedef uint32_t TickType_t;
#define portMAX_DELAY ( TickType_t ) 0xffffffffUL
/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do
not need to be guarded with a critical section. */
#define portTICK_TYPE_IS_ATOMIC 1
#endif
二. 事件标志组与队列、信号量的区别
功能 | 唤醒对象 | 事件清除 |
队列、信号量 | 事件发生时,只会唤醒一个任务 | 是消耗型的资源,队列的数据被读走就没了;信号量被获取后就减少了 |
事件标志组 | 事件发生时,会唤醒所有符合条件的任务,可以理解为“广播”的作用 | 被唤醒的任务有两个选择,可以让事件保留不动,也可以清除事件 |
三. 事件标志组的相关函数
函数 | 描述 |
xEventGroupCreate() | 使用动态方式创建事件标志组 |
xEventGroupCreateStatic() | 使用静态方式创建事件标志组 |
xEventGroupClearBits() | 清零事件标志位 |
xEventGroupClearBitsFromISR() | 在中断中清零事件标志位 |
xEventGroupSetBits() | 设置事件标志位 |
xEventGroupSetBitsFromISR() | 在中断中设置事件标志位 |
xEventGroupWaitBits() | 等待事件标志位 |
xEventGroupSync() | 设置事件标志位,并等待事件标志位 |
3.1 动态方式创建事件标志组
EventGroupHandle_t xEventGroupCreate( void )
返回值 | 描述 |
NULL | 事件标志组创建失败 |
其他值 | 事件标志组创建成功,返回其句柄 |
3.2 设置事件标志位
EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet )
形参 | 描述 |
xEventGroup | 待操作的事件标志组句柄 |
uxBitsToSet | 待设置的事件标志位 |
返回值 | 描述 |
整数 | 函数返回时,事件组中的事件标志位值 |
3.3 清除事件标志位函数
EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear )
形参 | 描述 |
xEventGroup | 待操作的事件标志组句柄 |
uxBitsToClear | 待清零的事件标志位 |
返回值 | 描述 |
整数 | 清零事件标志位之前事件组中事件标志位的值 |
3.4 等待事件标志位
某个任务可能需要与多个事件进行同步,那么这个任务就需要等待并判断多个事件标志位,使用函数 xEventGroupWaitBits()可以完成这个功能。
调用函数以后,如果任务要等待的事件位还没有准备好 (置1或清零),任务就会进入阻塞态,直到阻塞时间达到 或者 所等待的事件位准备好。
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 | 等待的阻塞时间 |
返回值 | 描述 |
等待的事件标志位值 | 等待事件标志位成功,返回等待到的事件标志位 |
其他值 | 等待事件标志位失败,返回事件组中的事件标志位 |