跳转至

FreeRTOS

任务的挂起与恢复

这里所谓的挂起,可以简单理解为把正在执行的任务暂停,同理恢复就是将暂停的任务恢复到继续运行的状态

相关API:

  • 单个任务挂起:vTaskSuspend(要挂起的任务句柄)
  • 单个任务恢复:vTaskResume(要恢复的任务句柄)
  • 挂起所有任务:vTaskSuspendAll(void)
  • 恢复所有任务:vTaskResumeAll(void)

API的具体解释详见官网:FreeRTOS官网

示例:

  • 任务1:LED1闪烁,周期1s
  • 任务2:LED2闪烁,周期1s
  • 任务3:获取按键值,按键1按下就挂起任务1,按键2按下就恢复任务1,按键3按下就挂起所有任务,按键4按下就恢复所有任务

freeRTOS_demo.c源代码:

#include "stm32f10x.h"                  // Device header

#include "myusart.h"
#include "Led.h"
#include "Key.h"

#include "freeRTOS_demo.h"
#include "FreeRTOS.h"
#include "task.h"//包含创建、挂起、恢复、删除任务
//初始任务句柄
TaskHandle_t start_mytask_Handler;
//业务逻辑任务句柄
TaskHandle_t myTask1_Handler;
TaskHandle_t myTask2_Handler;
TaskHandle_t myTask3_Handler;

void start_mytask(void *param);

void myTask1(void *param);
void myTask2(void *param);
void myTask3(void *param);

void freeRTOS_start(void)
{
    //初始任务为创建其他任务
    BaseType_t res =  xTaskCreate(
                                                                //任务函数
                                                                start_mytask,
                                                                //任务描述
                                                                "create_allTasks",
                                                                //任务所分配的堆栈字数
                                                                256,
                                                                //给任务传递的参数
                                                                NULL,
                                                                //任务执行优先级,数字越大优先级越高
                                                                2,
                                                                //任务的句柄
                                                                &start_mytask_Handler
    );

    if(res == pdPASS)
    {
        Usart1_printf("start Task create Success");
    }

    //任务调度
    vTaskStartScheduler();

}

void start_mytask(void *param)
{
    //三个子任务都创建完毕后再运行

    taskENTER_CRITICAL();

    //task1:led1闪烁
    xTaskCreate(myTask1 ,"Led1" ,256 ,NULL ,2 ,&myTask1_Handler);
    //task2:led2闪烁
    xTaskCreate(myTask2 ,"Led2" ,256 ,NULL ,2 ,&myTask2_Handler);
    //task3:key检测
    xTaskCreate(myTask3 ,"Led3" ,256 ,NULL ,2 ,&myTask3_Handler);

    //创建完成后删除自己
    vTaskDelete(NULL);

    taskEXIT_CRITICAL();

}

void myTask1(void *param)
{
    while(1)
    {
        Led_On(LED1);
        vTaskDelay(500);
        Led_Off(LED1);
        vTaskDelay(500);
    }
}   

void myTask2(void *param)
{   
    while(1)
    {
        Led_On(LED2);
        vTaskDelay(500);
        Led_Off(LED2);
        vTaskDelay(500);
    }
}

void myTask3(void *param)
{
    uint8_t KeyNum = 0;
    while(1)
    {
        KeyNum = get_KeyNum();
        if(KeyNum == 1)
        {
            vTaskSuspend(myTask1_Handler);//暂停任务1
        }
        else if(KeyNum == 2)
        {
            vTaskResume(myTask1_Handler);//恢复任务1
        }
        else if(KeyNum == 3)
        {
            vTaskSuspendAll();//暂停所有任务
        }
        else if(KeyNum == 4)
        {
            xTaskResumeAll();//恢复所有任务
        }
    }
}