FreeRTOS——事件标志组

一、事件标志组

        前面所介绍的队列、信号量,只能实现与单个任务进行同步。而有时候某个任务可能需要与多个事件或任务进行同步,此时,事件标志组的作用就凸显出来

1.1 事件标志组简介

事件标志位:用一个位,来表示事件是否发生

事件标志组:一组事件标志位的集合, 可以简单的理解事件标志组,就是一个(16/32)整数

事件标志组是一种实现任务/中断间通信的机制,主要用于实现多任务间的同步

根据configUSE_16_BIT_TICKS 的宏定义不同,每个事件标志组的位数也就不同

        虽然使用了 32 位无符号的数据类型变量来存储事件标志, 但其中的8用作存储事件标志组的控制信息,低24位用作存储事件标志 ,所以说一个事件组最多可以存储 24 个事件标志

        可以发现,事件标志组与外设的状态寄存器SR非常类似,每一位都代表一个事件是否发生(高8位除外) 

1.2 事件标志组与队列、信号量的区别

此外:设置事件不会阻塞等待事件标志支持阻塞 

 

二、事件组结构体

typedef struct EventGroupDef_t
{
    EventBits_t uxEventBits;
    List_t xTasksWaitingForBits; /*< List of tasks waiting for a bit to be set. */

    #if ( configUSE_TRACE_FACILITY == 1 )
        UBaseType_t uxEventGroupNumber;
    #endif

    /* 如果事件组是静态分配,则设置为pdTURE,以确保不尝试释放内存 */
    #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
        uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the event group is statically allocated to ensure no attempt is made to free the memory. */
    #endif
} EventGroup_t;
成员 说明
uxEventBits

EventBits_t类型的变量,其中,

高八位:事件标志组的控制信息

剩余位:存储事件标志(1:发生;2:未发生)

xTasksWaitingForBits 链表,等待事件标志位的任务的链表

三、相关API

函数

描述

xEventGroupCreate()

使用动态方式创建事件标志组

xEventGroupCreateStatic()

使用静态方式创建事件标志组

xEventGroupClearBits()

清零事件标志位

xEventGroupClearBitsFromISR()

在中断中清零事件标志位

xEventGroupSetBits()

设置事件标志位

xEventGroupSetBitsFromISR()

在中断中设置事件标

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值