FreeRTOS_事件标志组

目录

1. 事件标志组简介

2. 创建事件标志组

2.1 函数 xEventGroupCreate()

2.2 函数 xEventGroupCreateStatic()

3. 设置事件位

3.1 函数 xEventGroupClearBits()

3.2 函数 xEventGroupClearBitsFromISR()

3.3 函数 xEventGroupSetBits()   

3.4 函数 xEventGroupSetBitsFromISR() 

4. 获取事件标志组值

4.1 函数 xEventGroupGetBits() 

4.2 函数 xEventGroupGetBitsFromISR() 

5. 等待指定的事件位

6. 事件标志组实验

6.1 main.c

6.2 exti.c

6.3 实验现象


        信号量可以来完成同步,但是使用信号量来同步的话任务只能与单个的事件或任务进行同步。但是有时候某个任务可能会需要与多个事件或任务进行同步,此时信号量就无能为力了。FreeRTOS 为此提供了一个解决方法,就是事件标志组。

1. 事件标志组简介

事件位(事件标志):

        事件位用来表明某个事件是否发生,事件位通常用作事件标志,比如下面这几个例子:

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

事件组:

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

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

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

        事件标志组的数据类型为 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 的时候,0xffffffffUL 表示TickType_t 是一个 32 位的数据
类型,因此 EventBits_t 也是一个 32 位的数据类型。
    EventBits_t 类型的变量可以存储 24 个事件位,另外的那高 8 位有其他用处。
    事件 0 存放在这个变量的 bit0 上,变量的 bit1 就是事件位 1,以此类推。

        对于 STM32 来说一个事件标志组最多可以存储 24 个事件位

2. 创建事件标志组

        FreeRTOS 提供了两个用于创建事件标志组的函数。

函数:

        xEventGroupCreate()                使用动态方法创建事件标志组。

        xEventGroupCreateStatic()       使用静态方法创建事件标志组。

2.1 函数 xEventGroupCreate()

        此函数用来创建一个事件标志组,所需要的内存通过动态内存管理方法分配。由于内部处理的原因,事件标志组可用的 bit 数取决于 configUSE_16_BIT_TICKS,当 configUSE_16_BIT_TICKS 为 1 的时候事件标志组有 8 个可用的位(bit 0 ~ bit 7),当 configUSE_16_BIT_TICKS 为 0 的时候事件标志组有 24 个可用的位(bit 0 ~ bit 23)。EventBits_t 类型的变量用来存储事件标志位组中的各个事件位,函数原型如下:

EventGroupHandle_t xEventGroupCreate(void)

参数:

        无

返回值:

        NULL:                事件标志组创建失败。

        其他值:              创建成功的事件标志组句柄。

2.2 函数 xEventGroupCreateStatic()

        此函数用于创建一个事件标志组,所需要的内存需要由用户自行分配,此函数原型如下:

EventGroupHandle_t xEventGroupCreateStatic(StaticEventGroup_t *pxEventGroupBuffer)

参数:

        pxEventGroupBuffer:                参数指向一个 StaticEnentGroup_t 类型的变量,用来保存事件标志组结构体。

返回值:

        NULL:                        事件标志组创建失败。

        其他值:                       创建成功的事件标志组句柄。

3. 设置事件位

        FreeRTOS 提供了 4 个函数用来设置事件标志组中事件位(标志),事件位(标志)的设置包括清零和置 1 两种操作

函数:

        xEventGroupClearBits()                        将指定的事件位清零,用在任务中。

        xEventGroupClearBitsFromISR()          将指定的事件位清零,用在中断服务函数中。

        xEventGroupSetBits()                            将指定的事件位置 1 ,用在任务中。

        xEventGroupSetBitsFromISR()              将指定的事件位置 1,用在中断服务函数中。

3.1 函数 xEventGroupClearBits()

        将事件标志组中的指定事件位清零,此函数只能用在任务中,不能用在中断服务函数中!中断服务函数中有其他的 API 函数。函数原型如下:

EventBits_t xEventGroupClearBits(EventGroupHandle_t xEventGroup,
                                 const EventBits_t  uxBitsToClear);

参数:

      &nb

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值