STM32 HAL freertos零基础(八)事件标志组

1、事件标志组

事件标志组是一种轻量级的同步原语,用于在任务之间传递信息。每个标志组实际上是一个32位的整数,其中每一位都可以作为一个单独的标志位。这些标志位可以被任务设置、清除和等待。

虽然是32位,但是高8位用于存储事件标志组的控制信息,余下的24位用于存储事件标志!!!

 本次

创建一个事件标志组,在任务1中进行串口接收,检测到串口调试助手发送A、B,任务2运行。

2、相关API

xEventGroupCreate() //使用动态方式创建事件标志组
xEventGroupCreateStatic() //使用静态方式创建事件标志组
xEventGroupClearBits() //清零事件标志位
xEventGroupClearBitsFromISR() //在中断中清零事件标志位
xEventGroupSetBits() //设置事件标志位
xEventGroupSetBitsFromISR() //在中断中设置事件标志位
xEventGroupWaitBits() //等待事件标志位

 2.1 事件标志组创建

EventGroupHandle_t xEventGroupCreate( void );
/*
参数:
无
返回值:
成功,返回对应事件标志组的句柄;
失败,返回 NULL 。
*/

2.2 事件标志位设置

 EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup,
                                 const EventBits_t uxBitsToSet );
/*
参数:
xEventGroup:对应事件组句柄。  
uxBitsToSet:指定要在事件组中设置的一个或多个位的按位值。
返回值:
设置之后事件组中的事件标志位值。
*/

2.3 事件标志位清除

 EventBits_t xEventGroupClearBits(EventGroupHandle_t xEventGroup,
                                 const EventBits_t uxBitsToClear );
/*
参数:
xEventGroup:对应事件组句柄。  
uxBitsToClear:指定要在事件组中清除的一个或多个位的按位值。
返回值:
清零之前事件组中事件标志位的值。
*/

 2.4 事件标志位等待

EventBits_t xEventGroupWaitBits(
                       const EventGroupHandle_t xEventGroup,
                       const EventBits_t uxBitsToWaitFor,
                       const BaseType_t xClearOnExit,
                       const BaseType_t xWaitForAllBits,
                       TickType_t xTicksToWait );
/*
xEventGroup:对应的事件标志组句柄 
uxBitsToWaitFor:指定事件组中要等待的一个或多个事件位的按位值 
xClearOnExit:pdTRUE——清除对应事件位,pdFALSE——不清除 
xWaitForAllBits:pdTRUE——所有等待事件位全为1(逻辑与),pdFALSE——等待的事件位有一个为1
(逻辑或)
xTicksToWait:超时
返回值:
等待的事件标志位值:等待事件标志位成功,返回等待到的事件标志位
其他值:等待事件标志位失败,返回事件组中的事件标志位
*/

3、STM32CubeMX配置

如果使用的是V1版本的freertos则不用STM32CubeMX配置,直接在软件添加设计!

将上次创建的三个任务删除避免对本次教程造成干扰!

 删除后仅剩下任务1、2!

4、Keil 5程序设计

4.1 设置标志位任务

void StartDefaultTask(void *argument)
{
  /* USER CODE BEGIN StartDefaultTask */
   uint16_t buf = 100;
   EventBits_t status;
   EventBits_t status2;
  /* Infinite loop */
  for(;;)
  {
	  if(sign_1==1){
		  status = xEventGroupSetBits(myEvent01Handle, 0x01);
	      sign_1=0;
	  }
	  else if(sign_1==2){
		  status2 = xEventGroupSetBits(myEvent01Handle, 0x02);
	      sign_1=0;
	  }	  
    osDelay(1);
  }
  /* USER CODE END StartDefaultTask */
}

4.2等待事件标志位任务

void StartTask02(void *argument)
{
  /* USER CODE BEGIN StartTask02 */
   EventBits_t event_flag = 0;
  /* Infinite loop */
  for(;;)
  {
     event_flag = xEventGroupWaitBits( myEvent01Handle, 0x01 | 0x02, pdTRUE, pdTRUE,        portMAX_DELAY );
     printf("返回值:%#x,OK!\r\n",event_flag);
     osDelay(1);
  }
  /* USER CODE END StartTask02 */
}

4.3 测试

上文如有错误,恳请各位大佬指正! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值