CubeMX+freertos任务挂起与恢复

前言:当不需要的运行某个任务时,就将这个任务挂起,当要重新运行这个任务的话就恢复这个任务的运行。

实现功能:任务一:LED灯没500ms翻转一次,任务二:按下KEY0时任务一被挂起暂停,按下KEY1时任务一恢复。

CubeMX设置 

任务的设置:

 

 按键设置:

 代码

/* USER CODE END Header_StartTask01_LED */
void StartTask01_LED(void const * argument)
{
  /* USER CODE BEGIN 5 */
  /* Infinite loop */
  for(;;)
  {
      HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
      osDelay(500);
  }
  /* USER CODE END 5 */
}

/* USER CODE BEGIN Header_StartTask01_KEY */
/* USER CODE END Header_StartTask01_KEY */
void StartTask01_KEY(void const * argument)
{
  /* USER CODE BEGIN StartTask01_KEY */
  /* Infinite loop */
  u8 KEY_Flag = 0;
  for(;;)
  {        
        if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)  == 0 && KEY_Flag == 0)
        {
                osThreadSuspend(myTask01_LEDHandle);//挂起线程
                KEY_Flag = 1;
        }
        if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1) == 0 && KEY_Flag == 1)
        {
                osThreadResume(myTask01_LEDHandle);//释放线程
                KEY_Flag = 0;
        }
    osDelay(1);
  }
  /* USER CODE END StartTask01_KEY */
}

可以实现预期功能

API函数:

任务挂起 vTaskSuspend()

任务恢复 vTaskResume()

中断函数中进行任务恢复 xTaskResumeFromISR()

void vTaskSuspend( TaskHandle_t xTaskToSuspend )
参数:xTaskToSuspend(需要挂起的任务句柄)
void vTaskResume( TaskHandle_t xTaskToResume )
参数:xTaskToResume(需要恢复的任务句柄)
BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume )
参数:xTaskToResume(需要恢复的任务句柄)

总结:这三个函数用起来比较简单的,只需要传入任务的句柄即可。

 

posted @ 2022-12-21 10:07  Yoku  阅读(198)  评论(0)    收藏  举报