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 */
    }
}
相关推荐
铅笔小新z2 小时前
【stm32】输入捕获-超声波测距
stm32·单片机·嵌入式硬件
Zw-awa2 小时前
PID 的花样:先看懂模糊 PID 和单神经元自适应 PID
stm32
铅笔小新z3 小时前
【stm32】全彩led灯(PWM)
stm32·单片机·嵌入式硬件
澄纸气3 小时前
STM32 外部中断实战:对射式计数器和编码器计数器,两个实验跑通 EXTI
stm32·单片机·嵌入式硬件
2501_922639583 小时前
率能半导体 SS6286L直流双向马达驱动芯片:18V/7A,覆盖电子锁、玩具、无线充电、机器人四大应用场景
stm32·单片机·嵌入式硬件·硬件工程
铅笔小新z5 小时前
【stm32】PWM呼吸灯
stm32·单片机·嵌入式硬件
深圳老胡5 小时前
RTX 与其他 RTOS 操作系统的差异及优缺点分析
笔记·stm32·单片机·代码规范
happygrilclh5 小时前
LVGL 移植整体流程
stm32
Brilliantwxx8 小时前
【STM32】 RTC 实时时钟详解:从概念到预分频器
stm32·单片机·嵌入式硬件·mcu·bash
lhbweilai11 小时前
分析FreeRTOS内核对象API的源码实现(四)
c语言·stm32·单片机