事件组:利用队列标记前置任务,通过检查标记拉触发条件任务的机制。
例:存在任务A、B、C、D,C任务需要A或B完成后才可以触发,D任务需要A和B任务都完成才触发。
xEventGroupSetBits()函数可在A、B的对应位置(事件位)写1 or 0(事件标志)用来标记是否完成。
事件组的流程
创建事件组
等待(事件位,所有/任一,超时)
a.关闭调度器 (不会再ISR使用Event Group)
b.当前uxEventBits是否满足:
满足:返回ok,
不满足:
1.返回ERR
2.休眠:放入event_group.xTaskWaitForBits,并将该任务放进DelayList
设置事件
a.设置任务的事件位
b.唤醒所有满足条件的任务
Q:为什么等待时使用关闭调度器而不是关闭中断?
A:xEventGroupSetBits()和xEventGroupSetBitsFromISR()是有区别的,前者可以不受其他任务的影响设置事件标志,后者不会直接设置事件标志,而是将操作推迟到RTOS守护程序任务中,不会立即执行