freeRTOS 事件标志组

任务需要与多个事件或任务进行同步时,需要用到事件标志组。

一个事件组就是一组的事件位, 事件组中的事件位通过位编号来访问。

 

事件标志组的数据类型为 EventGroupHandle_t。

 

事件标志组中的所有事件位都存储在一个无符号的 EventBits_t 类型的变量中。

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 ) 0xffffffffUL
    #define portTICK_TYPE_IS_ATOMIC 1
#endif

EventBits_t 类型的变量可以存储(32-8=24个)(或16-8=8个)事件位,另外高 8 位另有他用。 

 

创建
EventGroupHandle_t xEventGroupCreate( void ) EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer ) 设置 EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ); 返回事件清零之前的状态 BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ); 返回成功或失败 EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ); BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t * pxHigherPriorityTaskWoken );

用法:
//事件标志组句柄
extern EventGroupHandle_t EventGroupHandler;
//中断服务函数
void EXTI3_IRQHandler(void)
{
  BaseType_t Result,xHigherPriorityTaskWoken;
  delay_xms(50); //消抖
  if(KEY0==0)
  {
    Result=xEventGroupSetBitsFromISR(EventGroupHandler, EVENTBIT_0, &xHigherPriorityTaskWoken);
    if(Result!=pdFAIL)
    {
      portYIELD_FROM_ISR(xHigherPriorityTaskWoken); 根据higherPrioTaskWoken的值,置位PendSV
    }
  }
  __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_3); //清除中断标志位
}



获取
EventBits_t xEventGroupGetBits( EventGroupHandle_t xEventGroup )
EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup )


等待
EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup,
                    const EventBits_t uxBitsToWaitFor,
                    const BaseType_t xClearOnExit,
const BaseType_t xWaitForAllBits,
const TickType_t xTicksToWait );
uxBitsToWaitFor: 要等待 bit0()bit2的时候此参数就是 0x05,如果要等待 bit0 ()bit1 ()bit2 的时候此参数就是 0x07,以此类推。
xClearOnExit: 此参数要是为 pdTRUE 的话,那么在退出此函数之前由参数 uxBitsToWaitFor所设置的这些事件位就会清零
xWaitForAllBits: 此参数如果设置为 pdTRUE 的话, 当 uxBitsToWaitFor 所设置的这些事件位都置 1, 或者指定的阻塞时间到的时候函数 xEventGroupWaitBits()才会返回。
当此函数为 pdFALSE 的话,只要 uxBitsToWaitFor 所设置的这些事件位其中的任意一个置1,或者指定的阻塞时间到的话函数xEventGroupWaitBits()就会返回。

返回值:
返回当所等待的事件位置 1 以后的事件标志组的值,或者阻塞时间到。
根据这个值我们就知道哪些事件位置 1 了。
如果函数因为阻塞时间到而返回
的话那么这个返回值就不代表任何的含义。

 

 

函数的代码在 event_groups.c/.h 里面

 

 

 

 

 

 

 

留白

posted @ 2017-11-24 14:27  为民除害  阅读(1313)  评论(0编辑  收藏  举报