FREERTOS事件标志组

事件标志组

1. 事件标志组介绍

信号量只能实现任务与单个事件或任务间的同步。但是某些任务可能会需要与多个事件或任务进行同步,此时就可以使用事件标志组来解决。事件标志组能够实现某个任务与多个事件或任务间的同步

  • 事件位:用来表明某个事件是否发生,通常用作事件标志
  • 事件组:一组事件位组成一个事件组,事件组中的事件位通过编号来访问
事件标志组的数据类型为  EventGroupHandle_t,事件标志组中的所有事件位都存储在一个无符号的  EventBits_t 类型的变量中;该变量为16位数据类型时,事件标志组可以存储8个事件位;该变量为32位数据类型时,事件标志组可以存储24个事件位(高8位均有其他用途)
/***************EventBits_t在event_groups.h中定义**********/
typedef TickType_t EventBits_t;
/***************TickType_t在portmacro.h中定义**************/
#if( configUSE_16_BIT_TICKS == 1 )
    typedef uint16_t TickType_t;//事件标志组可以存储8个事件位
    #define portMAX_DELAY ( TickType_t ) 0xffff
#else
    typedef uint32_t TickType_t;//事件标志组可以存储24个事件位
    #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
    #define portTICK_TYPE_IS_ATOMIC 1
#endif

2. 事件标志组API函数

2.1 创建事件标志组

/********************动态创建事件标志组**********************************************/
EventGroupHandle_t xEventGroupCreate(void)
/********************静态创建事件标志组**********************************************/
EventGroupHandle_t xEventGroupCreateStatic(StaticEventGroup_t * pxEventGroupBuffer)
//参数:pxEventGroupBuffer指向一个StaticEventGroup_t类型的变量,用来保存事件标志组结构体
/***********************************************************************************/
返回值:创建成功返回事件标志组句柄;失败返回NULL

2.2 设置事件位

/****************将指定的事件位清零,用在任务中***************************************/
EventBits_t xEventGroupClearBits(EventGroupHandle_t xEventGroup,//要操作的事件标志组句柄
                                 const EventBits_t uxBitsToClear)//要清零的事件位
/****************将指定的事件位置1,用在任务中***************************************/
EventBits_t xEventGroupSetBits(EventGroupHandle_t xEventGroup,//要操作的事件标志组句柄
                               const EventBits_t uxBitsToSet)//要置1的事件位
返回值:将指定事件位清零之前的事件组值;将指定事件位置1后的事件组值
/****************将指定的事件位清零,用在中断服务函数中********************************/
BaseType_t xEventGroupClearBitsFromISR(EventGroupHandle_t xEventGroup,
                                       const EventBits_t uxBitsToClear)//要清零的事件位                           
/****************将指定的事件位置1,用在中断服务函数中********************************/
//#define configUSE_TRACE_FACILITY需要配置为1
BaseType_t xEventGroupSetBitsFromISR(EventGroupHandle_t xEventGroup, 
                                     const EventBits_t uxBitsToSet,//要置1的事件位
                            BaseType_t *pxHigherPriorityTaskWoken)//标记退出后是否切换任务
返回值:清零或置1成功返回pdPASS;清零或置1失败返回pdFALSE
指定事件位清零函数xEventGroupClearBits的源码如下示:
EventBits_t xEventGroupClearBits(EventGroupHandle_t xEventGroup,
                                const EventBits_t uxBitsToClear){
    EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup;
    EventBits_t uxReturn;
    taskENTER_CRITICAL();//进入临界段
    {
        /* 获取当前事件标志位 */
        uxReturn = pxEventBits->uxEventBits;
        /*
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值