FreeRTOS学习(六)

6 FreeRTOS事件标志组

  • 6.1 事件标志组的简介
    信号量可以用来完成同步,但是使用信号量来同步的话任务只能与单个的事件或任务进行同步。而有时候某个任务可能会需要与多个事件或任务进行同步,此时信号量将无法完成此类事情。但是FreeRTOS为我们提供了事件标志组。
    事件位
    事件位用来表明某个事件是否发生,事件位通常用作事件标志,具体是当某个事件发生时,其对应的标志位将会被置1,未发生该事件则置0。
    事件组
    一个事件组就是一组事件位,事件组中的事件位通过编号来访问,具体是一个事件组中有很多个事件位,每一个事件位表示某事件是否发生。
    事件标志组和事件标志位的数据类型
    事件标志组的数据类型为EventGroupHandle_t,当configUSE_16_BIT_TICKS为1时,事件标志组就可以存储8个事件位,当config_USE_16_BIT_TICKS为0时,事件标志组存储24个事件位。
    事件标志组中的所有事件位都是存储在一个无符号的EventBits_t类型的变量中,EventBits_t在event_groups.h中作如下定义:

      Typedef TickType_t EventBits_t;
          #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 )0xffff_ffffUL
          	#define portTICK_TYPE_IS_ATOMIC	1
          #endif
    
  • 6.2 创建事件标志组

在这里插入图片描述

函数 xEventGroupCreate( )
EventGroupHandle_t xEventGroupCreate( void );

函数 xEventGroupCreateStatic( )
EnevtGroupHandle_t xEventGroupCreateStatic( StaticEnevtGroup_t *pxEnevtGroupBuffer );

返回值:
NULL:事件标志组创建失败;
其他值:创建成功的时间标志组句柄。
  • 6.3 设置事件位
    函数	描述xEventGroupClearBits( )	任务中将指定的事件位清零xEventGroupClearBitsFromISR( )	中断中将指定的事件位清零xEventGroupSetBits( )	任务中将指定的事件位置1xEventGroupSetBitsFromISR( )	中断中将指定的事件位置1

      函数 xEventGroupClearBits()
      EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup,
      const EventBits_t uxBitsToClear );
      函数 xEventGroupClearBitsFromISR()
      BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup,
      const EventBits_t uxBitsToSet );
      参数:
      xEventGroup :要操作的事件标志组的句柄。
      uxBitsToClear:要清零的事件位,比如要清除 bit3 的话就设置为 0X08。可以同时清
      				除多个bit,如设置为 0X09 的话就是同时清除 bit3 和 bit0。
      返回值:
      pdPASS : 事件位清零成功。
      pdFALSE:  事件位清零失败。
      
      
      函数 xEventGroupSetBits( )
      EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup,
      const EventBits_t uxBitsToSet );
      函数 xEventGroupSetBitsFromISR( )
      BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup,
      const EventBits_t uxBitsToSet,
      BaseType_t * pxHigherPriorityTaskWoken );
    
  • 6.4 获取事件标志组值
    函数	描述xEventGroupGetBits( )	任务中获取当前事件组的值(各个事件位的值)xEventGroupGetBitsFromISR( )	中断中获取当前事件组的值

      函数 xEventGroupGetBits()
      EventBits_t xEventGroupGetBits( EventGroupHandle_t xEventGroup );
      函数 xEventGroupGetBitsFromISR()
      EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup );
      返回值:
      任何值:当前事件标志组的值。
    
  • 6.5 等待指定的事件位
    某个任务可能需要与多个事件进行同步,那么这个任务就需要等待并判断多个事件位(标志),使用函数 xEventGroupWaitBits()可以完成这个功能。调用函数以后如果任务要等待的事件位还没有准备好(置 1 或清零)的话任务就会进入阻塞态,直到阻塞时间到达或者所等待的事件位准备好。函数原型如下:

      EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup,
      														    const EventBits_t uxBitsToWaitFor,
      														    const BaseType_t xClearOnExit,
      														    const BaseType_t xWaitForAllBits,
      														    const TickType_t xTicksToWait );
      参数:
      xEventGroup : 指定要等待的事件标志组。
      uxBitsToWaitFord:指定要等待的事件位,比如要等待bit0和(或)bit2的时候此参数就是
      					0X05,如果要等待 bit0 和(或)bit1 和(或)bit2 的时候此参数就是 
      0X07,以此类推。
      xClearOnExit: 此参数要是为pdTRUE的话,那么在退出此函数之前由参数uxBitsToWait
      				For所设置的这些事件位就会清零。如果设置位 pdFALSE 的话这些事件
      				位就不会改变。
      xWaitForAllBits: 此参数如果设置为 pdTRUE 的话,当 uxBitsToWaitFor 所设置的这些
      			   事件位都置 1,或者指定的阻塞时间到的时候函数 xEventGroupWaitBits()
      才会返回。当此函数为 pdFALSE 的话,只要 uxBitsToWaitFor 所设置的
      这些事件位其中的任意一个置1,或者指定的阻塞时间到的话函数
      xEventGroupWaitBits()就会返回。
      xTicksToWait :  设置阻塞时间,单位为节拍数。
      
      返回值:
      任何值:  返回当所等待的事件位置 1 以后的事件标志组的值,或者阻塞时间到。根据
      		   这个值我们就知道哪些事件位置 1 了。如果函数因为阻塞时间到而返回的话
      		   那么这个返回值就不代表任何的含义。
    
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值