一 相关函数
函数 | 描述 |
vTaskSuspend | 挂起一个任务 |
vTaskResume | 恢复一个任务的运行 |
xTaskResumeFromISR | 在中断中恢复被挂起的任务 |
二 实验
2.1 非中断恢复
创建任务三,实现当按键按下时控制两个led等顺序挂起,并顺序开启。
main.c
int switch_key = 0;
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
vTaskDelay(50);
if(GPIO_Pin == KEY_Pin)
{
switch_key++;
}
}
//key
void start_task3(void *pvParameters)
{
while(1)
{
switch (switch_key% 5)
{
case 1:
vTaskSuspend(StartTask1_Handler);
break;
case 2:
vTaskSuspend(StartTask2_Handler);
break;
case 3:
vTaskResume(StartTask1_Handler);
break;
case 4:
vTaskResume(StartTask2_Handler);
break;
default :
break;
}
}
}
2.2 中断恢复
在中断中挂起和恢复任务1
void EXTI15_10_IRQHandler(void)
{
/* USER CODE BEGIN EXTI15_10_IRQn 0 */
/* USER CODE END EXTI15_10_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
/* USER CODE BEGIN EXTI15_10_IRQn 1 */
vTaskDelay(50);
static int key_flag = 0;
BaseType_t ret;
if(key_flag == 0)
{
vTaskSuspend(StartTask1_Handler);
key_flag = 1;
}
else if(key_flag == 1)
{
ret = xTaskResumeFromISR(StartTask1_Handler);
if(ret == pdTRUE)
{
portYIELD_FROM_ISR(ret); //恢复的任务优先级大于或等于正在执行的任务,所以要执行一次任务调度进行上下文切换
}
key_flag = 0;
}
/* USER CODE END EXTI15_10_IRQn 1 */
}