FreeRTOS任务挂起与恢复

任务挂起函数:

复制代码
参数:xTaskToSuspend:待挂起任务的任务句柄,为NULL表示挂起任务自身
需将宏INCLUDE_vTaskSuspend配置为 1

void vTaskSuspend( TaskHandle_t xTaskToSuspend )

任务恢复函数:

复制代码
参数:	INCLUDE_vTaskSuspend必须定义为1
不论任务被使用 vTaskSuspend() 挂起多少次,只需调用 vTaskResume() 一次,即可使其继续执行。被恢复的任务会重新进入就绪状态。

void vTaskResume( TaskHandle_t xTaskToResume )

任务恢复函数(中断中恢复)

复制代码
返回值如下:
    pdTRUE:任务恢复后需要进行任务切换
    pdFALSE:任务恢复后不需要进行任务切换

BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume )

挂起与恢复调度器:

复制代码
vTaskSuspendAll():挂起任务调度器,调度器不会进行任务切换,当前任务一直运行。

xTaskResumeAll():恢复任务调度器,调度器继续任务切换。

我们刚开始就是把相关的宏定义打开,只有把前两个宏定义为1(打开)才可以使用挂起和恢复函数

复制代码
#define INCLUDE_vTaskSuspend                            1
#define INCLUDE_xResumeFromISR                          1

/* 开启跟踪task信息 */
#define configUSE_TRACE_FACILITY 1
#define configUSE_STATS_FORMATTING_FUNCTIONS 1

只需要修改Task3里面的逻辑就行:

复制代码
/* 任务3:按键1按下就删除任务1 */
/* Key1按下,挂起任务1;Key2按下,恢复任务1
   Key3按下,挂起调度器;Key4按下,恢复调度器 */

char Task_info[500];  //定义一个字符数组,用于接收任务信息字符串

void Task3(void *pvParameters)
{
    uint8_t key = 0;
    while(1)
    {
        printf("任务3执行...\r\n");
        key = Key_Detect();
        if(key == KEY1_PRESS)
        {
            /* 挂起任务1 */
            printf(">>>>>挂起Task1...\r\n");
            vTaskSuspend(Task1_Handle);
        }
        else if(key == KEY2_PRESS)
        {
            /* 恢复任务1 */
            printf("<<<<<恢复Task1...\r\n");
            vTaskResume(Task1_Handle);
        }
        else if(key == KEY3_PRESS)
        {
            /* 挂起调度器 */
            printf(">>>>>挂起调度器...\r\n");
            vTaskSuspendAll();
        }
        else if(key == KEY4_PRESS)
        {
            /* 恢复调度器 */
            printf("<<<<<恢复调度器...\r\n");
            xTaskResumeAll();
        }

        /* 打印任务的状态 */
        vTaskList(Task_info);
        printf("%s\r\n", Task_info);


        vTaskDelay(500);
        /* 因为任务3的优先级最高,所以需要延时500ms,让他让出CPU资源给任务1和任务2 */
    }
}
相关推荐
Zw-awa9 小时前
定时器到底在数什么:STM32 的时间基准从哪里来
stm32
三佛科技-1873661339710 小时前
FT32F405RE02-LB是什么芯片?基于ARM Cortex M4带FPU的MCU芯片解析
stm32·单片机·嵌入式硬件
゛凌乱的记忆づ12 小时前
50元从零到成品:一套AI辅助的嵌入式实战入门教程——ADC采集篇
stm32·单片机·嵌入式硬件
XiHongShi201617 小时前
STM32F407 CRC-循环冗余校验例程,建议保存学习
stm32·单片机
lhbweilai18 小时前
结合手册调试各个功能的寄存器+最后通过寄存器编写SPI的初始化和读写函数
stm32·单片机
Zw-awa1 天前
先让程序开口说话:为什么把人机交互放在最前面
stm32
Zw-awa1 天前
把按键和 LED 状态显示出来:第一次看见程序到底在干什么
stm32
Zw-awa1 天前
面包板接线为什么这样接:从模块需求到芯片资源分配
stm32
小程序设计1 天前
基于STM32的办公室智能空气净化系统设计
stm32·单片机
Zw-awa1 天前
用 OLED 给 STM32 做实时调试面板
stm32