FreeRTOS-事件标志组

一、事件标志组简介

  • 事件标志位:用一个位来表示事件是否发生,裸机中的中断标志位等等
  • 事件标志组:是一组事件标志位的集合,简单认为就是一个整数
  • 事件标志组特点:它每一个位表示一个事件(高8位不算)。每一位事件的含义由用户自己决定(1表示发生,0表示未发生)。任意任务中断都可以读写这些位。可以等待某一位成立或者等待多位同时成立
  • 事件标志组的32位标志位,其中的高8位用来存储事件标志组的控制信息,低24位用作存储事件标志,一个事件组最多可以存储24个事件标志,位23表示事件标志23等以此类推

二、事件标志组API函数

  • 下面是事件标志组相关的API函数
xEventGroupCreate();//动态方式创建事件标志组
xEventGroupCreateStatic();//静态方式创建事件标志组
xEventGroupClearBits();//清零事件标志位
xEventGroupClearBitsFromISR();//在中断中清零事件标志位
xEventGroupSetBits();//设置事件标志位
xEventGroupSetBitsFromISR();//在中断中设置事件标志位
xEventGroupWaitBits();//等待事件标志位
xEventGroupSync();//设置并等待事件标志位
  • 动态创建事件标志组
EventGroupHandle_t xEventGroupCreate(void)
//返回值判断是否创建成功
  • 清除事件标志位
EventBits_t xEventGroupClearBits(EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToClear)
//形参:待操作的事件标志组句柄 待清零的事件标志位
//返回值:清零事件标志位前事件组中事件标志位的值
  • 设置事件标志位
EventBits_t xEventGroupSetBits(EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToSet)
//形参:待操作的事件标志组句柄 待设置的事件标志位
//返回值:事件组中事件标志位值
  • 等待事件标志位
  • 可以等待某一位,也可以等待多位,
EventBits_t xEventGroupWaitBits(EventGroupHandle_t xEventGroup,
								const EventBits_t uxBitsToWaitFor,
								const BaseType_t xClearOnExit,
								const BaseType_t xWaitForALLBits,
								TickType_t xTicksToWait)
//形参:等待的事件标志组句柄 等待的事件标志位 
//成功等待到事件标志位后,清除事件组中对应的事件标志位 
//等待uxBitsToWaitFor中所有的事件标志位 等待阻塞时间
//返回值:判断等待是否成功
  • 设置其中某一个标志位后,并等待其他标志位也置1—同步
EventBits_t xEventGroupSync(EventGroupHandle_t xEventGroup,
							const EventBits_t uxBitsToSet,
							const EventBits_t uxBitsToWaitFor,
							TickType_t xTicksToWait)
//形参:等待事件标志位所在事件组 达到同步点后,要设置的事件标志位 
//等待的事件标志 等待阻塞时间
//返回值:等待是否成功

三、事件标志组实验

  • 实验设计:设计三个任务,start_task:创建task1和task2,并创建事件标志组。task1:按键扫描,不同按键值将事件标志组相应事件置1。task2:同时等待事件标志组中的多个事件位,当这些事件位都置1的话就执行相应的处理
#define configSUPPORT_DYNAMIC_ALLOCATION					1//动态创建任务/信号量宏定义配置


//start_task参数宏定义
#define	START_TASK_STACK_SIZE 								128//堆栈大小
#define	START_TASK_PRIO										1//任务优先级
TaskHandle_t	start_task_handle;							//任务句柄
//task1参数宏定义
#define	TASK1_STACK_SIZE 									128//堆栈大小
#define	TASK1_PRIO											2//任务优先级
TaskHandle_t	task1_handle;								//任务句柄
//task2参数宏定义
#define	TASK2_STACK_SIZE 									128//堆栈大小
#define	TASK2_PRIO											3//任务优先级
TaskHandle_t	task2_handle;								//任务句柄


//task1任务函数:按键扫描,不同按键值将事件标志组相应事件置1
void task1( void * pvParameters )
{
		uint8_t KeyNum = 0;
		while(1)
		{
			KeyNum = Key_GetNum();
			if(KeyNum == 1)//key1按下,Bit0置1
			{
				xEventGroupSetBits(eventgroup_handle,0x01);//将事件标志组的Bit0置1
			}
			else if(KeyNum == 2)//Key2按下,Bit1置1
			{
				xEventGroupSetBits(eventgroup_handle,0x02);//将事件标志组的Bit1置1
			}
			vTaskDelay(10);//自带延时函数
		}
}
//task2任务函数:同时等待事件标志组中的多个事件位,当这些事件位都置1的话就执行相应的处理
void task2( void * pvParameters )
{
		while(1)
		{
			xEventGroupWaitBits(eventgroup_handle,0x01|0x02,pdTRUE,pdTRUE,portMAX_DELAY);//等待Bit0和Bit1标志位都为1
		}
}
EventGroupHandle_t eventgroup_handle;//事件标志组句柄
//Start_task任务函数:创建task1、task2和事件标志组
void Start_task( void * pvParameters )
{
		taskENTER_CRITICAL();//进入临界区
		//创建事件标志组
		eventgroup_handle = xEventGroupCreate();
		//创建任务1
		xTaskCreate(task1,//任务函数
					"task1",//任务名称
					TASK1_STACK_SIZE,//堆栈大小/字
					NULL,//入口参数没有
					TASK1_PRIO,//优先级
					&task1_handle//任务句柄
					);
		//创建任务2
		xTaskCreate(task2,//任务函数
					"task2",//任务名称
					TASK2_STACK_SIZE,//堆栈大小/字
					NULL,//入口参数没有
					TASK2_PRIO,//优先级
					&task2_handle//句柄
					);
		vTaskDelete(start_task_handle);
		//删除自身任务Start_task,start_task_handle或NULL都可以
		taskEXIT_CRITICAL();//退出临界区
}


void freertos_demo()
{
		xTaskCreate(Start_task,//任务函数
					"Start_task",//任务名称
					START_TASK_STACK_SIZE,//堆栈大小/字
					NULL,//入口参数没有
					START_TASK_PRIO,//优先级
					&start_task_handle//句柄
					);//创建Start任务
		vTaskStartScheduler();//开启任务调度器,开启执行Start任务,创建task123
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值