1. Event Group使用不同Bit表示不同条件。
  2. SetBits只设置指定Bit,不影响其他Bit。
  3. WaitBits可以等待任意条件或全部条件。
  4. 条件不满足时,等待任务进入Blocked。
  5. 最后一个条件满足时,等待任务恢复Ready。
  6. clearOnExit可以在成功后自动清除目标位。
  7. Event Bit只表示0或1,不累计事件次数。
  8. Event Group适合系统状态组合,不适合传递数据。

假设系统只有同时满足以下条件才能启动:

配置加载完成
传感器初始化完成
网络连接完成
#define EVENT_CONFIG_READY  (1U << 0)
#define EVENT_SENSOR_READY  (1U << 1)
#define EVENT_NETWORK_READY (1U << 2)

#define EVENT_ALL_READY \    //EVENT_ALL_READY 标志事件是否全部完成
    (EVENT_CONFIG_READY  | \
     EVENT_SENSOR_READY  | \
     EVENT_NETWORK_READY)

创建事件组

static EventGroupHandle_t xSystemEvents = NULL;
xSystemEvents = xEventGroupCreate();

创建后的事件位初始为:

0x00

即所有条件都没有满足。

创建四个任务:配置加载,传感器初始化,网络初始化,管理

Manager优先级最高,其他的事件处理完之后阻塞结束,立马抢占CPU

xTaskCreate(vConfigTask, "Config",configMINIMAL_STACK_SIZE, NULL, 1, NULL);
xTaskCreate(vSensorTask, "Sensor",configMINIMAL_STACK_SIZE, NULL, 1, NULL);
xTaskCreate(vNetworkTask, "Network",configMINIMAL_STACK_SIZE, NULL, 1, NULL);
xTaskCreate(vSystemManagerTask, "Manager",configMINIMAL_STACK_SIZE, NULL, 2, NULL);

vSystemManagerTask

static void vSystemManagerTask(void *pvParameters)
{
    (void)pvParameters;
    for (;;)
    {
        EventBits_t xBits;
        xBits = xEventGroupWaitBits(xSystemEvents, // 等待哪个事件组
                                    EVENT_ALL_READY, // 等待哪些Bit
                                    pdTRUE,			// 成功后自动清除这些Bit
                                    pdTRUE,			// 必须全部满足
                                    portMAX_DELAY); // 一直等待
        printf("全部完成,Blocked → Running");
    }
}

vConfigTask

static void vConfigTask(void *pvParameters)
{
    (void)pvParameters;
    vTaskDelay(pdMS_TO_TICKS(200));

    for (;;)
    {
        xEventGroupSetBits(xSystemEvents, EVENT_CONFIG_READY);
        vTaskDelete(NULL);
    }
}

vSensorTask

static void vSensorTask(void *pvParameters)
{
    (void)pvParameters;
    vTaskDelay(pdMS_TO_TICKS(400));

    for (;;)
    {
        xEventGroupSetBits(xSystemEvents, EVENT_SENSOR_READY);
        vTaskDelete(NULL);
    }
}

vNetworkTask

static void vNetworkTask(void *pvParameters)
{
    (void)pvParameters;
    vTaskDelay(pdMS_TO_TICKS(700));

    for (;;)
    {
        xEventGroupSetBits(xSystemEvents, EVENT_NETWORK_READY);
        vTaskDelete(NULL);
    }
}