1. 飞控计算机为什么不能跑通用操作系统
很多人第一次接触飞控计算机,脑子里冒出来的第一个问题往往是:这不就是一台计算机吗,装个Linux不就行了?我刚开始做飞控相关项目的时候也这么想过,后来被现实狠狠教育了一顿。飞控计算机和咱们平时用的电脑、服务器,虽然都叫"计算机",但它们的运行环境、约束条件和设计目标完全是两码事。
飞控计算机的核心任务是控制飞行器的姿态、导航和任务执行。它需要在毫秒级甚至微秒级的时间窗口内完成传感器数据采集、控制律解算、舵机指令输出这一整套闭环。这个闭环里,任何一个环节的延迟抖动都可能导致控制品质下降,严重的时候直接引发姿态失控。通用操作系统比如Linux,它的调度器设计目标是"公平"和"吞吐量",而不是"确定性"。你没法保证一个控制任务在某个确定的时间点一定被执行,因为内核可能正在处理中断、可能在做内存回收、可能在调度别的进程。这种不确定性,在飞控场景里是致命的。
硬实时操作系统的"硬"字,说的就是这种确定性。硬实时不是"快",而是"可预测"。一个硬实时系统必须保证最高优先级的任务在截止时间之前一定完成,这个保证是数学上可验证的,不是"大部分情况下没问题"。飞控计算机上跑的RTOS,从任务调度、中断响应到内存管理,每一个环节都要为这个确定性服务。
那为什么不用裸机程序呢?裸机确实确定性最强,但飞控计算机的功能越来越复杂,要同时处理多个传感器的数据融合、要跑余度管理、要跟其他机载设备通信、要做健康监控。裸机写这种规模的系统,代码耦合严重,可维护性和可验证性都很差。RTOS在保证确定性的前提下,提供了任务抽象、同步机制和资源管理,让复杂系统的开发变得可控。
这里有个关键点需要说清楚:飞控计算机用的RTOS和工业控制、汽车电子用的RTOS,虽然都是硬实时,但侧重点不一样。飞控对安全性的要求是最高等级的,这就引出了后面要讲的DO-178C和ARINC 653这些航空特有的标准体系。工业RTOS可能更关注成本、生态和开发效率,飞控RTOS则把适航认证支持放在第一位。
我见过不少从互联网转过来的工程师,习惯性地用"性能"来衡量RTOS,上来就问哪个RTOS最快。这个思路在飞控领域是跑偏的。飞控选RTOS,第一看的是确定性保证和认证证据链,第二看的是分区隔离能力,第三才轮到性能。顺序搞反了,方案根本过不了评审。
2. 硬实时性的底层逻辑:从调度器到中断延迟
要理解飞控RTOS的技术选型,得先把"硬实时"这个概念的底层机制拆开看。硬实时性不是某一个功能模块提供的,而是从硬件到内核到应用层一整条链路共同保证的。这条链路上任何一个环节掉链子,确定性就没了。
2.1 抢占式优先级调度与优先级反转问题
飞控RTOS几乎全部采用基于优先级的抢占式调度。什么意思呢?每个任务分配一个优先级,调度器永远选择优先级最高的就绪任务运行。如果一个高优先级任务就绪了,它会立刻抢占正在运行的低优先级任务。这个"立刻"的响应速度,就是调度延迟,通常在微秒量级。
但光有抢占式调度还不够,实际系统里有个经典陷阱叫优先级反转。场景是这样的:低优先级任务L持有一把锁,高优先级任务H在等这把锁,中优先级任务M就绪了。因为M优先级比L高,M会抢占L,导致L迟迟不释放锁,H就一直被阻塞。结果就是中优先级的M实际上"压过"了高优先级的H,这在飞控里是不可接受的。
解决办法是优先级继承或者优先级天花板协议。优先级继承的意思是,当H在等L持有的锁时,L临时继承H的优先级,这样M就没法抢占L了,L能尽快执行完释放锁。飞控RTOS基本都实现了这个机制,但实现的质量参差不齐。有些RTOS只在互斥量上支持优先级继承,信号量上不支持,用的时候要特别注意。
2.2 中断延迟:硬实时系统的生命线
中断延迟是衡量RTOS硬实时能力的核心指标,指的是从中断信号到达CPU到中断服务程序第一条指令执行之间的时间。这个时间包括硬件中断响应时间和内核中断入口处理时间。
飞控计算机上,传感器数据到达、总线消息接收、定时器触发,都是通过中断驱动的。中断延迟的抖动直接影响到控制回路的周期稳定性。一个设计良好的飞控RTOS,中断延迟应该控制在几微秒以内,而且最坏情况执行时间(WCET)必须是可分析的。
这里有个容易踩的坑:很多RTOS宣传的"中断延迟"是典型值,不是最坏值。飞控适航认证要的是WCET,是那个最坏情况下的上界。典型值再好看,WCET不可分析或者太大,照样过不了。我在选型的时候,一定会找厂商要WCET分析报告,拿不到的就直接排除。
2.3 内存管理的确定性考量
通用操作系统用虚拟内存和按需分页,内存访问时间是不确定的,因为可能触发缺页中断去读磁盘。飞控RTOS绝对不能这么干。飞控RTOS通常采用静态内存分配,所有任务栈、消息队列、缓冲区在系统启动前就分配好,运行期间不做动态内存分配。这样内存访问时间就是确定的。
有些飞控RTOS也提供动态内存分配,但会限制在特定的内存池里,分配算法也是确定性的,比如固定大小块分配或者TLSF算法。用的时候要清楚,哪些场景可以用动态分配,哪些必须静态。控制律解算这种硬实时路径上,一律静态分配,没有商量余地。
2.4 时间确定性:从时钟节拍到WCET分析
RTOS的时间管理基于时钟节拍,就是周期性产生的定时中断。节拍频率决定了系统的时间分辨率。飞控RTOS的节拍频率通常在1kHz到10kHz之间,对应1ms到100微秒的节拍周期。节拍频率越高,时间分辨率越好,但中断开销也越大,需要权衡。
比节拍频率更重要的是WCET分析。飞控软件适航认证要求对每个实时任务的执行时间给出上界证明。这个证明不是跑几次测出来的,而是通过静态分析工具,结合处理器架构、缓存行为、流水线特性,数学推导出来的。RTOS本身要提供支持WCET分析的特性,比如可关闭缓存、可预测的分支预测、确定性的中断处理路径。这也是为什么飞控计算机常用一些看起来"性能不高"的处理器,因为它们的时序行为更容易分析。
我参与过一个项目,选了一款高性能处理器,缓存很大,跑分很漂亮。结果做WCET分析的时候发现,缓存命中与否导致执行时间差了好几倍,最坏情况根本没法收敛到一个可接受的界。最后只能把缓存关掉用,性能直接掉到原来的一半以下。这个教训告诉我,飞控选硬件,可分析性比峰值性能重要得多。
3. ARINC 653分区机制:飞控软件的隔离哲学
ARINC 653是航空电子领域的一个核心标准,它定义了一种时间与空间分区的机制。这个标准最初是为综合模块化航空电子系统制定的,后来被飞控计算机广泛采用。理解ARINC 653,是理解飞控RTOS设计思想的关键。
3.1 分区隔离要解决什么问题
传统飞控计算机的做法是每个功能一个独立的LRU,比如飞控计算机一个盒子、导航计算机一个盒子、大气数据计算机一个盒子。每个盒子里的软件自己管自己,互不干扰。但这种做法重量大、功耗高、维护成本高。综合模块化航空电子的思路是,把多个功能集成到一个高性能计算平台上,用分区机制来保证它们之间的隔离。
分区隔离要解决的核心问题是:一个分区里的软件故障,不能影响其他分区。比如大气数据分区的代码有个数组越界,写坏了内存,不能把飞控律分区的数据给改了。再比如某个分区进入了死循环,不能把CPU占满导致其他分区得不到执行时间。
空间隔离靠内存管理单元实现。每个分区有自己独立的内存空间,MMU配置好页表,分区A访问不到分区B的内存。时间隔离靠分区调度器实现。每个分区分配一个固定的时间窗口,比如分区A每20ms获得5ms的执行时间,分区B获得3ms,分区C获得2ms。时间窗口到了,不管分区里的任务有没有执行完,调度器强制切换。这样每个分区的时间资源是确定的,不受其他分区行为影响。
3.2 分区调度器的两种模式
ARINC 653定义了两种分区调度模式:周期模式和非周期模式。周期模式是主流,每个分区在一个主时间帧内获得一个或多个固定长度的时间窗口。主时间帧循环执行,分区的时间窗口位置和长度都是预先配置好的。
非周期模式允许分区在需要的时候请求额外的时间窗口,但这种方式确定性差一些,飞控里用得少。飞控计算机基本都用周期模式,因为控制律解算、传感器采集这些任务本身就是周期性的,跟周期分区调度天然匹配。
分区调度器下面还有分区内任务调度。一个分区内部可以跑多个任务,这些任务由分区内的RTOS调度器管理,通常也是基于优先级的抢占式调度。所以飞控RTOS实际上是两级调度:分区级调度器管时间窗口分配,任务级调度器管分区内任务执行。两级调度器配合,才能既保证分区间的隔离,又保证分区内任务的实时性。
3.3 分区间通信的端口机制
分区之间需要交换数据,比如传感器分区要把数据发给控制律分区。ARINC 653定义了采样端口和队列端口两种通信机制。
采样端口是"最新值"语义,发送方写入数据,接收方读取时拿到的是最新写入的值。如果发送方写了多次,接收方只看到最后一次。这种模式适合传感器数据这种"只关心当前值"的场景。
队列端口是"消息队列"语义,发送方写入的消息按顺序排队,接收方按顺序读取。这种模式适合事件通知、指令传递这种"每条消息都不能丢"的场景。
端口通信是单向的,从发送分区到接收分区。如果需要双向通信,要配置两个方向相反的端口。端口通信的数据传输由分区调度器在分区切换时完成,或者由专门的通信分区处理。这个设计保证了通信的确定性,不会因为通信阻塞导致分区执行时间不确定。
实际项目里,端口配置是个容易出错的地方。采样端口的刷新周期、队列端口的深度,都要根据数据产生速率和消费速率仔细计算。我见过一个案例,队列端口深度配小了,高负载情况下消息溢出,导致控制指令丢失。后来把深度加大,同时优化了接收分区的处理逻辑,才解决问题。端口配置不是随便填个数就行,要算的。
3.4 健康监控:分区故障的检测与隔离
ARINC 653还定义了健康监控机制,分三个层级:分区级、模块级和系统级。分区级健康监控检测分区内部的故障,比如任务超时、内存访问违规、除零异常。检测到故障后,可以采取的动作包括:忽略、重启分区、停止分区、重启模块等。
模块级健康监控处理分区级处理不了的故障,比如分区调度器本身的异常。系统级健康监控处理整个模块的故障,通常涉及多模块余度管理。
健康监控的配置是飞控软件适航审查的重点。什么故障触发什么动作,动作的优先级和互斥关系,都要有明确的定义和验证。我在做健康监控配置的时候,习惯画一张故障-动作矩阵表,把所有可能的故障模式和对应的处理动作列清楚,然后逐条验证。这个表在评审的时候特别有用,审查员一看就明白你的设计意图。
4. DO-178C如何塑造飞控RTOS的技术形态
DO-178C是航空软件适航认证的核心标准,它规定了机载软件从需求到验证的整个生命周期要求。飞控RTOS作为机载软件的一部分,必须满足DO-178C的要求。这个标准对RTOS的技术形态产生了深远影响,很多设计决策不是为了性能,而是为了满足认证要求。
4.1 软件等级与RTOS的认证目标
DO-178C根据软件失效对飞机安全的影响程度,把软件分为A到E五个等级。A级是最高等级,失效会导致灾难性后果。飞控计算机的主控软件通常是A级,RTOS作为其运行基础,也要满足A级要求。
A级软件的要求极其严格:每个需求都要有验证证据,每个代码行都要有覆盖分析,每个功能都要有独立性验证。RTOS要提供认证证据包,包括需求规格、设计文档、源代码、测试用例、覆盖分析报告、配置索引等。这个证据包的完整性和可追溯性,是选型时的重要考量。
很多开源RTOS功能很强,但认证证据包不完整,或者证据包的质量达不到适航要求。用这种RTOS做飞控,要么自己补证据包,成本极高;要么在认证时被审查员质疑,反复整改。所以飞控RTOS选型,认证支持能力是硬指标。
4.2 需求追溯与验证证据链
DO-178C要求双向追溯:从系统需求追溯到软件需求,从软件需求追溯到代码,从代码追溯到测试用例,反过来也要能追溯。RTOS作为基础软件,它的需求追溯链要跟应用软件的需求追溯链对接。
这意味着RTOS的每个API都要有明确的需求描述,每个需求都要有对应的测试用例,每个测试用例都要有执行结果记录。RTOS厂商提供的认证证据包里,这些文档都要齐全。而且文档的格式和内容要符合适航审查的要求,不是随便写写就行。
我在审查RTOS证据包的时候,重点看几个东西:需求是否完整覆盖了所有API、测试用例是否覆盖了所有需求、覆盖分析是否达到了MC/DC级别、配置索引是否清晰。这几项有问题,后面认证会很痛苦。
4.3 配置管理与生命周期数据
DO-178C对配置管理的要求也很高。RTOS的每个版本、每个补丁、每个配置项,都要有完整的记录。什么时间、什么人、做了什么修改、为什么修改、影响了哪些需求、验证了什么,都要可追溯。
生命周期数据包括:计划文档、开发标准、验证标准、需求文档、设计文档、代码、测试用例、测试结果、覆盖分析、问题报告、配置索引等。这些数据要形成一个完整的、自洽的、可审查的证据链。
飞控RTOS厂商通常提供认证数据包,里面包含了上述所有文档。但要注意,数据包是针对特定版本的,版本升级后数据包要更新。用的时候要确认数据包版本和实际使用的RTOS版本一致,不一致的话认证时会有麻烦。
4.4 工具鉴定:编译器与静态分析工具的资质
DO-178C还有一个容易被忽视的要求:工具鉴定。如果开发过程中使用了工具,而这个工具的输出没有被独立验证,那么工具本身要经过鉴定,证明它的输出是可信的。
对RTOS来说,最相关的工具是编译器。编译器把源代码翻译成目标代码,如果编译器有bug,可能生成错误的代码。DO-178C要求要么对编译器进行鉴定,要么对编译后的目标代码进行独立验证。编译器鉴定成本很高,所以很多项目选择对目标代码做独立验证,比如反汇编检查、目标码覆盖分析。
静态分析工具也一样。做WCET分析的工具、做代码规则检查的工具,如果它们的输出直接用于认证证据,就要经过鉴定。工具鉴定是个专业活,通常需要工具厂商提供鉴定包,或者由第三方机构做鉴定。
工具鉴定这块,我踩过坑。早期项目用了一个开源静态分析工具做代码规则检查,结果审查员问工具鉴定证据,拿不出来。后来换了一个有鉴定包的商业工具,虽然花钱,但省了很多事。飞控项目里,该花的钱要花,省在工具上,后面认证阶段会加倍还回来。
5. 主流飞控RTOS的技术路线对比
飞控计算机上用的RTOS,市面上能见到的就那么几款,但每款的技术路线和适用场景差别很大。我按自己的使用经验,把几款主流RTOS做个对比,重点说技术特点和适用场景,不涉及具体商业信息。
5.1 时间分区型RTOS:VxWorks 653与类似方案
VxWorks 653是ARINC 653分区机制的典型实现,在飞控领域应用很广。它的核心特点是两级调度:分区调度器管时间窗口,分区内任务调度器管任务执行。空间隔离靠MMU,时间隔离靠分区调度器,分区间通信靠端口机制。
这类RTOS的优点是分区隔离能力强,适合综合模块化航空电子架构。多个功能集成到一个计算平台,每个功能一个分区,互不干扰。认证证据包成熟,适航审查通过率高。缺点是分区调度器本身有开销,时间窗口切换有上下文切换成本,系统整体效率比非分区RTOS低一些。
适用场景:大型飞控计算机,多个功能综合,对隔离性和认证支持要求高的项目。
5.2 安全关键型RTOS:LynxOS与类似方案
LynxOS是另一款在航空领域有深厚积累的RTOS,也支持ARINC 653分区。它的技术路线跟VxWorks 653类似,但在某些细节上有差异,比如分区调度器的实现、端口通信的机制、健康监控的配置方式。
这类RTOS的优点是实时性好,中断延迟低,WCET可分析性强。认证支持也成熟,有完整的证据包。缺点是生态相对封闭,开发工具链和中间件选择少一些。
适用场景:对实时性要求极高的飞控场景,比如高机动飞行器的控制计算机。
5.3 开源RTOS的适航之路:FreeRTOS与类似方案
FreeRTOS是开源RTOS里用得最广的,很多工业控制、汽车电子项目在用。飞控领域也有人尝试用FreeRTOS,但直接拿来做A级飞控软件,认证证据包是不够的。
有些厂商基于FreeRTOS做了安全认证版本,补充了认证证据包,增加了分区隔离和健康监控功能。这类RTOS的优点是成本低、生态好、开发人员熟悉。缺点是认证证据包的成熟度不如商业RTOS,适航审查时可能遇到更多质疑。
适用场景:对成本敏感、认证等级要求不是最高的飞控项目,或者作为原型验证平台。
5.4 选型对比表
| 对比维度 | 时间分区型RTOS | 安全关键型RTOS | 开源认证版RTOS |
|---|---|---|---|
| 分区隔离 | 原生支持ARINC 653 | 原生支持ARINC 653 | 部分支持,需配置 |
| 认证证据包 | 完整成熟 | 完整成熟 | 基本完整,成熟度稍低 |
| 中断延迟 | 微秒级 | 微秒级,更低 | 微秒级,抖动稍大 |
| WCET可分析性 | 强 | 强 | 中等 |
| 生态与工具链 | 中等 | 较封闭 | 丰富 |
| 成本 | 高 | 高 | 低 |
| 适用场景 | 大型综合航电 | 高实时要求飞控 | 成本敏感项目 |
选型的时候,我一般先明确项目的认证等级要求和隔离需求,然后看RTOS的证据包是否满足,最后才比较性能和成本。顺序不能反,反了容易选错。
6. 从裸机到RTOS:飞控软件架构的演进与实操建议
飞控软件架构从裸机到RTOS,再到ARINC 653分区,是一个逐步演进的过程。理解这个演进逻辑,对做架构设计很有帮助。
6.1 裸机架构的局限与RTOS的引入时机
裸机架构用前后台或者时间片轮询的方式组织代码。前台是中断服务程序,后台是主循环。主循环里依次调用各个功能模块,每个模块执行一小段,然后让出CPU给下一个模块。这种架构简单、确定性好,但功能复杂后,模块间的耦合严重,时序分析困难,代码复用性差。
引入RTOS的时机,一般是当功能模块数量超过五六个,或者模块间的时序依赖变得复杂,或者需要动态创建销毁任务的时候。RTOS提供了任务抽象、同步机制和资源管理,让复杂系统的开发变得可控。
但引入RTOS也带来了新的复杂性:任务优先级怎么分配、栈大小怎么定、任务间怎么同步、共享资源怎么保护。这些问题处理不好,RTOS反而会引入新的不确定性。
6.2 任务划分与优先级分配的经验法则
任务划分是RTOS应用设计的第一步。我的经验法则是:按周期和关键性划分任务。控制律解算、传感器采集这些周期性任务,各自独立成任务。健康监控、数据记录这些非关键任务,可以合并或者放在低优先级。
优先级分配遵循速率单调调度的原则:周期越短的任务,优先级越高。控制律解算周期通常最短,优先级最高。传感器采集次之。通信任务再次之。健康监控和数据记录优先级最低。
但速率单调调度有个前提:任务之间不能有资源共享导致的阻塞。如果有共享资源,优先级分配要考虑优先级继承的影响。我一般会画一张任务时序图,把所有任务的执行时间、周期、阻塞时间标出来,然后做可调度性分析,确认最坏情况下所有任务都能满足截止时间。
6.3 栈大小估算与溢出检测
栈大小估算是个容易出错的地方。栈太小,任务运行中栈溢出,写坏其他内存,故障现象随机,很难排查。栈太大,浪费内存,飞控计算机内存资源紧张,浪费不起。
我的估算方法是:先分析任务的最大调用深度,把每层函数的局部变量、参数、返回地址大小加起来,再乘以一个安全系数。安全系数一般取1.5到2.0,考虑中断嵌套和编译器优化带来的不确定性。
光估算还不够,要加栈溢出检测。RTOS通常提供栈填充模式,任务创建时把栈填成特定值,运行一段时间后检查栈底部的填充值是否被改写。被改写了说明栈快溢出了,要加大栈。这个检测在调试阶段很有用,正式版本可以保留,开销很小。
6.4 中断服务程序的设计原则
中断服务程序的设计原则是越短越好。ISR里只做最紧急的事情,比如读取硬件寄存器、清除中断标志、发送信号量唤醒任务。耗时的处理放到任务里做。
ISR里不能调用可能阻塞的RTOS API,比如带超时的信号量获取、动态内存分配。ISR里能调用的API,RTOS文档里会明确列出,用之前要确认。
ISR的优先级高于所有任务,所以ISR的执行时间直接影响任务的中断延迟。ISR执行时间要尽量短,而且要可分析。我一般要求ISR的WCET不超过10微秒,超过的就要拆分,把非紧急部分移到任务里。
有个坑我踩过:ISR里调用了打印函数,调试的时候没问题,因为打印走得慢但数据量小。正式跑的时候,高频率中断触发打印,串口输出阻塞了ISR,导致中断延迟飙升,控制周期抖动。后来把打印移到任务里,用环形缓冲区传递数据,问题解决。ISR里绝对不要做IO操作,这是铁律。
7. 飞控RTOS实操中的典型问题与排查思路
理论说再多,不如实际踩几个坑来得深刻。这一章我整理几个飞控RTOS实操中的典型问题,把排查思路和解决方法写出来,供参考。
7.1 任务莫名奇妙不执行:优先级反转的隐蔽表现
现象:一个高优先级任务偶尔会延迟执行,延迟时间不固定,负载高的时候更明显。用调试器看,任务状态是就绪,但就是不运行。
排查思路:先看有没有低优先级任务持有高优先级任务需要的资源。检查所有互斥量的使用,看是否有嵌套获取的情况。用RTOS提供的优先级继承统计功能,看有没有发生优先级继承。如果RTOS不支持统计,可以在代码里手动加钩子函数,记录互斥量的获取和释放。
解决方法:确认互斥量配置了优先级继承。如果RTOS的优先级继承只在互斥量上支持,把信号量的使用改成互斥量。检查是否有中断服务程序里获取了互斥量,ISR里不能获取互斥量,因为ISR不参与任务调度,优先级继承没法生效。
7.2 系统偶尔死机:栈溢出的随机性故障
现象:系统运行一段时间后死机,死机位置随机,有时候在控制律里,有时候在通信任务里。重启后正常,但跑一段时间又死。
排查思路:首先怀疑栈溢出。检查每个任务的栈使用情况,看栈填充模式是否被改写。如果RTOS不支持栈填充,可以在任务创建时手动填充栈空间,运行一段时间后检查。用调试器查看死机时的栈指针,看是否超出了任务栈范围。
解决方法:加大栈溢出任务的栈大小。优化任务代码,减少局部变量和函数调用深度。如果栈溢出发生在中断嵌套时,加大中断栈或者减少中断嵌套层数。
7.3 通信超时:分区端口配置的常见错误
现象:分区间通信偶尔超时,数据丢失。负载低的时候正常,负载高的时候超时频繁。
排查思路:检查端口配置。采样端口的刷新周期是否跟发送分区的写入周期匹配。队列端口的深度是否足够容纳突发数据。分区时间窗口是否足够完成端口通信。用RTOS提供的端口统计功能,看是否有溢出或超时计数。
解决方法:调整端口配置。采样端口刷新周期改成跟发送周期一致。队列端口深度加大,或者优化接收分区的处理逻辑,提高消费速率。分区时间窗口不够的话,调整分区调度表,给通信分区更多时间。
7.4 WCET分析结果超标:缓存与流水线的影响
现象:WCET分析工具给出的最坏执行时间远超预期,任务无法满足截止时间。
排查思路:检查处理器的缓存配置。缓存命中与否导致执行时间差异大,WCET分析会取最坏情况,即缓存全部不命中。检查流水线深度和分支预测策略,深流水线和动态分支预测会增加WCET分析的保守性。
解决方法:关闭缓存,或者使用缓存锁定功能,把关键代码和数据锁定在缓存里。简化代码结构,减少分支,使用可预测的循环结构。如果处理器支持,使用时间可预测的流水线模式。
WCET分析是个专业活,工具的选择和配置很关键。我见过一个项目,WCET分析结果一直超标,后来发现是工具配置里缓存模型设错了,改过来之后结果就正常了。做WCET分析,要理解工具的模型和假设,不能全信工具输出,也不能全不信。
8. 硬实时操作系统的未来演进与个人体会
飞控RTOS的技术路线,这些年也在慢慢变化。多核处理器在飞控计算机上的应用越来越多,多核RTOS的确定性调度是个研究热点。多核带来的并行性可以提高性能,但核间干扰、共享缓存、内存带宽竞争,都会影响确定性。目前多核飞控RTOS的成熟度还不如单核,选型要谨慎。
另一个趋势是混合关键性系统。同一个计算平台上,同时跑安全关键功能和非安全关键功能。安全关键功能用高等级认证的RTOS,非安全关键功能用通用操作系统,两者通过虚拟化或者分区机制隔离。这种架构可以降低成本和重量,但对隔离机制的要求更高。
我在飞控RTOS这个领域摸爬滚打这些年,最大的体会是:确定性是设计出来的,不是测试出来的。你不能指望通过大量测试来发现所有时序问题,必须在设计阶段就把确定性作为第一优先级来考虑。任务怎么划分、优先级怎么分配、资源怎么管理、中断怎么处理,每一个决策都要问自己:这个决策对确定性有什么影响?
第二个体会是:认证要求要前置考虑。不要等到开发完了才想认证的事,那时候改设计成本极高。RTOS选型的时候就要看认证证据包,架构设计的时候就要考虑DO-178C的要求,代码编写的时候就要遵循认证编码规范。认证不是最后一道关卡,而是贯穿整个开发过程的约束。
第三个体会是:工具链的成熟度比RTOS本身更重要。一个RTOS功能再强,如果调试工具、分析工具、认证工具不配套,实际项目里会非常痛苦。选型的时候,要花时间评估工具链,看调试器好不好用、WCET分析工具准不准、覆盖分析工具全不全。这些工具的质量,直接决定开发效率和认证通过率。
最后说一个实操小技巧:飞控RTOS项目里,我习惯维护一个时序问题记录表,把每次遇到的时序异常、排查过程、根因、解决方法都记下来。这个表在项目后期特别有用,因为很多时序问题是类似的,遇到新问题可以先查表,看是不是以前遇到过的模式。这个习惯帮我省了很多排查时间,也让我对RTOS的时序行为理解越来越深。