FreeRTOS事件标志组

3 篇文章 0 订阅
1 篇文章 0 订阅

1、事件标志组简介(了解)

事件标志位:用一个位,来表示事件是否发生。

事件标志组是一组事件标志位的集合, 可以简单的理解事件标志组,就是一个整数。(在stm32中就是32位的无符号的数据类型)

事件标志组的特点

  1. 它的每一个位表示一个事件(高8位不算,下有解释)。
  2. 每一位事件的含义,由用户决定。位的值为1:表示事件发生了;值为0:表示事件未发生。
    如:bit0表示按键是否按下,bit1表示是否接受到消息 。
  3. 任意任务或中断都可以读写这些位。
  4. 可以等待某一位成立,或者等待多位同时成立。

一个事件组就包含了一个 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. 1.configSUPPORT_DYNAMIC_ALLOCATION 必须在 FreeRTOSConfig.h 中设置为 1,或保留未定义状态(此时 默认为 1)。
  2. 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做好自己的事之后,需要等待饭也做好,大家在一起吃饭。

特点:

同步

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DDKevin19

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值