B站Michale_ee——ESP32_IDF SDK——FreeRTOS_5 事件组同步与等待
一、事件组等待
1.API简介
(1)创建事件组
(2)等待事件组中是否有相应的位被设置
(3)设置事件组中相应位
2.示例代码及运行结果
#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "esp_system.h"
#include "freertos/event_groups.h" // add by lxl#define BIT_0 ( 1 << 0 )
#define BIT_4 ( 1 << 4 )
EventGroupHandle_t xCreatedEventGroup;
TaskHandle_t Task1Handle = NULL;void Task1(void *pvparam)
{while(1){printf("Task1 begin to wait\n");xEventGroupWaitBits(xCreatedEventGroup, BIT_0 | BIT_4, pdTRUE, pdTRUE, portMAX_DELAY);printf("Task1 BIT_0 and BIT_4 is Set!\n");vTaskDelay(pdMS_TO_TICKS(1000));}
}void Task2(void *pvparam)
{vTaskDelay(pdMS_TO_TICKS(1000));while(1){printf("Task2 begin to set bit0\n");xEventGroupSetBits(xCreatedEventGroup, BIT_0);vTaskDelay(pdMS_TO_TICKS(5000));printf("Task2 begin to set bit0\n");xEventGroupSetBits(xCreatedEventGroup, BIT_4);vTaskDelay(pdMS_TO_TICKS(5000));}
}void app_main(void)
{xCreatedEventGroup = xEventGroupCreate();if( xCreatedEventGroup == NULL ){printf("EventGroup create fail.\n");}else{printf("EventGroup create success.\n");vTaskSuspendAll();xTaskCreatePinnedToCore(Task1, "Task1", 1024*5, NULL, 1, &Task1Handle, 1); //! ESP32-S3为双核,CPU0主要运行WiFi和蓝牙;CPU1用于运行应用程序;xTaskCreatePinnedToCore(Task2, "Task2", 1024*5, NULL, 1, NULL, 1);xTaskResumeAll();}
}
二、事件组同步
1.事件组等待与事件组同步的区别
2.API 简介
3.示例代码及运行结果
#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "esp_system.h"
#include "freertos/event_groups.h" // add by lxl#define TASK_0_BIT ( 1 << 0 )
#define TASK_1_BIT ( 1 << 1 )
#define TASK_2_BIT ( 1 << 2 )
#define ALL_SYNC_BITS ( TASK_0_BIT | TASK_1_BIT | TASK_2_BIT )EventGroupHandle_t xEventBits;
TaskHandle_t Task1Handle = NULL;void Task0(void *pvparam)
{while(1){printf("Task0 begin\n");vTaskDelay(pdMS_TO_TICKS(1000));printf("Task0 Set BIT_0!\n");xEventGroupSync(xEventBits, TASK_0_BIT, ALL_SYNC_BITS, portMAX_DELAY);printf("Task0 Sync\n");vTaskDelay(pdMS_TO_TICKS(10000));}
}void Task1(void *pvparam)
{while(1){printf("Task1 begin\n");vTaskDelay(pdMS_TO_TICKS(3000));printf("Task1 Set BIT_1!\n");xEventGroupSync(xEventBits, TASK_1_BIT, ALL_SYNC_BITS, portMAX_DELAY);printf("Task1 Sync\n");vTaskDelay(pdMS_TO_TICKS(10000));}
}void Task2(void *pvparam)
{while(1){printf("Task2 begin\n");vTaskDelay(pdMS_TO_TICKS(5000));printf("Task2 Set BIT_2!\n");xEventGroupSync(xEventBits, TASK_2_BIT, ALL_SYNC_BITS, portMAX_DELAY);printf("Task2 Sync\n");vTaskDelay(pdMS_TO_TICKS(10000));}
}void app_main(void)
{xEventBits = xEventGroupCreate();if( xEventBits == NULL ){printf("EventGroup create fail.\n");}else{printf("EventGroup create success.\n");vTaskSuspendAll();xTaskCreatePinnedToCore(Task0, "Task0", 1024*5, NULL, 1, NULL, 1); //! ESP32-S3为双核,CPU0主要运行WiFi和蓝牙;CPU1用于运行应用程序;xTaskCreatePinnedToCore(Task1, "Task1", 1024*5, NULL, 1, NULL, 1);xTaskCreatePinnedToCore(Task2, "Task2", 1024*5, NULL, 1, NULL, 1);xTaskResumeAll();}
}