第十六章 FreeRTOS的事件标志组

目录

一. 事件标志组简介

1.1 事件标志位

1.2 事件标志组

1.3 事件标志组的特点

1.4 事件标志组和事件标志位的数据类型

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

三. 事件标志组的相关函数

3.1 动态方式创建事件标志组

3.2 设置事件标志位

3.3 清除事件标志位函数

3.4 等待事件标志位


一. 事件标志组简介

1.1 事件标志位

事件标志位用于表明某个事件是否发生。

比如下面的几个例子:


1. 当收到一条消息并且把这条消息处理完以后,就可以将某个位(标志) 置1;当队列中没有消息需要处理的时候,就可以将这个位(标志) 置0。

2. 当把队列中的消息通过网络发送以后,就可以将某个位(标志) 置1,当没有数据需要从网络发送出去的话,就可以这个位(标志) 置0。


3. 当需要向网络中发送一个心跳信息,将某个位(标志)置1。现在不需要项网络中发送心跳信息,这个位(标志)置0。


1.2 事件标志组

事件标志组是一组事件标志位的集合, 可以简单的理解事件标志组,就是一个整数。


同样,以上面列出的三个例子为例:


事件标志组bit0 表示队列中的消息是否处理掉。
事件标志组bit1 表示是否有信息需要从网络中发送出去。
事件标志组bit2 表示现在是否需要向网路发送心跳信息。


1.3 事件标志组的特点

① 它的每一个位表示一个事件(高8位不算)

② 每一位事件的含义,由用户自己决定,如:bit0表示按键是否按下,bit1表示是否接受到消息

③ 任意任务或中断都可以读写这些位

④ 可以等待某一位成立,或者等待多位同时成立


1.4 事件标志组和事件标志位的数据类型

一个事件组就包含了一个 EventBits_t 数据类型的变量,当configUSE_16_BIT_TICKS1 的时候,事件标志组可以存储 16 个事件位,当 configUSE_16_BIT_TICKS0 的时候,事件标志组可以存储 32 个事件位

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

变量类型 EventBits_t 的定义如下所示:

#if( configUSE_16_BIT_TICKS == 1 )
	typedef uint16_t TickType_t;
	#define portMAX_DELAY ( TickType_t ) 0xffff
#else
	typedef uint32_t TickType_t;
	#define portMAX_DELAY ( TickType_t ) 0xffffffffUL

	/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do
	not need to be guarded with a critical section. */
	#define portTICK_TYPE_IS_ATOMIC 1
#endif

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

功能

唤醒对象

事件清除

队列、信号量

事件发生时,只会唤醒一个任务

是消耗型的资源,队列的数据被读走就没了;信号量被获取后就减少了

事件标志组

事件发生时,会唤醒所有符合条件的任务,可以理解为“广播”的作用

被唤醒的任务有两个选择,可以让事件保留不动,也可以清除事件

三. 事件标志组的相关函数

函数

描述

xEventGroupCreate()

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

xEventGroupCreateStatic()

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

xEventGroupClearBits()

清零事件标志位

xEventGroupClearBitsFromISR()

在中断中清零事件标志位

xEventGroupSetBits()

设置事件标志位

xEventGroupSetBitsFromISR()

在中断中设置事件标志位

xEventGroupWaitBits()

等待事件标志位

xEventGroupSync()

设置事件标志位,并等待事件标志位

3.1 动态方式创建事件标志组

EventGroupHandle_t xEventGroupCreate( void )
返回值描述

NULL

事件标志组创建失败

其他值

事件标志组创建成功,返回其句柄

3.2 设置事件标志位

EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet )
形参描述

xEventGroup

待操作的事件标志组句柄

uxBitsToSet

待设置的事件标志位

返回值

描述

整数

函数返回时,事件组中的事件标志位值

3.3 清除事件标志位函数

EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear )
形参描述

xEventGroup

待操作的事件标志组句柄

uxBitsToClear

待清零的事件标志位

返回值

描述

整数

清零事件标志位之前事件组中事件标志位的值

3.4 等待事件标志位

      某个任务可能需要与多个事件进行同步,那么这个任务就需要等待并判断多个事件标志位,使用函数 xEventGroupWaitBits()可以完成这个功能。

      调用函数以后,如果任务要等待的事件位还没有准备好 (置1或清零),任务就会进入阻塞态,直到阻塞时间达到 或者 所等待的事件位准备好。

EventBits_t   xEventGroupWaitBits(EventGroupHandle_t xEventGroup,
                                  const EventBits_t  uxBitsToWaitFor,
                                  const BaseType_t 	 xClearOnExit,
                                  const BaseType_t 	 xWaitForAllBits,
                                  TickType_t 		 xTicksToWait  
                                 )

形参

描述

xEvenrGroup

等待的事件标志组句柄

uxBitsToWaitFor

等待的事件标志位,可以用逻辑或等待多个事件标志位

xClearOnExit

成功等待到事件标志位后,清除事件组中对应的事件标志位,

pdTRUE  :清除uxBitsToWaitFor指定位;

pdFALSE:不清除

xWaitForAllBits

等待 uxBitsToWaitFor 中的所有事件标志位(逻辑与)

pdTRUE:等待的位,全部为1

pdFALSE:等待的位,某个为1

xTicksToWait

等待的阻塞时间

返回值

描述

等待的事件标志位值

等待事件标志位成功,返回等待到的事件标志位

其他值

等待事件标志位失败,返回事件组中的事件标志位

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值