2021-05-21 FREERTOS事件标志组

FREERTOS事件标志组
描述:事件位:一个事件发生后就置1,当没有发生这个事件就置0;
事件组:一个事件组表示多个事件位组成的事件,BIT0表示一个事件0,BIT1表示事件1,BIT2表示事件2
这些事件可以通过事件标志位来管理,可以置0或者置1,可以等待多个任务全部置1然后再处理,也可以读取事件标志位的值。
事件标志组相当于裸机的多个全局变量取&|关系,但是裸机没有阻塞这一功能,必须轮询全局变量的值,而且中断服务函数中的全局变量与主函数同步不及时,所以处理裸机的多个全局变量的|| || && &&关系可以不是很及时。

#define configUSE_16_BIT_TICKS				0              

定义位1时只能有8个事件标志位可以用。
定义位0 时有24个事件标志位可以用。
在这里插入图片描述在这里插入图片描述
创建事件标志组

#include "event_groups.h" //头文件
EventGroupHandle_t  EventGroupHandler;//事件标志组句柄声明
#define EVENTBIT_0    (1<<0)//事件标志位 0
#define EVENTBIT_1    (1<<1)//事件标志位 1
#define EVENTBIT_2    (1<<2)//事件标志位 2
#define EVENTBIT_ALL	(EVENTBIT_0|EVENTBIT_1|EVENTBIT_2)  
EventGroupHandler=xEventGroupCreate();//创建一个事件标志组

**1、xEventGroupSetBitsFromISR();**事件标志位置1

xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken )
	{
	BaseType_t xReturn;

		traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet );
		xReturn = xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken );

		return xReturn;
	}

在这里插入图片描述

实列

        if(Que_data[2]==0xdd)
		    xEventGroupSetBitsFromISR(EventGroupHandler,EVENTBIT_0,&xTaskWokenByReceive);//事件标志组设置标志位0  置1
		else if(Que_data[2]==0x35)
			xEventGroupSetBitsFromISR(EventGroupHandler,EVENTBIT_1,&xTaskWokenByReceive);//事件标志组设置标志位1  置1
		else if(Que_data[2]==0xf4)
			xEventGroupSetBitsFromISR(EventGroupHandler,EVENTBIT_2,&xTaskWokenByReceive);//事件标志组设置标志位2  置1

**2、xEventGroupGetBits();**获取事件标志组的值
在这里插入图片描述
返回值:事件标志组的值

实例:

if(EventGroupHandler!=NULL)   //读取事件标志组的值
{
 new_value=xEventGroupGetBits(EventGroupHandler);
 
}

**3、xEventGroupWaitBits();**等待指定的事件位
在这里插入图片描述
实列:

void eventquery_task(void *pvParameters)//事件标志组任务,该任务为等待事件标志位0、1、2事件,事件都为1则进入任务,并且清除任务标志位
{
  u8 data_change=0;
  EventBits_t event_value=0;
  while(1)
   {
     if(EventGroupHandler!=NULL)
	  {
	    event_value=xEventGroupWaitBits((EventGroupHandle_t	)EventGroupHandler,//句柄声明
				                       (EventBits_t)EVENTBIT_ALL,  //事件的标志位  全部标志位  
				 					   (BaseType_t)pdTRUE, //退出是否清除标志位 pdTRUE为清除标志位
									  (BaseType_t)pdTRUE, //是否等待所有的标志位都置1 pdTRUE为全部都置1
				                       (TickType_t)portMAX_DELAY ); //阻塞事件设置
	      data_change=event_value&0xff;
		  USART2_data(&data_change,1);
	  }
	 else 
	 {
	   vTaskDelay(100);
	 }
	}
}

**4、xEventGroupClearBits();**将事件标志组的指定位清零 该函数只能用于任务中,不能用于中断服务函数中。

xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear )

在这里插入图片描述
该函数不经常使用,用函数xEventGroupWaitBits(); 可以替代该函数将指定标志位清零。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值