外观
临时性任务的创建
任务并不总是执行其内部的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 和内存。
缺点:如果任务频繁创建/销毁,会增加较多的时间和内存开销。若系统资源不足,任务会创建失败。
综上所述,对于一次性资源初始化、低频触发的事件处理,可使用临时任务。而对于高频响应、长时间运行的场景,推荐使用常驻任务(即创建好后一直驻留于系统中)。