3. INTEGRITY分区与调度配置
INTEGRITY 的实时性与安全性,最终都落在“分区”和“调度表”这两件事上。分区是资源隔离与故障隔离的基本单位,调度表则决定每个分区在什么时刻、占用多长时间运行。理解这两者的配置关系,是后续做分区级测试、时序分析和故障注入的前提。
一、分区定义:先划边界,再谈调度
在 INTEGRITY 中,一个分区(Partition)本质上是一组被赋予独立地址空间、独立执行上下文和独立资源配额的运行单元。它可以是 ARINC 653 风格的分区,也可以是 INTEGRITY 原生的 Partition 对象。配置时通常需要明确以下要素:
- 分区名称与 ID:名称用于配置引用,ID 用于运行时标识,二者必须唯一。
- 入口点:分区首次被调度时执行的函数,通常是
PartitionMain或用户指定的初始化函数。 - 内存区域:代码段、数据段、堆栈、共享内存的地址范围与大小。
- 周期与时间窗口:该分区在一个主时间框架内被激活的时刻和持续长度。
- 优先级与调度属性:在时间窗口调度下,优先级通常不决定抢占,但会影响窗口内线程的排序。
一个典型的分区定义片段如下(示例参数,非实测值):
Partition FlightCtrl {
Id = 1;
EntryPoint = FlightCtrl_Main;
Period = 20 ms;
Duration = 5 ms;
Memory = { Code: 0x400000..0x420000, Data: 0x420000..0x440000 };
StackSize = 8 KB;
Criticality = HIGH;
};
这里 Period 和 Duration 是后续调度表配置的直接输入。分区定义阶段如果周期或窗口长度设置不合理,后面无论怎么调调度表都无法弥补。
二、时间窗口调度表:把周期切成可验证的片段
INTEGRITY 的时间窗口调度(Time Partitioning)通常由一个主时间框架(Major Time Frame, MTF)驱动。MTF 是一个周期性重复的时间轴,长度等于所有分区周期的最小公倍数。在每个 MTF 内,调度表按顺序列出若干时间窗口,每个窗口绑定一个分区。
假设系统有三个分区:FlightCtrl(周期 20 ms,窗口 5 ms)、Nav(周期 40 ms,窗口 8 ms)、Display(周期 40 ms,窗口 4 ms)。MTF 取 40 ms,则一个 MTF 内可安排如下窗口序列:
| 窗口序号 | 起始时刻 | 长度 | 分区 | 说明 |
|---|---|---|---|---|
| W1 | 0 ms | 5 ms | FlightCtrl | 第 1 次激活 |
| W2 | 5 ms | 8 ms | Nav | 第 1 次激活 |
| W3 | 13 ms | 4 ms | Display | 第 1 次激活 |
| W4 | 20 ms | 5 ms | FlightCtrl | 第 2 次激活 |
| W5 | 25 ms | 8 ms | Nav | 第 2 次激活 |
| W6 | 33 ms | 4 ms | Display | 第 2 次激活 |
这张表的关键约束是:每个分区的所有窗口长度之和必须等于其 Duration,且窗口间隔必须等于其 Period。例如 FlightCtrl 在 0 ms 和 20 ms 各有一个 5 ms 窗口,周期正好 20 ms。如果窗口总长度超过 MTF,或者某个分区在 MTF 内没有获得足够窗口,配置工具会在加载阶段报错。
三、主时间框架配置:周期、同步与漂移
主时间框架的配置参数主要包括:
- MTF 长度:所有分区周期的最小公倍数,必须能被每个分区周期整除。
- 时钟源:通常使用硬件定时器,如 CPU 的本地 APIC 定时器或外部时钟。
- 同步方式:自由运行或与外部时间源同步。航空电子中常与 ARINC 653 的
System Time对齐。 - 漂移补偿:当 MTF 与外部时钟存在偏差时,通过微调窗口长度或插入空闲窗口来补偿。
MTF 配置的核心判断依据是“可调度性”:所有分区的窗口总长度加上切换开销,必须小于等于 MTF 长度。用公式表示:
Σ(每个分区在 MTF 内的窗口总长) + Σ(切换开销) ≤ MTF 长度
如果等式左边接近右边,系统余量不足,任何额外的调试或监控任务都可能导致窗口溢出。工程上通常保留 10%~20% 的余量。
四、分区属性设置与资源分配
分区属性决定了它在运行时的行为边界。常见属性包括:
- Criticality(关键等级):HIGH / MEDIUM / LOW,用于故障传播分析。
- Memory Budget:分区可用的最大内存,超出会触发内存保护异常。
- CPU Budget:分区在窗口内可消耗的最大 CPU 时间,通常等于窗口长度。
- Health Monitoring:分区级健康监控动作,如重启分区、停止分区或触发系统级处理。
- Shared Memory Access:允许访问的共享内存区域及读写权限。
资源分配时,一个常见的误区是只关注内存大小,而忽略“时间资源”的分配。在时间窗口调度下,CPU 时间不是按需分配,而是按窗口固定分配。因此,分区内的线程必须在一个窗口内完成一轮处理,否则会被强制挂起,等到下一个窗口继续。这要求分区内的任务设计必须与窗口长度匹配。
gm 或 MULTI 调试器查看分区状态和调度表加载情况。重点关注:分区是否按预期激活、窗口是否发生溢出、健康监控是否被触发。
上图展示了一个 MTF 为 40 ms 的调度实例。三个分区按各自的周期和窗口长度被安排进时间轴,窗口之间保留了空闲余量。底部给出了可调度性判断:所有窗口总长 34 ms,小于 MTF 的 40 ms,余量约 15%,属于可接受范围。如果这个余量低于 10%,就需要重新调整分区周期或窗口长度。
在实际配置中,分区定义、调度表、MTF 和属性设置是相互约束的。修改任何一个分区的周期,都可能需要重新计算 MTF 并重排整个调度表。因此,建议先用表格或脚本把周期、窗口、余量算清楚,再写入 INTEGRITY 的配置文件,避免反复试错。