FreeRtos任务的挂起和恢复实验示例

首先我们在main函数完成硬件的初始化,其次在硬件初始化完成之后创建任务start_task()然后开启FreeRtos的任务调度

(1)、start_task 任务,用于创建其他 3 个任务。
(2)、在 key_tssk 任务里面,KEY_UP 被按下,调用函数 vTaskSuspend()挂起任务 1。
(3)、KEY1 被按下,调用函数 vTaskResume()恢复任务 1 的运行。
(4)、KEY2 被按下,调用函数 vTaskSuspend()挂起任务 2。

#define START_TASK_PRIO 1 //任务优先级
#define START_STK_SIZE 120 //任务堆栈大小
TaskHandle_t StartTask_Handler; //任务句柄
void start_task(void *pvParameters); //任务函数

#define KEY_TASK_PRIO 2 
#define KEY_STK_SIZE 120 //任务堆栈大小
TaskHandle_t KeyTask_Handler;
void key_task(void *pvParameters);

#define TASK1_TASK_PRIO 3 //任务优先级
#define TASK1_STK_SIZE 120 //任务堆栈大小
TaskHandle_t Task1Task_Handler
void task1_task(void *pvParameters);

#define TASK2_TASK_PRIO 4 //任务优先级
#define TASK2_STK_SIZE 120 //任务堆栈大小
TaskHandle_t Task2Task_Handler;
void task2_task(void *pvParameters);

int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组 4
    delay_init(); //延时函数初始化
    uart_init(115200); //初始化串口
    LED_Init(); //初始化 LED
    KEY_Init(); //初始化按键
    EXTIX_Init(); //初始化外部中断
    LCD_Init(); //初始化 LCD
    
    xTaskCreate((TaskFunction_t )     start_task, //任务函数
    (const char* )                    "start_task", //任务名称
    (uint16_t )                       START_STK_SIZE, //任务堆栈大小
    (void* )                          NULL, //传递给任务函数的参数
    (UBaseType_t )                    START_TASK_PRIO, //任务优先级
    (TaskHandle_t* )                  &StartTask_Handler); //任务句柄
    vTaskStartScheduler(); //开启任务调度


}

void start_task(void *pvParameters)
{
    xTaskCreate((TaskFunction_t )    key_task,
    (const char* )                   "key_task",
    (uint16_t )                      KEY_STK_SIZE,
    (void* )                         NULL,
    (UBaseType_t )                   KEY_TASK_PRIO,
    (TaskHandle_t* )                 &KeyTask_Handler);

    xTaskCreate((TaskFunction_t )    task1_task,
    (const char* )                   "task1_task",
    (uint16_t )                      TASK1_STK_SIZE,
    (void* )                         NULL,
    (UBaseType_t )                   TASK1_TASK_PRIO,
    (TaskHandle_t* )                 &Task1Task_Handler);

    xTaskCreate((TaskFunction_t )    task2_task,
    (const char* )                   "task2_task",
    (uint16_t )                      TASK2_STK_SIZE,
    (void* )                         NULL,
    (UBaseType_t )                   TASK2_TASK_PRIO,
    (TaskHandle_t* )                 &Task2Task_Handler);

    vTaskDelete(StartTask_Handler); //删除开始任务
    taskEXIT_CRITICAL(); //退出临界区
}

void key_task(void *pvParameters)
{
    u8 key;
    while(1){
        key = KEY_scan(0);
        switch(key){
               case WKUP_PRES:
                    vTaskSuspend(Task1Task_Handler); //挂起任务 1 (2)
                    printf("挂起任务 1 的运行!\r\n");
                    break;
               case KEY1_PRES:
                    vTaskResume(Task1Task_Handler); //恢复任务 1 (3)
                    printf("恢复任务 1 的运行!\r\n");
                    break;
               case KEY2_PRES:
                    vTaskSuspend(Task2Task_Handler);//挂起任务 2 (4)
                    printf("挂起任务 2 的运行!\r\n");
                    break;
        }
            vTaskDelay(10); //延时 10ms
    
    }


}

void task1_task(void *pvParameters){
    while(1){


    }
}
void task2_task(void *pvParameters){
    while(1){

    }

}

后续明天发!!!

你可能感兴趣的:(stm32,单片机)