Skip to content

临时性任务的创建

李述铜

761字约3分钟

2025-08-30

任务并不总是执行其内部的while(1)循环。

在某些时候,任务只需要在某一时刻完成一次性工作的任务,完成之后就不再继续运行。例如:系统启动时进行初始化、响应某个事件做一次操作等。在这种情况下,我们需要创建临时性的任务去完成这些功能。

警告

临时性任务 --- 不用死记这个概念,大体理解意思就可以了。在不同的资料里,对这种任务的叫法可能不同。

与临时性任务相反,常驻任务指的是长期驻留在系统内执行的任务。


临时性(一次性)任务

综上所述,这种任务的特点如下:

  • 临时性任务只执行一次逻辑,执行完毕就自动退出或被系统删除。
  • 与常驻任务while(1)不同,临时任务不需要长时间占用 CPU。
  • 在资源有限的小系统中,用一次性任务处理事件是节省资源的好方式。

相关信息

为什么会节省资源?

即便任务不在运行,它所占用的任务控制块、栈空间等这些内存空间仍然是被保留的。因此,如果这些任务能够及时释放掉;那么空出的资源可以利用起来实现其它功能。

简单示例

我们可以通过一个简单的例子来演示这种任务:按下按键后点亮一个灯,然后任务结束。

设计思路如下:

  • 主任务中轮询按键是否按下;
  • 一旦检测到按键按下,就创建一个“点亮 LED”任务;
  • 点亮后延迟一会儿,再灭掉灯,任务结束。

示例代码:

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

// 临时性任务:LED闪烁一下
void led_task_entry(void *param) {    
    RT_UNUSED(param);

    led_set(LED0, 1);
    rt_thread_mdelay(200);
    led_set(LED0, 0);
    rt_thread_mdelay(200);

    led_toggle(LED1);
}

void key_task_entry(void *param) {    
    RT_UNUSED(param);

    while (1) {
        if (key_pressed()) {
            /* 创建LED心跳任务 */
            rt_thread_t led_thread = rt_thread_create(
                "led_heartbeat",
                led_task_entry,
                RT_NULL,
                4096,   // 栈大小
                0,    // 优先级
                5      // 时间片
            );
            if (led_thread) rt_thread_startup(led_thread);
        }

        // 间隔一秒,以免太快
        rt_thread_mdelay(1000);
    }
}

/*---------------------------------------
 * 应用入口(main函数)
 *--------------------------------------*/
int main(void) {
    hardware_init(); 

    /* 创建按键检测任务 */
    rt_thread_t key_thread = rt_thread_create(
        "key_monitor",
        key_task_entry,
        RT_NULL,
        4096,   // 栈大小
        0,    // 优先级
        5      // 时间片
    );

    /* 启动所有任务 */
    if (key_thread) rt_thread_startup(key_thread);
    return 0;
}

优缺点

优点:临时任务只在需要时创建,占用资源时间短。函数结束后自动退出,不会长期占用 CPU 和内存。

缺点:如果任务频繁创建/销毁,会增加较多的时间和内存开销。若系统资源不足,任务会创建失败。

综上所述,对于一次性资源初始化、低频触发的事件处理,可使用临时任务。而对于高频响应、长时间运行的场景,推荐使用常驻任务(即创建好后一直驻留于系统中)。