(七)事件组

发布于:2024-03-22 ⋅ 阅读:(93) ⋅ 点赞:(0)

一、概念

(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);
}