2. 实时系统基础

在 Linux 与 RTOS 混合部署的工程实践中,实时性并不是“跑得快”这么简单。它描述的是系统对外部事件作出响应的时间是否可预测、是否可保证。一个 CPU 主频很高的 Linux 系统,可能在平均响应上优于一颗低频 MCU,但在最坏情况下却可能因为调度、中断关闭、缓存缺失或内存管理而延迟数十毫秒。因此,评价实时系统时,我们更关心“最坏情况”而不是“平均情况”。

一、核心概念:实时性、确定性、抖动与延迟

实时性(Real-time)指系统能够在规定的时间约束内完成对外部事件的响应。它强调的不是速度绝对值,而是“不超时”。确定性(Determinism)则进一步要求响应时间的可重复性:同样的输入和负载条件下,响应时间应当稳定落在可预测的范围内。确定性是硬实时系统的灵魂。

延迟(Latency)通常指从事件发生到系统开始处理或完成处理之间的时间。在嵌入式实时系统中,常细分为中断延迟、调度延迟、任务响应延迟和输出延迟。抖动(Jitter)是延迟的变化量,即多次响应时间的波动范围。抖动越小,系统越确定。举例来说,若某任务响应时间在 80~120 μs 之间波动,则抖动约为 40 μs;若在 95~105 μs 之间波动,则抖动仅 10 μs,后者更适合硬实时控制。

实时性 = 满足截止时间的能力;确定性 = 响应时间可预测;抖动 = 响应时间的波动;延迟 = 事件到响应的时间跨度。四者共同决定系统能否用于硬实时场景。

二、硬实时与软实时:约束强度不同

硬实时(Hard Real-time)要求任务必须在截止时间前完成,一旦超时即视为系统失败,可能造成人身伤害、设备损坏或重大经济损失。典型场景包括电机闭环控制、安全气囊触发、工业机器人伺服、汽车 ABS 等。软实时(Soft Real-time)允许偶尔超时,超时只会降低服务质量,不会造成灾难性后果,例如视频播放、音频流、人机界面刷新、日志采集等。

两者之间还存在固实时(Firm Real-time):偶尔超时的结果虽然无灾难性,但超时后的结果已无价值,例如实时图像目标跟踪中某一帧丢失后不再补算。工程上常把固实时归入硬实时与软实时之间的过渡带。

类型 截止时间约束 超时后果 典型场景 评价重点
硬实时 必须满足 系统失败、安全事故 伺服控制、安全气囊、ABS 最坏响应时间、抖动上限
固实时 通常满足 结果失效但无危害 实时跟踪、帧同步 超时率、结果有效性
软实时 尽量满足 体验下降 音视频、HMI、日志 平均延迟、吞吐量

三、优先级反转:实时系统中最隐蔽的陷阱

优先级反转(Priority Inversion)是指高优先级任务因为等待低优先级任务持有的共享资源而被阻塞,同时中等优先级任务又抢占了低优先级任务,导致高优先级任务被间接延迟。经典案例是 1997 年火星探路者号因优先级反转反复重启。其根因是共享资源访问没有优先级继承机制。

假设系统中有三个任务:H(高优先级)、M(中优先级)、L(低优先级)。L 先获得互斥锁并进入临界区,随后 H 就绪并请求同一把锁,H 被阻塞;此时 M 就绪并抢占 L,L 无法继续执行,也就无法释放锁,H 只能继续等待。结果是 H 被 M 无限期拖延,系统实时性被破坏。

解决思路主要有三类:优先级继承(Priority Inheritance),即 L 持有锁时临时继承 H 的优先级,避免被 M 抢占;优先级天花板(Priority Ceiling),即锁被获取时持有者优先级直接提升到该锁可能被使用的最高优先级;以及无锁设计,如使用环形缓冲区、原子操作或消息传递替代共享内存加锁。

/* 伪代码:优先级继承示意 */
mutex_lock(&lock);      /* L 持有锁 */
/* H 请求 lock,被阻塞,L 继承 H 的优先级 */
critical_section();
mutex_unlock(&lock);    /* L 释放锁,恢复原优先级 */

四、评价指标与工程测量方法

评价实时系统不能只看平均值,应重点关注以下指标:最坏情况执行时间(WCET)、最坏情况响应时间(WCRT)、中断延迟、调度延迟、抖动、截止时间错过率以及CPU 利用率。在 Linux 侧,可用 cyclictest 测量调度延迟与抖动;在 RTOS 侧,可用 GPIO 翻转配合示波器测量中断到任务响应的端到端延迟。

# Linux 实时性测试示例
cyclictest -t -p 80 -n -i 10000 -l 100000
# -t 每核一线程,-p 80 优先级,-i 10000 周期 10ms
# 关注 Max Latency 与抖动分布

在混合部署架构中,通常把硬实时任务放在 RTOS 或实时核上,把软实时与非实时任务放在 Linux 上。两者通过共享内存、RPMSG、Mailbox 或虚拟串口通信。此时评价指标要分域统计:RTOS 域看 WCET 与抖动,Linux 域看吞吐与平均延迟,域间通信看消息往返延迟与队列深度。

测量实时性时,务必在目标板上开启真实负载:中断风暴、内存压力、网络流量、文件系统写入都会显著改变最坏延迟。空载数据没有工程意义。

五、常见误区与复盘

  • 误区一:主频高就是实时性强。实时性取决于最坏路径,而非平均算力。Linux 的页错误、内存回收、中断线程化都可能引入毫秒级抖动。
  • 误区二:用了 RTOS 就一定是硬实时。若任务优先级分配不当、临界区过长、中断关闭过久,RTOS 同样会错过截止时间。
  • 误区三:忽略优先级反转。共享资源加锁必须配合优先级继承或天花板协议,否则高优先级任务可能被中优先级任务“饿死”。
  • 误区四:只测平均延迟。硬实时关注的是最大值和分布尾部,P99、P99.9 甚至最大值才是关键。

复盘时建议建立一张“实时性预算表”:列出每个关键任务的事件源、截止时间、WCET、WCRT、抖动上限和测量方法。只有把预算分配到中断、调度、通信、计算各环节,才能在 Linux 与 RTOS 混合部署中真正做到可预测、可验证、可交付。

实时系统核心概念与优先级反转 四个核心概念 实时性:不超时 确定性:可预测 延迟:事件→响应 抖动:延迟波动 实时性等级 硬实时 超时=失败,必须满足截止时间 软实时 超时仅降低体验,可容忍 优先级反转 H 高优先级等待锁 L 低优先级持有锁 M 中优先级抢占 L H 被间接无限延迟 响应时间分布与抖动示意 0 截止时间 时间 超时区 t Deadline 硬实时:抖动小 软实时:抖动大,偶有超时 抖动小 抖动大 解决优先级反转 优先级继承 / 优先级天花板 无锁队列 / 消息传递 缩短临界区,避免长关中断