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 混合部署中真正做到可预测、可验证、可交付。