事件标志组
1. 事件标志组介绍
信号量只能实现任务与单个事件或任务间的同步。但是某些任务可能会需要与多个事件或任务进行同步,此时就可以使用事件标志组来解决。事件标志组能够实现某个任务与多个事件或任务间的同步
- 事件位:用来表明某个事件是否发生,通常用作事件标志
- 事件组:一组事件位组成一个事件组,事件组中的事件位通过编号来访问
事件标志组的数据类型为 EventGroupHandle_t,事件标志组中的所有事件位都存储在一个无符号的 EventBits_t 类型的变量中;该变量为16位数据类型时,事件标志组可以存储8个事件位;该变量为32位数据类型时,事件标志组可以存储24个事件位(高8位均有其他用途)
/***************EventBits_t在event_groups.h中定义**********/
typedef TickType_t EventBits_t;
/***************TickType_t在portmacro.h中定义**************/
#if( configUSE_16_BIT_TICKS == 1 )
typedef uint16_t TickType_t;//事件标志组可以存储8个事件位
#define portMAX_DELAY ( TickType_t ) 0xffff
#else
typedef uint32_t TickType_t;//事件标志组可以存储24个事件位
#define portMAX_DELAY ( TickType_t ) 0xffffffffUL
#define portTICK_TYPE_IS_ATOMIC 1
#endif
2. 事件标志组API函数
2.1 创建事件标志组
/********************动态创建事件标志组**********************************************/
EventGroupHandle_t xEventGroupCreate(void)
/********************静态创建事件标志组**********************************************/
EventGroupHandle_t xEventGroupCreateStatic(StaticEventGroup_t * pxEventGroupBuffer)
//参数:pxEventGroupBuffer指向一个StaticEventGroup_t类型的变量,用来保存事件标志组结构体
/***********************************************************************************/
返回值:创建成功返回事件标志组句柄;失败返回NULL
2.2 设置事件位
/****************将指定的事件位清零,用在任务中***************************************/
EventBits_t xEventGroupClearBits(EventGroupHandle_t xEventGroup,//要操作的事件标志组句柄
const EventBits_t uxBitsToClear)//要清零的事件位
/****************将指定的事件位置1,用在任务中***************************************/
EventBits_t xEventGroupSetBits(EventGroupHandle_t xEventGroup,//要操作的事件标志组句柄
const EventBits_t uxBitsToSet)//要置1的事件位
返回值:将指定事件位清零之前的事件组值;将指定事件位置1后的事件组值
/****************将指定的事件位清零,用在中断服务函数中********************************/
BaseType_t xEventGroupClearBitsFromISR(EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToClear)//要清零的事件位
/****************将指定的事件位置1,用在中断服务函数中********************************/
//#define configUSE_TRACE_FACILITY需要配置为1
BaseType_t xEventGroupSetBitsFromISR(EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToSet,//要置1的事件位
BaseType_t *pxHigherPriorityTaskWoken)//标记退出后是否切换任务
返回值:清零或置1成功返回pdPASS;清零或置1失败返回pdFALSE
指定事件位清零函数xEventGroupClearBits的源码如下示:
EventBits_t xEventGroupClearBits(EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToClear){
EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup;
EventBits_t uxReturn;
taskENTER_CRITICAL();//进入临界段
{
/* 获取当前事件标志位 */
uxReturn = pxEventBits->uxEventBits;
/*