一、概念
(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);
}