Skip to content

怎样暂停任务的运行

李述铜

433字约1分钟

2025-08-30

有时候,我们希望:

  • 临时让某个任务停止运行(比如调试时关闭日志线程,或进入低功耗模式时关闭非必要任务);
  • 或在外部条件满足后再重启任务(如设备初始化完成后再启动数据采集任务)。

这时就需要任务挂起与恢复机制。也就是说,暂停某个任务任务的运行。

相关接口

为了实现该功能,需要使用下表的两个API:

API 函数功能说明
rt_thread_suspend(rt_thread_t tid)将指定任务挂起;挂起后该任务不再被调度执行
rt_thread_resume(rt_thread_t tid)恢复一个被挂起的任务,使其重新进入就绪队列

使用示例

假设系统中有两个长期运行任务:

  • led_task:每秒闪烁一次 LED,表示系统在线;
  • log_task:每次循环打印调试信息。

当系统进入低功耗模式时,我们希望暂时挂起log_task,但仍然让led_task继续运行;那么,其实现代码如下:

#include <rtthread.h>
#include "base.h"

/* LED 任务:心跳指示 */
static void led_task(void *p)
{
    while (1)
    {
        led_toggle(LED0);
        rt_thread_mdelay(1000);
    }
}

/* 日志任务:打印调试信息 */
static void log_task(void *p)
{
    while (1)
    {
        rt_kprintf("debug: system running...\n");
        rt_thread_mdelay(500);
    }
}

int main(void)
{
    hardware_init();
    led_init(LED0);

    /* 创建并启动 LED 任务 */
    rt_thread_t tid_led = rt_thread_create("led", led_task, RT_NULL, 1024, 10, 10);
    if (tid_led) rt_thread_startup(tid_led);

    /* 创建并启动日志任务 */
    rt_thread_t tid_log = rt_thread_create("log", log_task, RT_NULL, 1024, 20, 10);
    if (tid_log) rt_thread_startup(tid_log);

    /* 运行 10 秒后挂起日志任务 */
    rt_thread_mdelay(10000);
    rt_kprintf("suspend log task\n");
    rt_thread_suspend(tid_log);

    /* 再运行 5 秒后恢复日志任务 */
    rt_thread_mdelay(5000);
    rt_kprintf("resume log task\n");
    rt_thread_resume(tid_log);

    return 0;
}