阅读量:2
事件组概述
事件组的作用:
- 可以等待某一个事件发生
- 可以等待若干个事件发生
- 可以等待若干个事件中的某一个事件发生
同步点是事件组的另一个使用方式,它可以让多个任务进行阻塞等待,当全部事件完成后,再一起解除任务的阻塞。常常用于合作关系的情况。
相关函数
创建事件组
函数声明如下:
EventGroupHandle_t xEventGroupCreate( void )
返回值:事件组的句柄
设置事件组
函数声明如下:
EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet )
xEventGroup:事件组的句柄,设置哪一个事件组
uxBitsToSet :设置哪一个事件,以bit传入,设置bit3就传入 (1<<3),设置多个可用 ‘ | ’实现
等待事件组
函数声明如下:
EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait )
xEventGroup:事件组的句柄,设置哪一个事件组
uxBitsToWaitFor:要等待的事件,以bit传入
xClearOnExit:当函数返回之前,是否清除这个事件。传入pdFALSE、pdTRUE
xWaitForAllBits:是否等待全部
- 传入pdFALSE代表有一个事件发生即可解除阻塞
- 传入pdTRUE代表必须全部事件发生才可解除阻塞
xTicksToWait :超时时间
同步点
函数声明如下:
EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait )
xEventGroup:事件组的句柄,设置哪一个事件组
uxBitsToSet:设置自己做完了哪一个事件,以bit传入
uxBitsToWaitFor:要等待哪些事件完成,以bit传入,只有当全部等待的事件完成后才可退出阻塞
xTicksToWait :超时
uxBitsToWaitFor设置的事件都完成后,多个任务会同时从这个函数退出来,不再阻塞。退出函数之后,会自动清除uxBitsToWaitFor设置的事件的位
验证实验
现在有3个任务,任务1在做一件很长时间的事情,任务2也在做一个很长时间的事情,任务3在等待这两个任务中其中一个完成后,打印task finish字符串。
具体代码实现如下:
EventGroupHandle_t xEventHandle_Test;/* 事件组句柄 */ void TaskAFunction(void *param){ int i=0; int j=0; while(1){ /* 做一个很长时间的任务 */ for(i=0;i<10000;i++){ j++; } /* 设置事件0 */ xEventGroupSetBits(xEventHandle_Test,1<<0); } } void TaskBFunction(void *param){ int i=0; int j=0; while(1){ /* 做一个很长时间的任务 */ for(i=0;i<20000;i++){ j++; } /* 设置事件1 */ xEventGroupSetBits(xEventHandle_Test,1<<1); } } void TaskCFunction(void *param){ while(1){ /* 等待事件组,pdFALSE代表等待的事件有一个发生即可解除阻塞 */ xEventGroupWaitBits(xEventHandle_Test,(1<<0)|(1<<1),pdTRUE,pdFALSE,portMAX_DELAY); printf("task finish\r\n"); } } int main( void ) { TaskHandle_t xHandleTask1; TaskHandle_t xHandleTask2; TaskHandle_t xHandleTask3; prvSetupHardware(); SerialPortInit(); printf("UART TEST\r\n"); /* 创建事件组 */ xEventHandle_Test = xEventGroupCreate(); xTaskCreate(TaskAFunction,"TaskA",100,(void*)NULL,1,&xHandleTask1); xTaskCreate(TaskBFunction,"TaskB",100,(void*)NULL,1,&xHandleTask2); xTaskCreate(TaskCFunction,"TaskC",100,(void*)NULL,1,&xHandleTask3); vTaskStartScheduler(); return 0; }