第三章:飞控计算机(FCC)软件架构

分区操作系统:VxWorks 653 的硬核世界

说到飞控计算机的软件架构,我第一个想到的就是分区操作系统。说白了,这就是一个「大管家」,负责管理多个应用程序,确保它们互不干扰。

我个人习惯把 VxWorks 653 比作一栋公寓楼。每个应用程序就像一户人家,有自己的房间(分区),有自己的水电表(资源),还有自己的作息时间(时间片)。你想想看,如果楼上楼下可以随便串门,那还得了?

在波音787的项目中,我遇到过一个问题:两个分区同时访问同一个内存地址。嗯,这在普通电脑上可能只是蓝屏,但在飞机上,那就是灾难。VxWorks 653 的核心价值就在这里——它用硬件和软件的双重隔离,确保这种事情永远不会发生。

核心要点: 分区操作系统不是简单的任务调度器,它是安全关键系统的「防火墙」。

ARINC 653 分区调度:时间与空间的精确切割

ARINC 653 标准定义了两种分区:空间分区和时间分区。空间分区确保每个应用有自己的内存空间,时间分区则确保每个应用获得固定的 CPU 时间。

我曾经在空客 A350 的架构评审会上,看到过一张调度表,密密麻麻的,像极了地铁时刻表。每个分区在什么时间运行、运行多久,都是精确到微秒的。

这里有个典型的调度配置示例:

// 分区调度表示例
PARTITION_SCHEDULE {
    PARTITION_ID = 1,  // 飞行控制分区
    PERIOD = 100,      // 周期 100ms
    DURATION = 40,     // 运行 40ms
    OFFSET = 0         // 起始偏移 0ms
}
PARTITION_SCHEDULE {
    PARTITION_ID = 2,  // 导航分区
    PERIOD = 100,
    DURATION = 30,
    OFFSET = 40        // 在分区1之后运行
}
PARTITION_SCHEDULE {
    PARTITION_ID = 3,  // 显示分区
    PERIOD = 100,
    DURATION = 20,
    OFFSET = 70
}

你可能会问:为什么不能把所有时间都给飞控分区?因为还有其他系统需要运行啊!导航、显示、通信,每个系统都有自己的任务。而且,这种固定调度还有一个好处:可预测性。我知道飞控分区每 100ms 一定能运行 40ms,这就够了。

小提示: 在实际项目中,分区调度表的设计往往需要反复迭代。我建议先做最坏情况分析,再优化时间分配。

健康监控(HM):系统的「体检医生」

健康监控,说白了就是给飞控计算机做体检。它监控 CPU 使用率、内存占用、任务执行时间、通信链路状态等。一旦发现异常,立即上报。

我记得在波音787的测试中,有一个分区偶尔会超时运行。健康监控模块检测到后,直接触发了分区重启。虽然当时看起来是「故障」,但实际上是系统在保护自己。

健康监控的典型架构包括:

  • 本地监控: 每个分区内部的自检
  • 全局监控: 操作系统层面的系统级监控
  • 交叉监控: 多台计算机之间的相互检查

这里有一个我参与设计的健康监控状态机:

// 健康监控状态机
enum HM_State {
    HM_NORMAL,      // 正常
    HM_WARNING,     // 警告(可恢复)
    HM_ERROR,       // 错误(需切换)
    HM_FAILURE      // 故障(需重启)
};

void HM_Monitor() {
    if (cpu_usage > 90%) {
        state = HM_WARNING;
        log_event("CPU 使用率过高");
    }
    if (task_deadline_missed > 3) {
        state = HM_ERROR;
        trigger_partition_switch();
    }
}
注意: 健康监控的阈值设置不能太敏感,也不能太迟钝。太敏感会导致频繁误报,太迟钝则可能错过故障。我曾经见过一个项目,因为阈值设得太低,一天触发了上百次告警,最后运维人员直接忽略了所有告警——这比没有监控更危险。

故障管理:从检测到恢复的完整闭环

故障管理是健康监控的「升级版」。它不仅检测问题,还要处理问题。故障管理的核心流程是:检测 → 隔离 → 恢复 → 记录。

在空客 A350 的飞控计算机中,故障管理分为三个层级:

层级 故障类型 处理方式
L1 瞬时故障 自动重试,无需切换
L2 持续故障 分区切换或通道切换
L3 严重故障 整机重启或降级运行

我曾经在项目中遇到过一个棘手的故障:两个飞控计算机同时报告对方故障。这就是所谓的「拜占庭故障」。最后我们通过引入第三个投票节点,才解决了这个问题。

故障管理的核心原则是:不要相信任何单一数据源。所有故障判断都需要交叉验证。

经验之谈: 故障管理不是越复杂越好。有时候,简单的「三取二」投票机制比任何花哨的算法都可靠。

知识体系总览

下面这张图展示了本章的核心逻辑关系:

飞控计算机软件架构核心逻辑 VxWorks 653 分区操作系统 ARINC 653 分区调度(时间+空间隔离) 健康监控(HM) 故障管理(FM) CPU/内存/任务/链路监控 检测→隔离→恢复→记录 目标:安全、可靠、可预测

这张图清晰地展示了从底层操作系统到上层应用监控的完整链路。VxWorks 653 提供基础隔离,ARINC 653 定义调度规则,健康监控和故障管理则确保系统在异常情况下依然可靠。

嗯,说到最后,我想强调一点:飞控计算机的软件架构,核心就三个词——隔离、监控、容错。把这三点做好了,系统就稳了。

避坑指南: 我曾经在项目初期忽略了分区间的通信延迟问题,结果后期测试时发现数据同步总是慢半拍。所以,设计阶段就要把分区通信的时序分析做透。
专注资料整理