事件标志组
事件标志组简介
事件标志
事件标志是一个用于指示事件是否发生的布尔值,一个事件标志只有 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)
Comments NOTHING