3. 实时任务模型与调度问题定义

在星载FPGA上讨论“实时调度”,第一步不是选算法,而是把任务描述清楚。星载软件里的任务并不都是同一种形态:有的按固定周期反复触发,有的由地面指令或遥测中断随机唤醒,有的只在故障发生时才出现。如果任务模型定义不统一,后续的截止时间判断、优先级分配和可行性分析都会失去基准。本节先把任务类型、时间参数和依赖关系定义清楚,再给出调度可行性的严格含义。

一、四类基本任务模型

星载实时任务通常按触发方式分为四类,它们的到达规律和可预测性差别很大。

  • 周期任务:以固定周期 T 重复释放,例如姿控周期解算每 10 ms 执行一次、载荷数据打包每 100 ms 执行一次。周期任务可预测性最强,是调度分析的主体。
  • 非周期任务:到达时间不确定,但通常有软截止时间,例如地面注入的软件参数更新、非关键的日志回传。错过截止时间一般只降低服务质量,不造成系统失效。
  • 偶发任务:到达时间不确定,但相邻两次到达之间有最小间隔,且通常带硬截止时间,例如单粒子翻转后的EDAC纠错、看门狗喂狗、故障保护动作。它比非周期任务更“危险”,必须保证最坏情况下仍可调度。
  • 任务图:一个作业由多个存在依赖关系的子任务组成,用有向无环图 DAG 表示,例如“采集→滤波→压缩→下传”这条处理链。任务图的调度要同时考虑节点执行和边上的数据依赖。

需要强调:偶发任务与非周期任务的区别不在“是否随机”,而在“是否有最小到达间隔约束”。有最小间隔,才能做最坏情况分析;没有,就只能按软实时处理。

二、时间参数与依赖关系

对每个任务 τᵢ,用一组参数完整刻画它的时间行为:

  • 释放时间 rᵢ:任务就绪、可以开始执行的时刻。周期任务第 k 次释放为 rᵢ + kTᵢ。
  • 执行时间 Cᵢ:任务在处理器上实际占用时间。星载FPGA上要区分最坏执行时间 WCET 与平均执行时间,调度可行性必须用 WCET。
  • 截止时间 dᵢ:任务必须完成的时刻。相对截止时间 Dᵢ = dᵢ − rᵢ;若 Dᵢ = Tᵢ 称为隐式截止时间,Dᵢ < Tᵢ 称为约束截止时间。
  • 响应时间 Rᵢ:从释放到完成的实际时间,Rᵢ ≤ Dᵢ 才满足时限。
  • 依赖关系:若 τⱼ 必须在 τᵢ 完成后才能开始,记 τᵢ → τⱼ,此时 τⱼ 的释放时间被前驱完成时间“推后”,即 rⱼ ≥ fᵢ。

依赖关系会显著改变可调度性。例如任务图中若前驱节点执行时间抖动大,后继节点的释放时间就不确定,必须按最坏路径长度估算。星载FPGA中常见的“采集→处理→下传”链,其端到端截止时间往往比单个节点截止时间更关键。

三、调度可行性定义

给定任务集 Γ = {τ₁, τ₂, …, τₙ} 和单处理器(或可并行资源集合),若存在一种调度策略,使所有任务在任意释放序列下都满足 Rᵢ ≤ Dᵢ,则称该任务集是可调度的。对周期任务,通常用利用率判据做充分条件:

U = Σ (Cᵢ / Tᵢ) ≤ n(2^(1/n) − 1)   // RM 调度充分条件
U = Σ (Cᵢ / Tᵢ) ≤ 1                // EDF 调度充要条件(隐式截止时间)

例如三个周期任务:τ₁(C=1 ms, T=5 ms)、τ₂(C=2 ms, T=10 ms)、τ₃(C=3 ms, T=20 ms),则 U = 0.2 + 0.2 + 0.15 = 0.55。对 n=3,RM 判据上限约 0.779,0.55 < 0.779,因此按速率单调调度可保证可调度。若再加入一个偶发任务,其最坏情况执行时间 2 ms、最小间隔 25 ms,则 U 增至 0.63,仍低于上限,但需进一步检查偶发任务与周期任务的最坏响应时间叠加。

星载工程中,利用率判据只是快速筛查。真正上星前还要做最坏响应时间分析(RTA),逐任务计算 Rᵢ = Cᵢ + Σ⌈Rᵢ/Tⱼ⌉Cⱼ,迭代到收敛,再与 Dᵢ 比较。

四、任务模型与调度问题的关系

把上述要素放在一起,就得到星载实时调度问题的完整定义:输入是任务集及其类型、时间参数、依赖关系和资源约束;输出是一个满足所有截止时间的执行顺序或优先级分配;约束包括处理器占用、总线带宽、存储器容量和功耗;目标通常是在保证硬实时任务可调度的前提下,最大化软实时任务完成率或最小化平均响应时间。

下图把四类任务、关键时间参数和可行性判断串成一张关系图,便于对照理解。

星载实时任务模型与调度可行性关系 周期任务 固定周期 T,可预测 非周期任务 随机到达,软截止 偶发任务 最小间隔,硬截止 任务图 DAG 子任务 + 依赖边 任务时间参数 释放时间 rᵢ 就绪时刻 执行时间 Cᵢ 取 WCET 截止时间 dᵢ Dᵢ = dᵢ − rᵢ 响应时间 Rᵢ Rᵢ ≤ Dᵢ 依赖 τᵢ→τⱼ rⱼ ≥ fᵢ 调度可行性判断 利用率筛查 U = Σ(Cᵢ/Tᵢ) RM: U ≤ n(2^(1/n)−1) 最坏响应时间分析 Rᵢ = Cᵢ + Σ⌈Rᵢ/Tⱼ⌉Cⱼ 迭代至收敛 结论 Rᵢ ≤ Dᵢ 全部成立 → 任务集可调度

回到工程实践:在星载FPGA上做调度设计时,建议先把所有任务按上述四类归档,逐个填写 rᵢ、Cᵢ、Dᵢ、Tᵢ 和依赖边,形成任务参数表;再用利用率做初筛,对未通过或临界任务做 RTA 精算;最后把偶发任务的最坏情况叠加进去复核。只有任务模型定义完整、参数取值有依据,调度可行性结论才可信,后续的优先级分配和资源预留才有意义。