11.FreeRTOS_事件组

事件组概述

事件组的作用:

  • 可以等待某一个事件发生
  • 可以等待若干个事件发生
  • 可以等待若干个事件中的某一个事件发生

同步点是事件组的另一个使用方式,它可以让多个任务进行阻塞等待,当全部事件完成后,再一起解除任务的阻塞。常常用于合作关系的情况。

相关函数

创建事件组

函数声明如下:

cpp 复制代码
EventGroupHandle_t xEventGroupCreate( void )

返回值:事件组的句柄

设置事件组

函数声明如下:

cpp 复制代码
EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup,
                                const EventBits_t uxBitsToSet )

xEventGroup:事件组的句柄,设置哪一个事件组

uxBitsToSet :设置哪一个事件,以bit传入,设置bit3就传入 (1<<3),设置多个可用 ' | '实现

等待事件组

函数声明如下:

cpp 复制代码
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 :超时时间

同步点

函数声明如下:

cpp 复制代码
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字符串。

具体代码实现如下:

cpp 复制代码
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;
}
相关推荐
Aaron158816 小时前
RFSOC+VU13P+RK3588的核心优势与应用场景分析
嵌入式硬件·算法·matlab·fpga开发·信息与通信·信号处理·基带工程
blevoice16 小时前
JL杰理AC696N开发板常见问题FAQ-问题6:为什么提示“key 不匹配”?杰理的蓝牙芯片的key是什么?以及该如何添加key? 杰理key文件原理?
单片机·嵌入式硬件·物联网·jl杰理蓝牙音频芯片·ac696n·蓝牙音箱方案开发
编程之升级打怪17 小时前
常见电路的引脚代号
嵌入式硬件
三佛科技-1873661339718 小时前
辉芒微FT62FC1x低成本小体积定时器触摸MCU芯片选型深度解析
单片机·嵌入式硬件
独小乐18 小时前
018.使用I2C总线EEPROM|千篇笔记实现嵌入式全栈/裸机篇
linux·笔记·单片机·嵌入式硬件·arm·信息与通信
C^h19 小时前
rtthread控制达妙4310电机
数据库·单片机·嵌入式硬件
三佛科技-1873661339719 小时前
LP3717BSL 12V1A隔离型极简化自供电充电器适配器电源方案测试报告
单片机·嵌入式硬件
一路往蓝-Anbo20 小时前
第二章:STM32 bxCAN 控制器详解:从内存到总线的“中转站”
stm32·单片机·嵌入式硬件·软件工程
jucat20 小时前
定时排气扇
嵌入式硬件
Dunkle.T21 小时前
DC-DC PCB设计要点说明——拓扑、走线、选型、铺铜详解
单片机·嵌入式硬件·pcb·dc-dc