1、 xEventGroupSync 函数介绍
/*
**参数1:事件组句柄
**参数2:当前任务设置的标志位
**参数3:要等到的所有标志位
**参数4:等待时间
**返回值:发生事件
*/
EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToSet,
const EventBits_t uxBitsToWaitFor,
TickType_t xTicksToWait )
2、 创建任务和事件组
void m_create_event_group_sync(void)
{
xEventBits = xEventGroupCreate();
xTaskCreate(sync1_task, "sync1_task", configMINIMAL_STACK_SIZE + 200, NULL, 3, &sync1_task_handle);
xTaskCreate(sync2_task, "sync2_task", configMINIMAL_STACK_SIZE + 200, NULL, 3, &sync2_task_handle);
xTaskCreate(sync3_task, "sync3_task", configMINIMAL_STACK_SIZE + 200, NULL, 3, &sync3_task_handle);
}
3、 编写内存的测试任务入口函数
#include "event_groups.h"
#ifndef TAG_BLE
#define LOG_BLE(...)
#endif
#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 )
static EventGroupHandle_t xEventBits =NULL;
static TaskHandle_t sync1_task_handle;
static TaskHandle_t sync2_task_handle;
static TaskHandle_t sync3_task_handle;
static void sync1_task (void * pvParameter)
{
EventBits_t uxReturn;
TickType_t temp_tick = xTaskGetTickCount();
uint16_t temp;
while(1)
{
vTaskDelay(configTICK_RATE_HZ*2);//任务处理需要2秒时间
uxReturn = xEventGroupSync( xEventBits, TASK_0_BIT, ALL_SYNC_BITS, portMAX_DELAY );//等待另外2个任务处理完成
temp = pdMS_TO_TICKS(xTaskGetTickCount()>temp_tick?xTaskGetTickCount()-temp_tick:0);
if( ( uxReturn & ALL_SYNC_BITS ) == ALL_SYNC_BITS )
{
LOG_BLE("task1 wake:%dMs\n",temp);
}
temp_tick = xTaskGetTickCount();
}
}
static void sync2_task (void * pvParameter)
{
TickType_t temp_tick = xTaskGetTickCount();
uint16_t temp;
while(1)
{
xEventGroupSync( xEventBits, TASK_1_BIT, ALL_SYNC_BITS, portMAX_DELAY );//等待另外2个任务处理完成
temp = pdMS_TO_TICKS(xTaskGetTickCount()>temp_tick?xTaskGetTickCount()-temp_tick:0);
LOG_BLE("task2 wake:%dMs\n",temp);
temp_tick = xTaskGetTickCount();
}
}
static void sync3_task (void * pvParameter)
{
TickType_t temp_tick = xTaskGetTickCount();
uint16_t temp;
while(1)
{
xEventGroupSync( xEventBits, TASK_2_BIT, ALL_SYNC_BITS, portMAX_DELAY );//等待另外2个任务处理完成
temp = pdMS_TO_TICKS(xTaskGetTickCount()>temp_tick?xTaskGetTickCount()-temp_tick:0);
LOG_BLE("task3 wake:%dMs\n",temp);
temp_tick = xTaskGetTickCount();
}
}
实验说明和现象
①任务1处理其他事情需要2秒时间,处理完后设置TASK_0_BIT位事件且等待阻塞ALL_SYNC_BITS时间。
②任务2设置TASK_1_BIT位事件且等待阻塞ALL_SYNC_BITS时间。
③任务3设置TASK_2_BIT位事件且等待阻塞ALL_SYNC_BITS时间。
④三个任务将间隔2秒时间打印一次信息。