1、事件标志组简介(了解)
事件标志位:用一个位,来表示事件是否发生。
事件标志组是一组事件标志位的集合, 可以简单的理解事件标志组,就是一个整数。(在stm32中就是32位的无符号的数据类型)
事件标志组的特点:
- 它的每一个位表示一个事件(高8位不算,下有解释)。
- 每一位事件的含义,由用户决定。位的值为1:表示事件发生了;值为0:表示事件未发生。
如:bit0表示按键是否按下,bit1表示是否接受到消息 。 - 任意任务或中断都可以读写这些位。
- 可以等待某一位成立,或者等待多位同时成立。
一个事件组就包含了一个 EventBits_t 数据类型的变量,变量类型 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 位无符号的数据类型
虽然使用了 32 位无符号的数据类型变量来存储事件标志, 但其中的高8位用作存储事件标志组的控制信息,低24位用作存储事件标志 ,所以说一个事件组最多可以存储 24 个事件标志!
事件标志组与队列、信号量的区别
功能 唤醒对象 事件消除 队列、
信号量
事件发生时,只会唤醒一个任务 是消耗型的资源,队列的数据被读走就没了;信号量被获取后就减少了 事件标志组 事件发生时,会唤醒所有符合条件的任务,可以理解为“广播”的作用 被唤醒的任务有两个选择,可以让事件保留不动,也可以清除事件
2、事件标志组相关API函数介绍(熟悉)
函数 | 描述 |
---|---|
xEventGroupCreate() | 使用动态方式创建事件标志组 |
xEventGroupCreateStatic() | 使用静态方式创建事件标志组 |
xEventGroupClearBits() | 清零事件标志位 |
xEventGroupClearBitsFromISR() | 在中断中清零事件标志位 |
xEventGroupSetBits() | 设置事件标志位 |
xEventGroupSetBitsFromISR() | 在中断中设置事件标志位 |
xEventGroupWaitBits() | 等待事件标志位 |
xEventGroupSync() | 设置事件标志位,并等待事件标志位 |
2.1 动态方式创建事件标志组API函数
EventGroupHandle_t xEventGroupCreate ( void )
返回值 | 描述 |
---|---|
NULL | 事件标志组创建失败 |
其他值 | 事件标志组创建成功,返回其句柄 |
- 1.configSUPPORT_DYNAMIC_ALLOCATION 必须在 FreeRTOSConfig.h 中设置为 1,或保留未定义状态(此时 默认为 1)。
- RTOS 源文件 FreeRTOS/source/event_groups.c 必须 包含在构建中。
2.2 清除事件标志位API函数
EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToClear )
形参 | 描述 |
---|---|
xEventGroup | 要在其中清除位的事件组。此事件组必须已通过调用 xEventGroupCreate()事先创建 |
uxBitsToSet | 表示要在事件组中清除一个或多个位的按位值。例如,将 uxBitsToClear 设置为 0x08 以仅清除位 3。将 uxBitsToClear 设置为 0x09 以清除位 3 和位 0。 |
返回值 | 描述 |
---|---|
整数 | 清零事件标志位之前事件组中事件标志位的值 |
RTOS 源文件 FreeRTOS/source/event_groups.c 必须 包含在 xEventGroupClearBits() 函数可用的构建中。
2.3 设置事件标志位API函数
EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet)
形参 | 描述 |
---|---|
xEventGroup | 要设置位的事件组。该 必须已通过 通过调用 xEventGroupCreate() 创建。 |
uxBitsToSet | 指定要在事件组中设置的一个或多个位的按位值。 例如,将 uxBitsToSet 设置为 0x08,可仅设置位 3。将 uxBitsToSet 设置 为 0x09,可设置位 3 和位 0。 |
返回值 | 描述 |
---|---|
整数 | 函数返回时,事件组中的事件标志位值 |
在事件组中设置位将自动解除 所有等待位的任务的阻塞态。
RTOS 源文件 FreeRTOS/source/event_groups.c 必须 包含在构建中,xEventGroupSetBits() 函数才可用。
2.4 等待事件标志位API函数
EventBits_t xEventGroupWaitBits(EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToWaitFor,const BaseType_t xClearOnExit,const BaseType_t xWaitForAllBits, TickType_t xTicksToWait)
形参 | 描述 |
---|---|
xEvenrGroup | 等待的事件标志组句柄 |
uxBitsToWaitFor | 等待的事件标志位,要等待第 0 位和/或第 1 位和/或第 2 位, 请设置 uxBitsToWaitFor 为 0x07, 以此类推 |
xClearOnExit | 成功等待到事件标志位后,清除事件组中对应的事件标志位, pdTRUE :清除uxBitsToWaitFor指定位; pdFALSE:不清除 |
xWaitForAllBits | 等待 uxBitsToWaitFor 中的所有事件标志位(逻辑与) pdTRUE:等待的位,全部为1 pdFALSE:等待的位,某个为1 |
xTicksToWait | 等待的阻塞时间 |
返回值 | 描述 |
---|---|
等待的事件标志位值 | 等待事件标志位成功,返回等待到的事件标志位 |
其他值 | 等待事件标志位失败,返回事件组中的事件标志位 |
特点:可以等待某一位、也可以等待多位;等到期望的事件后,还可以清除某些位。
2.5 同步函数
EventBits_t xEventGroupSync(EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToSet,const EventBits_t uxBitsToWaitFor,TickType_t xTicksToWait)
形参 | 描述 |
---|---|
xEventGroup | 等待事件标志所在事件组 |
uxBitsToSet | 达到同步点后,要设置的事件标志 |
uxBitsToWaitFor | 等待的事件标志 |
xTicksToWait | 等待的阻塞时间 |
返回值 | 描述 |
---|---|
等待的事件标志位值 | 等待事件标志位成功,返回等待到的事件标志位 |
其他值 | 等待事件标志位失败,返回事件组中的事件标志位 |
如果设置了 uxBitsToWait 参数指定的位, 或者在该时间内设置了这些位,则该函数将在其阻塞时间到期之前返回。在 这种情况下,uxBitsToWait 指定的所有位将在 函数返回之前自动清除。
RTOS源文件 FreeRTOS/source/event_groups.c 必须 包含在构建中,确保 xEventGroupSync()函数可用。
例子:
Task1:做菜
Task2:做饭
Task1做好自己的事之后,需要等待饭也做好,大家在一起吃饭。
特点:
同步