在前面的课时中,任务都是以松散的方式直接放在存储器中,没有进行统一整理。那么在这节课时中,我们将尝试将系统中所有任务通过一定的方式组织在一起。同时引入优先级的概述,为每个任务分配了一个优先级。

如果你熟悉ucos ii的话,可以看到你对于任务优先级的划分与调度算法的处理与该课程中的一致。

主要内容

课程中是使用了 位图 + 任务指针数组将任务组织起来。
多优先级任务 - 图1

重点难点

本课时的难点在于理解怎样通过 位图 + 任务指针数组 这两种数据结构将任务结构组织起来。
请在学习时,结合上图和代码,理清其组织方式。同时分析与任务调度(sched)相关的函数是处理扫描该结构,如何将任务插入其中或从其中移除。
在分析过程中,最好能够在头脑中形成其工作过程的动态动画。

注意事项

有的同学提到:引入优先级之后,如果高优先级任务占用CPU,低优先级的任务岂不是没有机会运行?
是的,这是由设计策略决定的。实际上,你可以选择别的策略,比如通过某种方式让任务得到运行的机会。但是这会要求你提出相应的算法。在这里,课程的目标设计一个简单易学的RTOS,且其运行于资源非常有限的硬件上,所以设计尽可能简单。
如果你有更好的思路,可以尝试实现。欢迎与我分享!

应用实例

  • 任务优先级配置

    常见问题

    为什么要在tTaskSchedRdy再次将任务插入就绪表

    Q:为什么要在tTaskSchedRdy再次将任务插入就绪表?从就绪表中删除和加入 这么做的目的 是不是为了以后的不同任务 可以占用同一个优先级?

多优先级任务 - 图2

A:删除要的,任务不可能一直在就绪表。任务删除、挂起啊。就绪表就是表示任务在就绪状态。和 不同任务 可以占用同一个优先级 没什么关系。

插入就绪表,表示这个任务已经正在等待cpu空闲去占有它运行。如果将任务删除了,这个任务就不应该存在了,那在就绪表里还有什么意义呢。

如果挂起,那就是暂停任务运行。那如果还留在就绪表里,那调度器是不是得在每次获取最高优先级的任务时,还得判断下这个任务是不是挂起,如果不是挂起,才运行。这样额外增加判断代码,而且浪费时间去执行这些代码吧。

所以,就从就绪表里移除了,这样对调度器来说算法就非常简单了