一、事件标志组
前面所介绍的队列、信号量,只能实现与单个任务进行同步。而有时候某个任务可能需要与多个事件或任务进行同步,此时,事件标志组的作用就凸显出来
1.1 事件标志组简介
事件标志位:用一个位,来表示事件是否发生
事件标志组:一组事件标志位的集合, 可以简单的理解事件标志组,就是一个(16/32)整数
事件标志组是一种实现任务/中断间通信的机制,主要用于实现多任务间的同步
根据configUSE_16_BIT_TICKS 的宏定义不同,每个事件标志组的位数也就不同
虽然使用了 32 位无符号的数据类型变量来存储事件标志, 但其中的高8位用作存储事件标志组的控制信息,低24位用作存储事件标志 ,所以说一个事件组最多可以存储 24 个事件标志
可以发现,事件标志组与外设的状态寄存器SR非常类似,每一位都代表一个事件是否发生(高8位除外)
1.2 事件标志组与队列、信号量的区别
此外:设置事件组不会阻塞,等待事件标志支持阻塞
二、事件组结构体
typedef struct EventGroupDef_t
{
EventBits_t uxEventBits;
List_t xTasksWaitingForBits; /*< List of tasks waiting for a bit to be set. */
#if ( configUSE_TRACE_FACILITY == 1 )
UBaseType_t uxEventGroupNumber;
#endif
/* 如果事件组是静态分配,则设置为pdTURE,以确保不尝试释放内存 */
#if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the event group is statically allocated to ensure no attempt is made to free the memory. */
#endif
} EventGroup_t;
成员 | 说明 |
uxEventBits | EventBits_t类型的变量,其中, 高八位:事件标志组的控制信息 剩余位:存储事件标志(1:发生;2:未发生) |
xTasksWaitingForBits | 链表,等待事件标志位的任务的链表 |
三、相关API
函数 |
描述 |
xEventGroupCreate() |
使用动态方式创建事件标志组 |
xEventGroupCreateStatic() |
使用静态方式创建事件标志组 |
xEventGroupClearBits() |
清零事件标志位 |
xEventGroupClearBitsFromISR() |
在中断中清零事件标志位 |
xEventGroupSetBits() |
设置事件标志位 |
xEventGroupSetBitsFromISR() |
在中断中设置事件标 |