(七)事件组

本文介绍了FreeRTOS中事件组的概念,如何使用xEventGroupCreate、xEventGroupWaitBits等函数进行任务间的通信和同步,以及在中断中的应用示例。
摘要由CSDN通过智能技术生成

欢迎入群共同学习交流

一、概念

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

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值