freeRTOS总结(十三)事件标志组

1,事件标志组简介(了解)

事件标志位:用一个位,来表示事件是否发生
事件标志组是一组事件标志位的集合, 可以简单的理解事件标志组,就是一个整数。
事件标志组的特点:
它的每一个位表示一个事件(高8位不算)
每一位事件的含义,由用户自己决定,如:bit0表示按键是否按下,bit1表示是否接受到消息 … …
这些位的值为1:表示事件发生了;值为0:表示事件未发生
任意任务或中断都可以读写这些位
可以等待某一位成立,或者等待多位同时成立

一个事件组就包含了一个 EventBits_t 数据类型的变量,变量类型 EventBits_t 的定义如下所示:

typedef TickType_t EventBits_t;#if ( configUSE_16_BIT_TICKS  = =  1 )	typedef   uint16_t   TickType_t;#else	typedef   uint32_t   TickType_t;#endif#define  configUSE_16_BIT_TICKS    0 

EventBits_t 实际上是一个 16 位或 32 位无符号的数据类型

虽然使用了 32 位无符号的数据类型变量来存储事件标志, 但其中的高8位用作存储事件标志组的控制信息,低24位用作存储事件标志 ,所以说一个事件组最多可以存储 24 个事件标志!
在这里插入图片描述

事件标志组与队列、信号量的区别
在这里插入图片描述

2,事件标志组相关API函数介绍(熟悉)

在这里插入图片描述
动态方式创建事件标志组API函数

EventGroupHandle_t    xEventGroupCreate ( void ) ; 

在这里插入图片描述
清除事件标志位API函数

EventBits_t  xEventGroupClearBits( EventGroupHandle_t 	xEventGroup,					      const EventBits_t 	uxBitsToClear ) 

在这里插入图片描述
在这里插入图片描述
设置事件标志位API函数

EventBits_t   xEventGroupSetBits(  EventGroupHandle_t 	xEventGroup,						  const EventBits_t 		uxBitsToSet    ) 

在这里插入图片描述
在这里插入图片描述
等待事件标志位API函数

EventBits_t   xEventGroupWaitBits(        EventGroupHandle_t 	xEventGroup,
                                 			       const EventBits_t 	uxBitsToWaitFor,
                                 			       const BaseType_t 	xClearOnExit,
                                 			       const BaseType_t 	xWaitForAllBits,
                                 			       TickType_t 		xTicksToWait         )

在这里插入图片描述
在这里插入图片描述
特点:
可以等待某一位、也可以等待多位
等到期望的事件后,还可以清除某些位
同步函数

EventBits_t    xEventGroupSync(   EventGroupHandle_t 	xEventGroup,						const EventBits_t 	uxBitsToSet,						const EventBits_t 	uxBitsToWaitFor,						TickType_t 		xTicksToWait) 

在这里插入图片描述
在这里插入图片描述
例子:
Task1:做饭
Task2:做菜
Task1做好自己的事之后,需要等待菜也做好,大家在一起吃饭。
特点:同步!

3,事件标志组实验(掌握)

1、实验目的:学习 FreeRTOS 的事件标志组API函数的使用。
2、实验设计:将设计三个任务:start_task、task1、task2
三个任务的功能如下:
start_task:用来创建task1和task2任务,并创建事件标志组
task1:读取按键按下键值,根据不同键值将事件标志组相应事件位置一,模拟事件发生
task2:同时等待事件标志组中的多个事件位,当这些事件位都置 1 的话就执行相应的处理

#include "freertos_demo.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
#include "./SYSTEM/delay/delay.h"
#include "./MALLOC/malloc.h"
/*FreeRTOS*********************************************************************************************/
#include "FreeRTOS.h"
#include "task.h"
#include "event_groups.h"
/******************************************************************************************************/
/*FreeRTOS配置*/

/* START_TASK 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
/* TASK1 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
 
#define START_TASK_PRIO         1
#define START_TASK_STACK_SIZE   128
TaskHandle_t    start_task_handler;
void start_task( void * pvParameters );

#define TASK1_PRIO         2
#define TASK1_STACK_SIZE   128
TaskHandle_t  task1_handler;
void task1( void * pvParameters );


/* TASK2 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
#define TASK2_PRIO         3
#define TASK2_STACK_SIZE   128
TaskHandle_t   task2_handler;
void task2( void * pvParameters );

EventGroupHandle_t g_eventgroup_handle;
#define EVENTBIT_0 (1<<0)
#define EVENTBIT_1 (1<<1)




/**
 * @brief       FreeRTOS例程入口函数
 * @param       无
 * @retval      无
 */
	void freertos_demo(void)
{ 
	


	xTaskCreate((TaskFunction_t) start_task,
							(char *)	"start_task",
							(configSTACK_DEPTH_TYPE) START_TASK_STACK_SIZE,
							(void *) NULL,
							(UBaseType_t) START_TASK_PRIO,
							(TaskHandle_t *)&start_task_handler
	
	);
							
	//开启任务调度
	vTaskStartScheduler();
	
}
void start_task( void * pvParameters )
{
	
	
		taskENTER_CRITICAL();               /* 进入临界区  任何任务和中断都不能打断当前程序运行*/
		g_eventgroup_handle=xEventGroupCreate();
		if(g_eventgroup_handle!=NULL)
		{
			 printf("事件标志组创建成功!!\r\n");
		}
		xTaskCreate((TaskFunction_t) task1,
							(char *)	"task1",
							(configSTACK_DEPTH_TYPE) TASK1_STACK_SIZE,
							(void *) NULL,
							(UBaseType_t) TASK1_PRIO,
							(TaskHandle_t *)&task1_handler	);
							
		xTaskCreate((TaskFunction_t) task2,
							(char *)	"task2",
							(configSTACK_DEPTH_TYPE) TASK2_STACK_SIZE,
							(void *) NULL,
							(UBaseType_t) TASK2_PRIO,
							(TaskHandle_t *)&task2_handler	);


	vTaskDelete(NULL);//删除当前任务也就是开始任务
	taskEXIT_CRITICAL();
							
	

}
/* 任务一,用于扫描按键,当KEY0按下,往队列写入数据,当KEY1按下,释放二值信号量 */
void task1( void * pvParameters )
{
		uint8_t key;
		while(1)
		{
			key=key_scan(0);
			if(key==KEY0_PRES)
			{
				/*将事件标志组的bit0位置1 */
				xEventGroupSetBits(g_eventgroup_handle,EVENTBIT_0);
			}
			else if(key==KEY1_PRES)
			{
				 /* 将事件标志组的bit1位置1 */
				xEventGroupSetBits(g_eventgroup_handle,EVENTBIT_1);
			}
			vTaskDelay(10);
		}
		
}
/* 任务二,读取队列集中的消息并打印*/
void task2( void * pvParameters )
{
	EventBits_t event_bit=0;
	while(1)
	{
		event_bit=xEventGroupWaitBits(  g_eventgroup_handle,/* 事件标志组句柄 */
                                 EVENTBIT_0|EVENTBIT_1,/* 等待事件标志组的bit0和bit1位 */
                                 pdTRUE, 							/* 成功等待到事件标志位后,清除事件标志组中的bit0和bit1位 */
                                 pdTRUE,							/* 等待事件标志组的bit0和bit1位都置1,就成立 */
																 portMAX_DELAY)	;			/* 死等 */
		 printf("等待到的事件标志位值为:%#x\r\n",event_bit);
		
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值