- Event Group使用不同Bit表示不同条件。
- SetBits只设置指定Bit,不影响其他Bit。
- WaitBits可以等待任意条件或全部条件。
- 条件不满足时,等待任务进入Blocked。
- 最后一个条件满足时,等待任务恢复Ready。
- clearOnExit可以在成功后自动清除目标位。
- Event Bit只表示0或1,不累计事件次数。
- 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);
}
}