硬实时操作系统在飞控计算机里到底扮演什么角色?为什么飞控软件宁可牺牲一部分计算性能,也要把人命关天的任务交给一颗"看起来并不快"的实时内核?这个问题的答案,直接决定了无人机能不能稳住姿态、商用飞机能不能安全降落、火箭能不能按预定轨道飞行。
这篇文章我结合自己在飞控软件这块的开发和调试经历,把飞控计算机常用的硬实时操作系统技术掰开揉碎讲清楚。内容覆盖硬实时的本质要求、调度机制与确定性分析、主流实时操作系统的架构特性对比、分区隔离与安全认证,以及开发调试中的真实踩坑经验。无论是刚入门飞控的学生,还是已经在做嵌入式实时软件开发的工程师,应该都能从中找到有价值的东西。
1. 为什么飞控对"实时"的要求这么苛刻
1.1 从一次失控说起:时间确定性就是生命线
早些年我在某高校实验室参与一个四旋翼飞控的项目调试。当时用的是一块性能不错的ARM应用处理器,跑的是普通的Linux发行版。飞行姿态解算和控制输出的代码逻辑本身没有问题,PID参数也调到了不错的水平。但问题是:系统偶尔会出现几十毫秒的调度延迟——可能是某个后台服务占了CPU,也可能是内核在刷页缓存。
飞机在空中悬停的时候,姿态环的更新周期是5毫秒。如果某一次控制输出晚了20毫秒,姿态早就飘出去了,等控制指令到达电机,飞机已经不知道偏到哪里了。那次试飞,飞机在悬停状态下突然猛地一仰,然后侧翻摔了下来。
这个经历让我彻底明白了一件事:飞控系统的核心要求不是"平均性能足够好",而是"最坏情况下的响应时间可预测、有上界"。这就是硬实时系统存在的根本原因——它不追求平均速度,它追求的是确定性。
1.2 硬实时与软实时的分界线到底在哪
所谓硬实时,指的是系统必须在规定的时间截止期限(deadline)内完成计算,超时等于失败,甚至等于灾难。飞控里的姿态控制、导航解算、舵机指令输出都是典型的硬实时任务,周期5到50毫秒不等,错过一个周期就可能造成飞行品质下降,错过好几个周期就是坠机。
软实时则不一样,比如播放视频丢一帧、玩游戏掉一次帧,虽然体验不好,但不会造成灾难性后果。可以做一个小对比:
| 对比项 | 硬实时 | 软实时 | 普通分时系统 |
|---|---|---|---|
| 超时的后果 | 灾难级 | 质量下降 | 无感或可接受 |
| 最坏执行时间关注度 | 必须严格分析 | 尽量优化 | 不太关心 |
| 典型系统 | 飞控、航电、医疗 | 音视频处理 | 桌面Linux、Windows |
| 调度器目标 | 满足所有截止期限 | 尽可能少丢截止期限 | 公平分配、高吞吐 |
飞控计算机选操作系统的时候,第一条硬性条件就是:必须是硬实时操作系统,或者具备硬实时扩展能力的实时内核。普通操作系统哪怕能跑,也只能用于地面站之类非安全关键场景。
要在死机上找到一条能跑通训练的最小网络,最直观的思路就是反复试。把超参分组排开,每组都从零开始训练一轮,记录净准确率的提升曲线,看哪一组能让网络在最短时间内学到最多的关键特征。这个做法我用过,最深的体会是:迁移学习微调和分布式训练的初始化方式,比单纯堆迭代次数影响大得多。
1.3 飞控任务的时间窗口到底有多紧
很多非实时系统工程师一听到"5毫秒周期"会觉得不可思议,觉得这不过是个很小的数值,现代CPU随便跑。但问题是,你要处理的不是单任务,而是多路并行任务:传感器采集、姿态解算、控制律计算、指令输出、遥测上报、故障诊断,每一项都有严格的时间限制。姿态解算和控制律输出必须在同一个周期内完成,不能错位。
以典型的无人机飞控为例,内环姿态率控制率更新周期通常为1到10毫秒,外环位置控制为20到50毫秒,导航解算为10到100毫秒。这些任务共享同一颗CPU,如果没有一个可靠的实时调度内核兜底,任何一次调度延迟都会被放大到飞机姿态上。
所以,飞控对操作系统的要求从来不是"快",而是"可预期的快"。中断响应时间、任务切换时间、信号量释放后的调度延迟,这些指标必须有明确的最坏情况上界。这也是为什么硬实时操作系统的调度器设计远比普通操作系统复杂。
2. 硬实时内核的核心技术:确定性从何而来
2.1 优先级抢占式调度:飞控任务编排的基本盘
硬实时操作系统普遍采用固定优先级抢占式调度(Fixed-Priority Preemptive Scheduling,FPPS)。每一个任务在创建时就分配一个固定优先级,就绪队列按照优先级排序,高优先级任务一旦就绪,立刻抢占当前正在运行的低优先级任务。
这种调度策略的优势是确定性强:给定一组任务和优先级,系统在任意时刻的调度行为都可以通过优先级表直接推导出来。飞控系统一般把任务按安全等级排列:紧急停车和故障处理最高,姿态控制次之,导航解算再次之,遥测和数据记录最低。
这里我想多说一句关于优先级分配的问题。很多新手上来就按照"感觉"分配优先级,高不成的调来调去。实际上有一套成熟的最优优先级分配算法,叫做Audsley算法。它的核心思想是先找出在最坏情况下可以满足截止期限的任务作为最低优先级,然后不断迭代。用这个算法分配出的优先级,加上响应时间分析检验,才能保证系统在极限负载下依然能满足所有截止期限。否则就是"经验分配"加碰运气,飞行中迟早出问题。
2.2 响应时间分析:怎么证明"最坏情况也不会超时"
光有调度策略还不够,硬实时系统必须能够通过数学分析证明任务集是可调度的。常用的分析方法有两种:利用率测试和响应时间分析。
利用率测试最经典的是RM(速率单调)调度下的充分条件:CPU利用率不超过某个上限(比如最简单的版本是n(2^(1/n)-1)),任务集就一定可调度。不过这个条件偏保守,实际工程中用得更广泛的是响应时间分析。
任务的响应时间R由自身最坏执行时间C、被高优先级任务抢占的时间、以及低优先级任务占用共享资源的阻塞时间共同构成。公式可以简写为:
R = C + B + Σ(C_i的累积干扰)
其中B是阻塞时间,来自低优先级任务持有共享资源时导致的优先级反转;Σ(C_i)是比当前任务优先级更高的所有任务在同一间隔内的累积执行时间。响应时间分析就是围绕这个方程迭代求解R,直到R收敛并且小于等于该任务的截止期限D。
这个分析过程在飞控开发中不是可选项,是必选项。我们开发飞控软件的时候,每个周期任务的WCET(最坏执行时间)都要通过静态分析和实际测试两条腿走路来获取。静态分析借助工具链基于代码结构估算上界,实际测试则用逻辑分析仪或示波器在目标机上带最大负载跑,两者取较保守值作为设计输入。
2.3 中断延迟:硬实时系统最容易忽略的隐形杀手
任务调度是操作系统层面的延迟,而中断延迟是硬件和操作系统内核层面的延迟。中断来了之后,从硬件触发到中断服务程序第一条指令开始执行,中间经过的时间叫中断延迟。这个时间包括硬件仲裁时间、CPU响应判断时间、以及内核中断入口代码的执行时间。
硬实时操作系统在中断延迟上的优化是极致的。以我调试过的几个实时内核为例,它们普遍采用"快速中断入口"方式,尽可能少关中断。普通Linux为了自身的数据结构一致性,关中断的临界区可能长达几十到上百微秒,这在飞控里是完全不可接受的。VxWorks和RTEMS这类硬实时内核把最大关中断时间压缩到几微秒以内。
我踩过的一个坑是:在硬件抽象层里加了一个调试用的外设驱动,驱动里用了很长的临界区保护,导致中断响应时间在极端情况下多出30微秒。30微秒在飞控里意味着什么?5毫秒周期里占0.6%,看似不多,但如果这个延迟发生在外环控制输出的那一刻,传感器数据的时间戳就不准确了,导航解算的延迟补偿逻辑会跟着错。
3. 飞控领域主流硬实时操作系统的架构与选型
3.1 VxWorks:航电和飞控领域的传统主力
VxWorks是风河公司的商业实时操作系统,也是目前飞控计算机中应用最广泛的商用系统之一。很多大型飞行器项目选择VxWorks,核心原因在于它的硬实时特性和经过验证的可靠性。VxWorks提供微内核和实时进程两种模型,调度器支持256个优先级(0最高,255最低),切换时间稳定在微秒级别。
VxWorks 7之后的架构变化很大,从单一内核变成模块化平台,支持SMP和AMP两种多核模式。飞控系统用的多核处理器越来越普遍,VxWorks对多核的支持也比较成熟。但多核调度也带来了新的问题——核间干扰。一个核上的中断和调度可能会影响另一个核上的任务执行时间,这在单核时代是不存在的。所以现在很多飞控设计宁愿选择AMP模式,把不同安全等级的功能划分到不同核上,避免相互干扰。
VxWorks的缺点是贵,授权费用和开发工具链(Workbench)都不便宜。而且商业闭源带来的问题是你没法直接看源码定位问题,出了问题只能向原厂提工单。所以不少非安全关键项目开始转向开源方案。
3.2 RTEMS:开源硬实时系统里的老将
RTEMS(Real-Time Executive for Multiprocessor Systems)是开源社区维护的硬实时操作系统,在航空航天界有着深厚的应用积累。RTEMS采用经典的可抢占式优先级调度与RMS/EDF调度结合的方式,支持POSIX API和经典RTEMS API两套接口,模块化程度极高。
RTEMS有几个地方给我留下了很深的印象。第一个是它的调度器和中断响应时间非常可预测,在开源社区里有大量针对最坏执行时间的分析文档。第二个是它的设备驱动框架和板级支持包结构清晰,适配新硬件比想象中容易。第三个是它对老架构的支持,从x86、PowerPC到ARM、RISC-V,覆盖面很广。
RTEMS的License是GPL,但有一个面向商业应用的例外条款。如果你只是把RTEMS作为独立的内核镜像运行在设备上,不把应用和内核链接成一个整体,那么应用可以保持闭源。我在实际项目里用RTEMS做过一个飞控前端处理器,整体下来体验不错,社区回复也算及时。当然,开源系统的通病是主要依靠社区维护,遇到冷门硬件的BSP质量问题,得自己啃源码。
3.3 FreeRTOS与SafeRTOS:轻量级实时内核的另一条路线
FreeRTOS大概是嵌入式圈子里知名度最高的实时内核,但很多人以为它只是跑MCU的小系统。实际上,FreeRTOS经过这些年的发展,早已支持SMP多核和MMU,也能运行在应用处理器上。飞控领域里,像PX4一部分早期版本基于NuttX,而不少商业飞控的内核实现里都能看到FreeRTOS的身影。
FreeRTOS的优点是极轻量、学习曲线平缓、生态庞大,社区资料非常丰富。缺点也很明显:标准的FreeRTOS并没有通过安全认证,对于需要达到高安全等级的飞控产品来说,直接使用有合规风险。SafeRTOS是FreeRTOS的认证版本,通过了一些安全相关的认证,但需要商业授权。
从我的使用感受来看,FreeRTOS比较适合中小型无人机、穿越机、教育科研用途的飞控。如果项目目标是民航适航级的飞行控制系统,那还是得往VxWorks、RTEMS或者更专业的分离内核方案上靠。
3.4 分离内核与分区操作系统:安全关键的终极方案
在大型民机航电系统里,IMA(综合模块化航电)架构已经成为主流。IMA的核心思想是"多个应用共享一台计算机,但通过操作系统分区机制实现功能隔离"。对应到操作系统层面,就需要支持空间分区和时间分区的实时内核。空间分区保证一个分区的内存不会被其他分区访问;时间分区保证每个分区在固定时间窗口内独占CPU,不受其他分区负载影响。
这个领域最典型的设计就是ARINC 653标准。它定义了分区的调度框架、端口通信机制和健康监控服务。基于ARINC 653的操作系统,比如VxWorks 653、PikeOS、天脉等,都是面向大型飞控和航电系统的专用方案。分区操作系统的核心价值在于:不同安全等级的应用跑在同一台计算机上,但它们之间互相隔离,一个分区的失效不会扩散到其他分区。
对于飞控计算机而言,如果飞行控制系统和安全告警系统跑在一台计算机上,你绝对不希望告警系统因为一个缓冲区溢出把飞控分区也拖垮。分区隔离就是解决这个问题的。这也是为什么国内外的飞控计算机设计越来越倾向于采用分区操作系统架构。
下面用一个表格把这些操作系统的关键特性做个对比:
| 操作系统 | 开源/商业 | 硬实时 | 多核支持 | 分区/安全认证 | 典型应用 |
|---|---|---|---|---|---|
| VxWorks | 商业 | 是 | 好 | 支持 | 大型飞行器、航电、军用装备 |
| RTEMS | 开源 | 是 | 支持较好 | 有限认证 | 空间站设备、无人机飞控、卫星 |
| FreeRTOS | 开源 | 是 | 支持SMP | 不认证 | 中小型无人机、MCU飞控 |
| SafeRTOS | 商业 | 是 | 部分 | 通过安全认证 | 汽车、医疗、工业控制 |
| PikeOS | 商业 | 是 | 好 | 分区+认证 | 大型航电、安全隔离系统 |
4. 任务设计与接口机制:飞控应用到底怎么用操作系统
4.1 任务周期和优先级如何映射到飞控功能
飞控软件的框架套路其实比较固定。如果跑VxWorks或RTEMS这类系统,飞控程序往往是一堆周期性任务加一堆事件触发任务。周期性任务对应姿态控制、导航解算这些固定频率运行的模块;事件触发任务对应传感器数据就绪中断、操控指令到达、故障告警这些"来了就要处理"的事情。
拿一个典型的无人机飞控任务集举例:
| 任务 | 周期/触发 | 典型WCET | 优先级 | 所属控制环 |
|---|---|---|---|---|
| 姿态率控制输出 | 2ms周期 | 350us | 高 | 内环 |
| 姿态解算与滤波 | 5ms周期 | 500us | 中高 | 内环 |
| 位置与速度控制 | 20ms周期 | 300us | 中 | 外环 |
| GNSS融合定位 | 100ms周期 | 2ms | 中低 | 导航 |
| 遥测上报 | 50ms周期 | 400us | 低 | 数据链路 |
这个表的关键在于:任务优先级的高低与安全重要性严格对应,而不是按计算量大小分配。姿态控制任务代码量不大,但优先级必须最高。遥测上报虽然计算量不小,但它就算延迟一两个周期也无所谓,所以优先级放最低。
4.2 实时任务间的通信与同步机制
多任务系统跑起来之后,任务之间必然要交换数据。姿态解算任务算出了姿态四元数,控制任务要用这个结果。实时系统提供的通信手段主要有全局变量加锁、消息队列、共享内存、事件标志。在飞控里,大量"周期性快照式"的数据交换都是通过无锁的共享内存配合时间戳完成的。
这里有个技巧:如果数据的生产者和消费者的周期是固定的倍数关系(比如姿态解算5ms一次,控制输出2ms一次),那共享内存加双缓冲就能实现无锁读取,前提是读写方都不在同一时刻操作同一块缓冲区。这种情况下要小心的是CPU缓存一致性问题——多核处理器下核心之间数据交换要加内存屏障,否则读到的可能是过期的缓存值。
任务间同步用得最多的是信号量和事件标志。信号量用来保护临界区,比如多个任务都要访问同一个串口外设;事件标志用来做周期任务之间的对齐,比如导航任务检测到"传感器数据包已就绪",置一个事件,等待该事件的解算任务被唤醒执行。这些机制在实时系统里都有固定开销,使用时要估算每个系统调用最坏情况下的阻塞时间,防止因信号量持有时间过长引发优先级反转。
4.3 优先级反转问题:教科书案例里的真实现场
说到优先级反转,我印象最深的一次是某型飞控系统在地面测试时出现"偶发失响应"的bug。症状是飞机偶尔会丢一次操控指令,频率不高,但很诡异。查了几天链路,最后定位到实时内核的信号量优先级继承机制上。
问题的大致场景是:低优先级的遥测任务持有了一把锁,正在往串口缓冲区写数据。高优先级的控制任务在等待这把锁,而被中优先级的数据记录任务不断抢占CPU。结果就是控制任务被"堵在门外",而中优先级任务不停地占用CPU执行无关工作。这就是经典的优先级反转。如果内核没有优先级继承机制,高优先级任务的最坏等待时间比正常情况大很多倍,时间确定性完全被破坏。
解决办法是在设计层面控制锁的持有时间——飞控任务里任何临界区都应该是几微秒级别,不能在临界区里做耗时操作。同时,如果实时内核支持优先级继承或优先级置顶协议,构造任务集时要对共享资源的访问顺序做优先级排序,让高优先级任务优先获得资源。这些都是调度理论里的细节,但实际工程中它们决定了系统在最坏情况下还能不能完成控制任务。
5. 分区隔离与认证:大型飞控绕不开的合规话题
5.1 从"一机一系统"到"一机多系统"的演变
早期飞控系统的做法是"功能专用":飞行控制一台计算机、导航一台计算机、告警管理一台计算机,每个计算机跑一套独立软件,物理隔离。这样做安全稳定,但代价是重量、功耗和成本都很高。现代航电和大型无人机追求的是"综合化",尽可能减少计算机数量,让一台高性能计算机同时跑多个功能。
于是就有了前面提到的分区操作系统架构。一个分区负责飞控任务,一个分区负责导航任务,一个分区负责数据链路管理。操作系统按分配好的时间窗口轮转运行各个分区,每个分区的应用完全不知道其他分区在干什么——它以为自己独占整机。
5.2 ARINC 653时间分区和空间分区的实现逻辑
ARINC 653的调度框架里,CPU时间被切分成一个个主时间框架(Major Time Frame),每个分区在主时间框架内占据若干个时间窗口(time window)。只要窗口配置合理,即使某个分区内部的任务跑飞了、死循环了,操作系统也会在窗口结束的瞬间强制切换走,其他分区的执行不会受到影响——这就是时间分区隔离。
空间隔离靠的是MMU。操作系统为每个分区配置独立的虚拟地址空间,内核在切换分区时切换对应的MMU映射。某个分区访问地址越界或者非法直接会触发内存保护异常,而不是把其他分区的内存数据破坏掉。这种隔离机制对飞控尤其有价值,因为飞控软件通常要运行大量第三方供应商软件,你不能保证每一行代码都无懈可击,但分区隔离可以把"万一出错"的范围限制住。
5.3 面向适航认证的软件开发流程
如果产品目标是走向民航市场和大型无人机适航认证,开发流程本身和操作系统选型同样重要。业界普遍遵循的标准是DO-178C,它把软件的安全等级划分为A到E级,A级是最高等级,对应灾难性失效条件的软件。飞控计算机涉及飞行操纵功能,往往要达到A级或B级。
DO-178C对软件过程的要求非常细,包括需求追踪、设计审查、代码标准、测试覆盖率、配置管理和适航审定联络。硬实时操作系统的选型与认证直接相关——用商业实时操作系统的话,要拿到原厂提供的认证包,包括系统安全评估和内核验证报告。用开源系统的话,认证工作量和难度就大得多,你必须自己完成大量证据类文件的编写。
很多人觉得认证就是做文档、走流程。做过的都知道,真正痛点在于测试覆盖率分析。A级软件要求条件/判定覆盖(MC/DC),意味着每一个布尔表达式的每个条件都要独立影响整个判定结果。飞控软件里到处都是复杂的逻辑判断,为MC/DC设计测试用例算是一项既费脑又枯燥的工作。但这就是安全关键软件的常态——你没有理由证明"没出事",你只能通过过程证据说明"所有可能出事的路径都被分析和测试过"。
6. 开发调试中的常见坑:我花过时间换来的经验
6.1 堆栈溢出不会立刻崩,它会悄悄破坏数据
实时系统任务都有固定大小的任务栈,任务函数嵌套调用过深、局部数组声明过大,都可能造成栈溢出。在飞控系统里,栈溢出通常不是马上崩溃的,而是先覆盖了相邻的内存区域,可能是另一个任务的关键数据结构,也可能是内核的控制块。表现出来就是"数据偶尔被篡改"。
我用过的最有效的方法是给每个任务栈的末尾填充一个固定模式(比如0xDEADBEEF),系统周期性扫描栈填充区域是否被改写。跑时间长了之后,如果发现某段填充区域有变化,说明对应的任务栈深度接近极限了。通过这种方式能够在新机型适配阶段及早发现栈配置问题。代码审查再加上栈水位分析工具,组合用下来效率最高。
6.2 看门狗超时和复位逻辑的"假安全"
几乎所有飞控计算机都配了硬件看门狗,防止软件死锁或者死循环。看门狗的设计也有讲究:如果只是简单地在主循环里喂狗,那CPU哪怕某些任务已经卡死,只要主循环还在跑,喂狗照常,系统永远感觉不到异常。
正确做法是给看门狗设置分层喂狗策略。最底层是中断级的喂狗,保证内核中断系统还在运作;上一层是调度级的喂狗,保证操作系统还在切换任务;再上层是周期任务的喂狗,保证飞控关键功能还在周期性执行。每一层超时不喂,看门狗都会在指定的"未完全失效"状态下触发系统复位,保留现场记录,方便事后分析。
6.3 调试手段的取舍:从printf到逻辑分析仪
飞控系统不像普通桌面程序那样随时随地打日志看输出。实时任务里用printf频繁输出对时间确定性影响很大,特别是串口驱动的临界区比较长的时候。我的经验是:日常调试阶段可以用调试通道输出,但做时间验证和负载测试时必须关掉所有调试输出,用示波器或逻辑分析仪捕获GPIO翻转电平来观测任务执行时序。
有一种很简洁的时序观测方法:在每个飞控任务的入口和一个完成节点各翻转一次GPIO,把GPIO直接接到逻辑分析仪上。这样你能直观看到每个周期内任务的执行窗口长度、被抢占的情况、以及异常延迟的位置。这个方法不需要任何复杂的工具链,成本几十块钱的逻辑分析仪就能做,但对排查调度问题和异常延迟非常有效。
6.4 时间基准同步:所有计算都建立在这个基础上
飞控系统里有多个时间源:操作系统的系统时钟、传感器自带的时间戳、GNSS接收机的PPS秒脉冲。如果这些时间源不同步,导航算法里的所有时间差计算都会出现偏差。飞控软件里最常见的做法是用操作系统的基准定时器作为主时钟源,然后用GNSS PPS脉冲周期性校正本地时钟漂移。
这里容易踩坑的点是:不同硬件板卡的定时器驱动实现差异很大,有的板卡底层定时器是32位的,在飞控运行几百上千小时后会发生溢出。如果软件没有处理定时器回绕问题,所有和时间相关的控制律计算都会瞬间出错。这些问题在地面测试时很难发现,因为测试时长通常不够覆盖到溢出点,往往要经历过长航时飞行才能暴露。我的建议是:在新平台适配阶段用脚本测试去验证定时器回绕逻辑是否健壮,宁可在地面上多花时间,也不能让飞机带着隐患上天。
7. 从单核到多核再到分布式:飞控实时系统的发展方向
7.1 多核处理带来的机遇和新的确定性难题
当前飞控计算机越来越多地采用多核处理器,一个核跑安全关键控制任务,其他核跑导航解算、图像处理、数据记录等计算密集型任务。这种做法在提升算力的同时,也让确定性分析变得更加复杂。多核处理器上的共享资源(缓存、内存控制器、总线)会导致任务执行时间产生额外抖动,单核模式下精确计算的WCET分析方法不再完全适用。
行业里针对多核干扰问题的做法是减少共享访问频率、将高安全等级任务放在特定核上、配置内存和缓存隔离、在系统级做干扰分析。实际工程里,有时候会宁可把一些计算任务放在一个核上排队执行,也不让它们跨核并行——因为跨核并行带来的不确定性和调试复杂度,往往比损失的那一点计算性能更难以接受。
7.2 飞控系统往分布式架构演进
大型飞行器的飞控体系正在从"一台中央计算机"向"多台分布式控制计算机"演进,每个作动器、每个传感器子系统自带一个小型实时节点。所有节点通过确定性网络(比如AFDX、TTEthernet)互联,每个节拍交换数据。这种分布式架构对操作系统提出了新要求:不仅要管理本节点的任务调度,还要参与全网的时间同步和消息调度。
分布式飞控架构的核心挑战是端到端延迟的确定性控制。从传感器采样、数据编码、网络传输、到对端执行销的驱动,整个链路的时间误差要控制在微秒级。操作系统层面的时间同步协议以及网络接口层的调度机制,是这一场景下的技术核心。欧洲那边在航空电子领域推的TTEthernet时间触发机制,和实时操作系统的分区调度本质上是同一套思想——把时间切成固定长度的窗口,所有通信和计算都安排在窗口内完成,杜绝"随意抢占"带来的不确定性。
7.3 我看好和不看好的操作系统技术路线
工程做了这么多年,我的判断是:在追求高安全等级的飞控领域,VxWorks这类商业系统短期内仍然是主流,因为它有完整认证包、成熟经验库和良好的技术服务。开源RTEMS在科研和预研项目里会越来越普及,但对适航认证要求极高的项目,靠社区力量堆认证文档的难度不低。FreeRTOS则会在中小型无人机和低成本飞控上继续扩张,但很难进入高安全等级的民航市场。
分离内核和分区操作系统的需求会越来越强。随着飞控系统功能复杂度上升,单机整合需求增多,ARINC 653分区架构在无人机和电动垂直起降飞行器等新型飞行器上的应用会持续增加。当然,分区操作系统也意味着系统配置复杂度和调试难度的上升,这些都需要开发团队有更强的整体架构把控能力。
我个人在实际开发中最深的体会是:操作系统的选型固然重要,但决定一个飞控项目生死更多的还是软件的工程化水平。再好的实时内核也架不住任务设计不合理、共享资源不加管控、时间分析缺失。反过来,只要调度设计和时间分析做得扎实,哪怕用一个相对朴素的开源内核,也能跑出稳定可靠的飞行控制系统。技术选型是起点,系统设计和工程纪律才是决定成败的关键。