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;
}
相关推荐
AOI小白新手上路5 小时前
江科协51单片机 17-2 红外遥控电机调速实验调试总结
单片机·嵌入式硬件·51单片机
oshan20127 小时前
零基础STM32入门教程--10-PWM 呼吸灯
stm32·单片机·嵌入式硬件
记帖8 小时前
STM32C5A3R开发(7)----ADC电压采集
嵌入式硬件·adc·dac·stm32cubeide·stm32c5·stm32cubemx2·stm32c5a3rgt6
自小吃多10 小时前
器件移动、旋转、镜像、对齐、等间距操作笔记
笔记·嵌入式硬件
jianqiang.xue11 小时前
智能体整体架构设计:四大模块与目录组织
单片机·嵌入式硬件·物联网·架构·esp32
Messy create13 小时前
【BMS-AFE-温度检测】
stm32·单片机·能源
东莞市永盛电气13 小时前
三相208V变380V变压器,出海工业设备供电适配方案
python·单片机·嵌入式硬件
Learn-Share_HY14 小时前
[IT Network]如何配置反向路徑過濾器(rp_filter),以解決路由不對稱問題?
linux·嵌入式硬件·物联网·网络协议·tcp/ip·http·iot
深圳市宝华视联15 小时前
医院内网部署手术示教系统注意事项
嵌入式硬件·实时互动·音视频·实时音视频·视频编解码·嵌入式实时数据库
新晨单片机设计15 小时前
S001A-基于STM32单片机超声波视力保护仪【Proteus仿真+Keil程序+原理图】
stm32·单片机·proteus