【STM32 FreeRTOS】事件标志组

事件标志组简介

事件标志组:用一个比特位来表示事件是否发生

事件标志组是一组事件标志位的集合,可以简单理解为事件标志组就是一个整数。

事件标志组的特点:

  • 它的每一位表示一个事件(高八位不算)
  • 每一位事件的含义,幼用户自己决定,这些位的值为1是表示事件发生了。
  • 任意任务或中断都可以读到这些位
  • 可以等待某一位成立,或者等待多位同时成立
  • configUSE_16_BIT_TICKS宏:如果该宏为1,则每个事件组包含8个可用的事件位;如果为0,则包含24个可用的事件位97。

事件标志组API函数

/**
  * @brief  动态分配内存创建事件组函数
  * @retval 返回成功创建的事件组的句柄,返回NULL表示因内存空间不足创建失败
  */
EventGroupHandle_t xEventGroupCreate(void);
 
/**
  * @brief  将事件组某些位置位
  * @param  xEventGroup:要设置位的事件组
  * @param  uxBitsToSet:指定要在事件组中设置的一个或多个位的按位值,例如设置为0x09表示置位3 和位0
  * @retval 调用 xEventGroupSetBits()返回时事件组的值
  */
EventBits_t xEventGroupSetBits(EventGroupHandle_t xEventGroup,
							   const EventBits_t uxBitsToSet);
 
/**
  * @brief  将事件组某些位清零
  * @param  xEventGroup:要在其中清除位的事件组
  * @param  uxBitsToSet:表示要在事件组中清除一个或多个位的按位值
  * @retval 返回清除指定位之前的事件组的值
  */
EventBits_t xEventGroupClearBits(EventGroupHandle_t xEventGroup,
								 const EventBits_t uxBitsToClear);
 
/**
  * @brief  上述两个函数的中断安全版本
  * @param  pxHigherPriorityTaskWoken:用于通知应用程序编写者是否应该执行上下文切换
  * @retval 消息已发送到RTOS守护进程任务,则返回pdPASS,否则将返回pdFAIL
  */
BaseType_t xEventGroupSetBitsFromISR(EventGroupHandle_t xEventGroup,
									 const EventBits_t uxBitsToSet,
									 BaseType_t *pxHigherPriorityTaskWoken);
 
BaseType_t xEventGroupClearBitsFromISR(EventGroupHandle_t xEventGroup,
									   const EventBits_t uxBitsToClear);
 
/*example1: 将事件组 EventGroup_Test 的位 1 和 3 置位*/
EventBits_t return_value;
return_value = xEventGroupSetBits(EventGroup_Test, 0x0A);
 
/*example2: 将事件组 EventGroup_Test 的位 0 和 2 清零*/
EventBits_t return_value;
return_value = xEventGroupClearBits(EventGroup_Test, 0x05);
/**
  * @brief  读取事件组的当前值
  * @param  xEventGroup:正在查询的事件组
  * @retval 返回事件组当前的值
  */
EventBits_t xEventGroupGetBits(EventGroupHandle_t xEventGroup);
 
/**
  * @brief  上述函数的中断安全版本
  */
EventBits_t xEventGroupGetBitsFromISR(EventGroupHandle_t xEventGroup);
/**
  * @brief  等待事件组中多个事件位表示的事件成立
  * @param  xEventGroup:所操作事件组的句柄
  * @param  uxBitsToWaitFor:所等待事件位的掩码,例如设置为0x05表示等待第0位和/或第2位
  * @param  xClearOnExit:pdTRUE表示事件组条件成立退出阻塞状态时将掩码指定的所有位清零;pdFALSE表示事件组条件成立退出阻塞状态时不将掩码指定的所有位清零
  * @param  xWaitForAllBits:pdTRUE表示等待掩码中所有事件位都置1,条件才算成立(逻辑与);pdFALSE表示等待掩码中所有事件位中一个置1,条件就成立(逻辑或)
  * @param  xTicksToWait:任务进入阻塞状态等待时间成立的超时节拍数
  * @retval 返回事件位等待完成设置或阻塞时间过期时的事件组值
  */
EventBits_t xEventGroupWaitBits(const EventGroupHandle_t xEventGroup,
								const EventBits_t uxBitsToWaitFor,
								const BaseType_t xClearOnExit,
								const BaseType_t xWaitForAllBits,
								TickType_t xTicksToWait); 

事件标志组API实验

void MyEventGroupSetFromISR(uint32_t event_bit)
{
	//参数event_bit=0 表示发生事件bit0
	//参数event_bit=1 表示发生事件bit1
	//参数event_bit=2 表示发生事件bit2
	//......
	printf("MyEventGroupSetFromISR Event Bit%d\r\n",event_bit);
	BaseType_t xHigherPriorityTaskWoken = pdFALSE;

	//在中断中调用
	xEventGroupSetBitsFromISR(myEventGroup,1<<event_bit,&xHigherPriorityTaskWoken);
	portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
}

#define EVENT_BIT0  (1<<0)
#define EVENT_BIT1  (1<<1)
#define EVENT_BIT2  (1<<2)
#define EVENT_BIT3  (1<<3)

void StartMyTask1(void *argument)
{
	  printf("StartMyTask1\r\n");

	  uint32_t event_bits = 0;
	  for(;;)
	  {

		  event_bits= xEventGroupWaitBits(myEventGroup,
				  EVENT_BIT0|EVENT_BIT1|EVENT_BIT2|EVENT_BIT3,
				  pdTRUE,
				  pdFALSE,
				  portMAX_DELAY);
		  printf("event_bits=%d\r\n",event_bits);
		  if((event_bits & EVENT_BIT0) != 0)
		  {
			  printf("EVENT_BIT0... \r\n");
		  }
		  else if((event_bits & EVENT_BIT1) != 0)
		  {
			  printf("EVENT_BIT1... \r\n");
		  }
		  else if((event_bits & EVENT_BIT2) != 0)
		  {
		  	  printf("EVENT_BIT2... \r\n");
		  }
		  vTaskDelay(pdMS_TO_TICKS(500));//500ms
	  }
}
MyEventGroupSetFromISR Event Bit0
event_bits=1
EVENT_BIT0... 
MyEventGroupSetFromISR Event Bit1
event_bits=2
EVENT_BIT1... 
MyEventGroupSetFromISR Event Bit2
event_bits=4
EVENT_BIT2... 
MyEventGroupSetFromISR Event Bit3
event_bits=8
MyEventGroupSetFromISR Event Bit2
event_bits=4
EVENT_BIT2... 
MyEventGroupSetFromISR Event Bit1
event_bits=2
EVENT_BIT1... 
MyEventGroupSetFromISR Event Bit0
event_bits=1
EVENT_BIT0... 

上述实验中是某一比特的事件发生后都会解除阻塞。如果我们改为如下

		  event_bits= xEventGroupWaitBits(myEventGroup,
				  EVENT_BIT0|EVENT_BIT1|EVENT_BIT2|EVENT_BIT3,
				  pdTRUE,
				  pdTRUE,
				  portMAX_DELAY);

则表示,所有比特位事件都发生后才会解除阻塞。

MyEventGroupSetFromISR Event Bit0
MyEventGroupSetFromISR Event Bit1
MyEventGroupSetFromISR Event Bit2
MyEventGroupSetFromISR Event Bit3
event_bits=15
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值