11.FreeRTOS_事件组

avatar
作者
猴君
阅读量: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; }

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!