【FreeRTOS】事件组
事件组(event group)
事件组的本质
事件组中高八位不用,给内核使用,剩下的位每一位表示一个事件,还有一个等待链表,链表中有任务在等待事件,任务中有一个整数表示该任务等待的事件,还有事件的关系(与 / 或)。当事件发生时,事件组会遍历等待链表,查看是否有任务可以响应。详细解释可以看下面的图。
事件组的创建与删除
设置事件
在任务中使用 xEventGroupSetBits()
在 ISR 中使用 xEventGroupSetBitsFromISR()
特别注意
ISR中的函数,比如队列函数xQueueSendToBackFromISR、信号量函数xSemaphoreGiveFromISR,它们会唤醒某个任务,最多只会唤醒1个任务。
但是设置事件组时,有可能导致多个任务被唤醒,这会带来很大的不确定性。所以xEventGroupSetBitsFromISR函数不是直接去设置事件组,而是给一个FreeRTOS后台任务(daemon task)发送队列数据,由这个任务来设置事件组。
如果后台任务的优先级比当前被中断的任务优先级高,xEventGroupSetBitsFromISR会设置*pxHigherPriorityTaskWoken为pdTRUE。
如 果 daemon task 成 功 地 把 队 列 数 据 发 送 给 了 后 台 任 务 , 那 么xEventGroupSetBitsFromISR的返回值就是pdPASS。