外观
怎样暂停任务的运行
有时候,我们希望:
- 临时让某个任务停止运行(比如调试时关闭日志线程,或进入低功耗模式时关闭非必要任务);
- 或在外部条件满足后再重启任务(如设备初始化完成后再启动数据采集任务)。
这时就需要任务挂起与恢复机制。也就是说,暂停某个任务任务的运行。
相关接口
为了实现该功能,需要使用下表的两个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;
}