事件标志组

发布于 2023-08-11  900 次阅读


内容纲要

事件标志组

事件标志组简介

事件标志

​ 事件标志是一个用于指示事件是否发生的布尔值,一个事件标志只有 0 或 1 两种状态, FreeRTOS 将多个事件标志储存在一个变量类型为 EventBits_t 变量中,这个变量就是事件组。

事件组

typedef TickType_t EventBits_t;
#if ( configUSE_16_BIT_TICKS == 1 )
 typedef uint16_t TickType_t;
#else
 typedef uint32_t TickType_t;
#endif
#define configUSE_16_BIT_TICKS 0

​ 从上面可以看出,EventBits_t 实际上是一个 16 位或 32 位无符号的数据类型。当 configUSE_16_BIT_TICKS 配置为 0 时,EventBits_t 是一个 32 位无符号的数据类型;当 configUSE_16_BIT_TICKS 配置为 1 时,EventBits_t 是一个 16 为无符号的数据类型。在本套教 程的所有配套例程中,都将配置项 configUSE_16_BIT_TICKS 配置为 0,因此本文就以 EventBits_t 为 32 位无符号数据类型为例进行讲解,对于另外一种情况,也是大同小异的。

​ 虽然说使用了 32 位无符号的数据类型变量来存储事件标志,但这并不意味着,一个 EventBits_t 数据类型的变量能够存储 32 个事件标志,FreeRTOS 将这个 EventBits_t 数据类型的 变量拆分成两部分,其中低 24 位[23:0](configUSE_16_BIT_TICKS 配置位 1 时,是低 8 位[7:0]) 用于存储事件标志,而高 8 位[31:24](configUSE_16_BIT_TICKS 配置位 1 时,依然是高 8 位 [15:8])用作存储事件标志组的一些控制信息,也就是说一个事件组最多可以存储 24 个事件标 志。EventBits_t 数据类型变量的位使用情况如下图所示:

​ 从上图中可以看到,变量中低 24 位中的每一位都是一个事件标志,当某一位被置一时,就 表示这一位对应的事件发生了。

FreeRTOS 事件标志组相关 API 函数

创建事件标志组

​ FreeRTOS 提供了两种创建事件标志组的方式,分别为动态方式创建事件标志组静态方式创建事件标志组,两者的区别在于静态方式创建事件标志组时,需要用户提供创建事件标志 组所需的内存空间,而使用动态方式创建事件标志组时,FreeRTOS 会自动从 FreeRTOS 管理的 堆中分配创建事件标志组所需的内存空间。

动态方式创建事件标志组

API 函数的函数原型
EventGroupHandle_t xEventGroupCreate(void);
形参描述

返回值

静态方式创建事件标志组

API 函数的函数原型
EventGroupHandle_t xEventGroupCreateStatic(
    StaticEventGroup_t * pxEventGroupBuffer);
形参描述

返回值

删除事件标志组

API 函数的函数原型

void vEventGroupDelete(EventGroupHandle_t xEventGroup);

形参描述

返回值

等待事件标志位

API 函数的函数原型

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

形参描述

返回值

设置事件标志位

在任务中设置事件标志位

API 函数的函数原型
EventBits_t xEventGroupSetBits(
 EventGroupHandle_t xEventGroup,
 const EventBits_t uxBitsToSet)
形参描述

返回值

在中断中设置事件标志位

API 函数的函数原型
BaseType_t xEventGroupSetBitsFromISR(
 EventGroupHandle_t xEventGroup,
 const EventBits_t uxBitsToSet,
 BaseType_t * pxHigherPriorityTaskWoken)
形参描述

返回值

清零事件标志位

在任务中清零事件标志位

API 函数的函数原型
EventBits_t xEventGroupClearBits(
 EventGroupHandle_t xEventGroup,
 const EventBits_t uxBitsToClear)
形参描述

返回值

在中断中清零事件标志位

API 函数的函数原型
BaseType_t xEventGroupClearBitsFromISR(
 EventGroupHandle_t EventGroup,
 const EventBits_t uxBitsToClear)
形参描述

返回值

获取事件组中事件标志位的值

在任务中获取事件组中事件标志位值

API 函数的函数原型
EventBits_t xEventGroupGetBits(xEventGroup);
形参描述

返回值

在中断中获取事件组中事件标志位值

API 函数的函数原型
EventBits_t xEventGroupGetBitsFromISR(EventGroupHandle_t xEventGroup);
形参描述

返回值

函数 xEventGroupSync()

​ 此函数一般用于多任务同步,其中每个任务都必须等待其他任务达到同步点,然后才能继续执行。函数 xEventGroupSync()的函数原型如下所示:

EventBits_t xEventGroupSync(
 EventGroupHandle_t xEventGroup,
 const EventBits_t uxBitsToSet,
 const EventBits_t uxBitsToWaitFor,
 TickType_t xTicksToWait)

形参描述

返回值

世界のネズミは彼らが望むものに依存し、彼らは彼ら自身から誰も求めません
最后更新于 2023-08-27