FreeRTOS 事件组

FreeRTOS 事件组

事件组实现了对多个任务的广播机制,可以用来做多任务的同步。

事件组、标志、位

一个事件标志是一个boolean类型的数,用来指示事件是否发生。这些标志组成了事件组。
事件的状态由事件组中每一位表示,数据类型是EventBits_t
FreeRTOS 事件组
如果某一位为1代表事件发生,0代表没发生

例如:若事件组的数值为0x92,则代表:
FreeRTOS 事件组
每一位的具体含义可以自己定义,事件组可以理解为一个标志位的集合。

EventBits_t

事件组可容纳的位数由宏定义设置
FreeRTOS 事件组

多任务访问

一个事件组可以被多个任务修改,也可以被多个任务读取。

API

事件组创建 xEventGroupCreate()

FreeRTOS 事件组

xEventGroupSetBits() 设置标志位

FreeRTOS 事件组

xEventGroupSetBitsFromISR() 中断中设置标志位、

其实并不是在中断中设置,而是将任务交给Daemon进程
FreeRTOS 事件组

xEventGroupWaitBits() 等待标志位

FreeRTOS 事件组

  • uxBitsToWaitFor指定了哪一位需要等待
  • xWaitForAllBits指定使用与还是或操作(OR/AND)
  • xClearOnExit为pdTRUE时,被uxBitsToWaitFor指定的位会置0,否则不会修改。函数返回值是清除前的状态
    FreeRTOS 事件组
    FreeRTOS 事件组

示例

FreeRTOS 事件组
FreeRTOS 事件组
FreeRTOS 事件组
FreeRTOS 事件组
FreeRTOS 事件组
结果
FreeRTOS 事件组

用事件组任务同步

API

xEventGroupSync()

FreeRTOS 事件组

示例

FreeRTOS 事件组
FreeRTOS 事件组
结果
FreeRTOS 事件组