一、基本介绍
事件标志位:用一位数据标识事件是否已经发生。
事件标志组:一组事件标志位的集合,就是一个整数,其中的每个二进制位都代表了一个事件的状态。
事件标志组有以下几个特点:
1.一个位表示一个事件,但高八位不算。
2.每一位事件的含义可以由用户自己定义。
3.任意中断和任务都可以读写这些位。
4.可以等待某一位成立,也可以等待多位成立。
在FreeRTOS中,事件标志组可以是16位整型或者是32位的整型,当configUSE_16_BIT_TICKS置1时,是uint16_t,置0时,为uint3_t。不论是16位或是32位,其高八位都不能标识事件标志。
事件标志组与队列和信号量有什么区别呢?区别如下:
1、队列、信号量发生时,只会唤醒一个任务,当一个任务占用时,另一个任务就无法获取。而事件标志组在满足条件时,会唤醒所有符合条件的任务,相当于“广播”。
2.队列、信号量都是消耗的资源,队列数据获取之后就删除(一般情况),信号量获取就减少。而信号量可以删除也可以保留。
二、函数介绍
事件标志组相关的函数主要有以下几个:
主要为四种:创建、清除、设置、等待。
1.xEventGroupCreate()
EventGroupHandle_t xEventGroupCreate (void);
返回值为NULL,则创建失败,其他值则事件标志组创建成功,返回其句柄。
2.xEventGroupSetBits()
EventBits_t xEventGroupSetBits(EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToSet)
xEventGroup----待操作的事件标志组句柄。
uxBitsToSet----待设置的事件标志位。
返回值为事件标纸组中的事件标志位值。高八位为0。
3.xEventGroupClearBits()
xEventGroup----待操作的事件标志组句柄。
uxBitsToSet----待清零的事件标志位。
返回值为清零事件标志位之前事件组中事件标志位的值
4.xEventGroupWaitBits()
EventBits_t xEventGroupWaitBits(EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToWaitFor,
const BaseType_t xClearOnExit,
const BaseType_t xWaitForAllBits,
TickType_t xTicksToWait )
形参含义如下:
注意:该函数可以等待一位,也可以等待多位。等到期望的事件后,可以清除某些位。
三、问题与总结
事件标志组占用的内存更小,在应用多任务同步时,可以使用任务通知组。