第三章 · 任务管理与调度 本章要回答的三个问题:优先级到底该怎么定,有没有可计算的方法而不是拍脑袋?调度器在每个时刻具体在做什么,凭什么保证高优先级任务总是先跑?一次任务切换到底花多少时间,时间都花在哪几个动作上? 为什么会有这一章 调度是 RTOS 的心脏,也是最多人「用过但没懂」的部分。多数开发者会创建任务、会设优先级,但说不出三个问题:为什么这套系统敢承诺截止期、切换一次的代价是多少、优先级设高了或设低了分别会怎样。后果是两类典型事故:优先级全设成一样导致调度器退化成先来先服务;或者为了「让采样快一点」把采样任务抬到最高,反而饿死了看门狗喂狗任务,系统被周期性复位。 本章按「建模—决策—执行」三步走:3.1 节定义任务与它的生命周期,这是调度的对象;3.
本章要回答的三个问题:优先级到底该怎么定,有没有可计算的方法而不是拍脑袋?调度器在每个时刻具体在做什么,凭什么保证高优先级任务总是先跑?一次任务切换到底花多少时间,时间都花在哪几个动作上?
调度是 RTOS 的心脏,也是最多人「用过但没懂」的部分。多数开发者会创建任务、会设优先级,但说不出三个问题:为什么这套系统敢承诺截止期、切换一次的代价是多少、优先级设高了或设低了分别会怎样。后果是两类典型事故:优先级全设成一样导致调度器退化成先来先服务;或者为了「让采样快一点」把采样任务抬到最高,反而饿死了看门狗喂狗任务,系统被周期性复位。
本章按「建模—决策—执行」三步走:3.1 节定义任务与它的生命周期,这是调度的对象;3.2 节讲调度算法与可行性分析,这是决策逻辑,也是全书数学最密的一节;3.3 节拆开上下文切换,把执行代价算成周期数。读完这三节,第一章立下的「截止期防守」就有了完整的攻防手册。
| 节号 | 回答的问题 | 关键产出 |
|---|---|---|
| 3.1 任务模型与状态机 | 任务是什么,有哪些状态,如何创建与删除 | 状态机图、TCB 与栈的布局、创建代码 |
| 3.2 调度算法与策略 | 谁先运行,如何证明都能按期完成 | 优先级分配规则、利用率判据、响应时间分析 |
| 3.3 上下文切换与开销优化 | 切换的动作序列与代价,如何减少切换 | 切换时序标注图与切换开销的构成清单 |
先立对象模型,再讲决策算法,最后算执行代价——顺序不可换,因为后两节都建立在 3.1 的状态定义上。
第二章的两个结构(TCB、就绪表)必须先掌握;1.1 节的截止期与 WCET 定义会在 3.2 节大量使用。数学只需要初中水平的求和与取整。
任务生命周期构成一个封闭状态机,调度的全部工作就是把任务在「就绪、运行、阻塞」三个态之间搬运,搬运规则下节展开:
读这张图有两个入口:从「运行态到阻塞态」出去的箭头是任务自愿让出处理器,延迟可控;从「运行态到就绪态」的箭头是被迫让出,它的时机由别人决定——实时性分析的重点正是这条被迫箭头多久发生一次。
调度解决「谁用处理器」,但任务之间的协作还得靠同步与通信原语:两个任务共抢一个外设时怎么排队、一个中断怎么把数据安全地递给任务。这些是第四章的内容,而 3.2 节埋下的优先级反转问题,将在 4.3 节得到正面回答。
调度是全书数学最密的一章,也是最容易「看懂了但不会用」的一章,这里给三条学习方法。第一,每个公式配一个自己的任务集:把手上项目的真实参数(周期、执行时间)代入利用率判据与迭代公式,算出结果再去仪器上实测,数学与测量的差距会教你认识 WCET 估计的误差来源。第二,状态机要配上时间标注:单独的状态迁移图是定性的,把每个迁移的触发频率标上去,它就变成定量分析的第一手材料。第三,切莫死记算法结论,抓住「优先级是为了谁、抢占代价是什么、阻塞时间从哪来」三个主轴,所有变体都能现场推导。
自查两问:把一个任务集的周期整体减半,利用率判据的结果会怎么变?某任务的截止期比周期短,优先级该怎么排?这两问背后分别是判据的尺度无关性与截止期单调规则——答不出说明还停在记忆层,回 3.2 节再走一遍算例。