rt-thread 中的系统任务
实时操作系统中在用户进程创建前系统任务已经创建运行,其中以 idle 任务最为常见,其它的如统计任务、软件定时器任务等等都是系统任务的实例。
最早我学习 ucos-II 时,我了解到该系统中存在着两个系统任务,分别是空闲任务和统计任务。当系统中无用户任务运行时,空闲任务就会被选中执行,空任务一般没有具体的工作,只是让 cpu 保持在运行状态,对空闲计数变量加 1。ucos-III 仍然有空闲任务与系统任务,除此之外还多了时钟节拍任务、软件定时器任务、中断服务管理任务,扩展了系统的功能。
较 ucos 而言,rt-thread 中除空闲任务、定时器任务(可配置)之外,还多了一个 main 任务。rt-thread 的执行入口函数并不是常见的 main,在 rt-thread 中 main 函数仅仅作为 main 任务执行主体中的子函数进行调用。
main 任务中完成了组件初始化工作,其它相对低级的初始化工作由 rtthread_startup 函数完成。
我在这里想着重讲讲 rt-thread 的空闲任务,它与 ucos 中的空闲任务不同,它完成了任务资源回收的工作。不得不说这一点对系统的性能有很大的提升,这就是追求卓越的性能的一种方式。任务的退出变得更加简洁,对任务占有资源的延迟回收有助于提高 cpu 使用率。
对于静态创建的任务而言,强制删除任务与任务的自然终止都仅仅通过从系统的就续表中解除链接的方式完成,不需要释放内存。对于动态创建的任务而言,强制删除任务与任务的自然终止也要完成同样的功能,不过 rt-thread 将任务占有的动态数据结构延迟释放。仅仅在任务退出时将任务插入到回收链表中,在下一次系统空闲时由空闲任务的执行函数遍历回收链表来释放动态数据结构。
用户可以实现属于单个任务的回收函数,该回收函数是 tcb 中的 cleanup 函数指针。当该函数部不为空时,就会在 idle 任务中进行执行。这是一个扩展,增强了任务资源回收的灵活性。