一、概念
(1)用于实现任务与任务、任务与中断之间通信和同步,无数据传输
(2)不同于信号量的是,信号量是一对一的,而事件可以是一对多和多对一的,即一个任务等待多个事件或多个任务等待同一个事件
(3)逻辑与:等待的任意一个事件发生都可以唤醒
(4)逻辑或:等待的事件必须全部发生才会被唤醒
二、常用函数
(1)xEventGroupCreate创建事件组
(2)vEventGroupDelete删除事件组
(3)xEventGroupWaitBits等待事件发生
(4)xEventGroupSetBits设置事件,即置时间组中对应位为1
(5)xEventGroupSetBitsFromISR中断中设置事件
(6)xEventGroupClearBits清除事件
三、示例代码
#include "FreeRTOS.h"
#include "list.h"
#include "event_groups.h"
#include "led.h"void task1(void* params);
void task2(void* params);TaskHandle_t task1Handler;
TaskHandle_t task2Handler;EventGroupHandle_t event;#define EVENT1 (0x01 << 1)
#define EVENT2 (0x01 << 2)int main()
{led_init();close();event = xEventGroupCreate(); //创建事件组if(NULL != event){}portENTER_CRITICAL();//进入临界区//创建两个任务xTaskCreate(task1,"task1",128,NULL,2,&task1Handler);xTaskCreate(task2,"task2",128,NULL,2,&task2Handler);portEXIT_CRITICAL();//退出临界区xPortStartScheduler();//开启任务调度器while(1);
}//任务1设置事件
void task1(void* params)
{xEventGroupSetBits(event,(EVENT1|EVENT2));while(1);
}//任务2等待事件
void task2(void* params)
{EventBits_t uxReturn;uxReturn = xEventGroupWaitBits(event,//事件句柄(EVENT1|EVENT2),//要等待的事件pdTRUE,//事件获取后退出是否要清除对应标志位pdTRUE,//事件与/事件或portMAX_DELAY//等待超时时间);if((uxReturn & (EVENT1|EVENT2)) == (EVENT1|EVENT2)){open();}while(1);
}