Free的事件标志组

一、简介

使用信号量来同步的话任务只能与单个的事件或任务进行同步,但是有时候需要多个事件或者多个任务进行同步,这时候就不适合使用信号量。

1、事件位

事件位用来表示某个事件是否发生,事件位通常用作事件标志。比如以下的几个例子:

  • 当收到一条消息并且把这条消息处理掉以后就可以将某个位(标志)置 1,当队列中没有消息需要处理的时候就可以将这个位(标志)置 0。
  • 当把队列中的消息通过网络发送输出以后就可以将某个位(标志)置 1,当没有数据需要从网络发送出去的话就将这个位(标志)置 0。
  • 现在需要向网络中发送一个心跳信息,将某个位(标志)置 1。现在不需要向网络中发送心跳信息,这个位(标志)置 0。

2、事件组

一个事件组就是一组的事件位,事件组中的事件位通过位编号来访问,同样,以上面列出的三个例子为例:

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

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

事件标志组的句柄类型为 EventGroupHandle_t,当 configUSE_16_BIT_TICKS 为 1 的时候事件标志组可以存储 8 个事件位,当 configUSE_16_BIT_TICKS 为 0 的时候事件标志组存储 24个事件位。
事件标志组中的所有事件位都存储在一个无符号的EventBits_t类型的变量中,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;
#define portMAX_DELAY ( TickType_t ) 0xffff
#else
typedef uint32_t TickType_t;
#define portMAX_DELAY ( TickType_t ) 0xffffffffUL
#define portTICK_TYPE_IS_ATOMIC 1
#endif

当configUSE_16_BIT_TICKS为0的时候TickType_t是个32位的数据类型,因此EventBits_t也是个32位的数据类型。EventBits_t 类型的变量可以存储24个事件位,另外的那高8位有其他用。

二、相关函数

1、创建事件标志组

一、简介

使用信号量来同步的话任务只能与单个的事件或任务进行同步,但是有时候需要多个事件或者多个任务进行同步,这时候就不适合使用信号量。

1、事件位

事件位用来表示某个事件是否发生,事件位通常用作事件标志。比如以下的几个例子:

  • 当收到一条消息并且把这条消息处理掉以后就可以将某个位(标志)置 1,当队列中没有消息需要处理的时候就可以将这个位(标志)置 0。
  • 当把队列中的消息通过网络发送输出以后就可以将某个位(标志)置 1,当没有数据需要从网络发送出去的话就将这个位(标志)置 0。
  • 现在需要向网络中发送一个心跳信息,将某个位(标志)置 1。现在不需要向网络中发送心跳信息,这个位(标志)置 0。

2、事件组

一个事件组就是一组的事件位,事件组中的事件位通过位编号来访问,同样,以上面列出的三个例子为例:

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

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

事件标志组的句柄类型为 EventGroupHandle_t,当 configUSE_16_BIT_TICKS 为 1 的时候事件标志组可以存储 8 个事件位,当 configUSE_16_BIT_TICKS 为 0 的时候事件标志组存储 24个事件位。
事件标志组中的所有事件位都存储在一个无符号的EventBits_t类型的变量中,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;
#define portMAX_DELAY ( TickType_t ) 0xffff
#else
typedef uint32_t TickType_t;
#define portMAX_DELAY ( TickType_t ) 0xffffffffUL
#define portTICK_TYPE_IS_ATOMIC 1
#endif

当configUSE_16_BIT_TICKS为0的时候TickType_t是个32位的数据类型,因此EventBits_t也是个32位的数据类型。EventBits_t 类型的变量可以存储24个事件位,另外的那高8位有其他用。

二、相关函数

1、创建事件标志组

创建事件标志组

  • 函数xEventGroupCreate()
    此函数用于创建一个事件标志组,是通过动态内存管理方法分配。由于内部处理的原因,事件标志组可用的 bit 数取决于 configUSE_16_BIT_TICKS , 当configUSE_16_BIT_TICKS1 为 1 的 时 候 事 件 标 志 组 有 8 个 可 用 的 位 (bit0~bit7) , 当configUSE_16_BIT_TICKS 为 0 的时候事件标志组有 24 个可用的位(bit0~bit23)。EventBits_t 类型的变量用来存储事件标志组中的各个事件位,
返回值: 
NULL: 事件标志组创建失败。
其他值: 创建成功的事件标志组句柄。

EventGroupHandle_t xEventGroupCreate( void )
  • xEventGroupCreateStatic()
返回值: 
NULL: 事件标志组创建失败。
其他值: 创建成功的事件标志组句柄。

EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer )
//参数是保存事件标志组结构体

2、设置事件位

事件位清零
事件位置1

  • xEventGroupClearBits()
xEventGroup:	要操作的事件标志组的句柄。
uxBitsToClear: 要清零的事件位,比如要清除 bit3 的话就设置为 0X08。可以同时清除多个bit。
如设置为 0X09 的话就是同时清除 bit3 和 bit0。

EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, 
								  const EventBits_t uxBitsToClear );
  • xEventGroupClearBitsFromISR()
xEventGroup: 要操作的事件标志组的句柄。
uxBitsToClear: 要清零的事件位

BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, 
										const EventBits_t uxBitsToSet );
  • xEventGroupSetBits()
xEventGroup: 要操作的事件标志组的句柄。
uxBitsToClear: 指定要置 1 的事件位,比如要将 bit3 值 1 的话就设置为 0X08。可以同时将多个 
bit 置 1,如设置为 0X09 的话就是同时将 bit3 和 bit0 置 1。
EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, 
 								const EventBits_t uxBitsToSet );
  • xEventGroupSetBitsFromISR()
BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, //要操作的事件标志组的句柄。
									  const EventBits_t uxBitsToSet, //要置 1 的事件位
									  BaseType_t * pxHigherPriorityTaskWoken );//是否进行任务切换的标志

3、获取事件标志组值

获取事件标志组的值

  • xEventGroupGetBits()
参数:xEventGroup: 要获取的事件标志组的句柄。
返回值:当前事件标志组的值

EventBits_t xEventGroupGetBits( EventGroupHandle_t xEventGroup )
  • xEventGroupGetBits()
》》》用于中断中《《《《

EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup )

4、等待指定的事件位(常用函数)

某个任务可能需要与多个事件进行同步,那么这个任务就需要等待并判断多个事件位(标 志),使用函数 xEventGroupWaitBits()可以完成这个功能。调用函数以后如果任务要等待的事件位还没有准备好(置 1 或清零)的话任务就会进入阻塞态,直到阻塞时间到达或者所等待的事件位准备好。

EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup,//要等待的事件标志组
								const EventBits_t uxBitsToWaitFor,//:指定要等待的事件
								//位,比如要等待bit0和(或)bit2的时候此参数就是0X05
								const BaseType_t xClearOnExit,//此参数要是为pdTRUE的话,
								//那么在退出此函数之前由参数uxBitsToWaitFor所设置的这些
								//事件位就会清零。如果设置位 pdFALSE 的话这些事件位就不会改变。
								const BaseType_t xWaitForAllBits,
					/**
					此参数如果设置为 pdTRUE 的话,当 uxBitsToWaitFor 所设置的这些事件
					位都置 1,或者指定的阻塞时间到的时候函数 xEventGroupWaitBits()才会
					返回。当此函数为 pdFALSE 的话,只要 uxBitsToWaitFor 所设置的这些事
					件 位 其 中 的 任 意 一 个 置 1 , 或 者 指 定 的 阻 塞 时 间 到 的 话 函 数
					xEventGroupWaitBits()就会返回。
					**/
								const TickType_t xTicksToWait );//设置的阻塞时间
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值