4. 实时系统核心概念
在 S32G 这类面向车载网关、域控制器与工业边缘节点的 SoC 上运行 Linux,最常见的误区是“Linux 已经足够快,所以它就是实时系统”。实际上,实时性并不等于平均性能高,而是指系统能否在可证明的时间上界内完成响应。本节围绕硬实时与软实时、确定性、延迟、抖动、优先级反转以及实时调度理论展开,为后续 PREEMPT_RT、CPU 隔离、中断线程化与实时任务部署建立概念基础。
一、硬实时与软实时:约束强度不同
硬实时(Hard Real-Time)要求任务必须在截止时间(Deadline)之前完成,一旦超时即视为系统失败,可能造成安全、控制或经济上的严重后果。例如安全气囊点火、电机闭环电流环、线控制动信号采样,都属于硬实时场景。软实时(Soft Real-Time)则允许偶发超时,超时只导致服务质量下降,而不会造成灾难性后果,例如车载娱乐音视频播放、日志上报、仪表刷新。
在 S32G 上,硬实时任务通常由 Cortex-M7 核、RTU 或硬件加速单元承担,而 Linux 侧更多承担软实时与准实时任务。若必须让 Linux 参与硬实时,则需要 PREEMPT_RT、CPU 隔离、优先级继承等手段共同保证。
二、确定性、延迟与抖动
确定性(Determinism)是指系统在最坏情况下仍能给出可预测响应时间的能力。它关注的是“最坏情况执行时间”(WCET)和“最坏情况响应时间”(WCRT),而不是平均值。延迟(Latency)通常指从事件发生到系统开始处理或完成处理之间的时间,包括中断延迟、调度延迟、抢占延迟和任务执行时间。抖动(Jitter)则是多次响应时间的波动范围,反映时间一致性。
例如,一个周期为 1 ms 的控制任务,若平均响应为 200 μs,但偶尔达到 900 μs,则其抖动为 700 μs。对于硬实时控制,抖动过大可能直接导致控制环路失稳。因此,实时优化往往不是追求“更快”,而是追求“更稳、更可预测”。
三、优先级反转与优先级继承
优先级反转(Priority Inversion)是实时系统中最经典的隐患之一。当高优先级任务因等待低优先级任务持有的锁而被阻塞,而中优先级任务又抢占了低优先级任务时,高优先级任务会被间接延迟,甚至错过截止时间。1997 年火星探路者号就曾因优先级反转导致系统复位。
解决思路包括优先级继承(Priority Inheritance)和优先级天花板(Priority Ceiling)。优先级继承让持有锁的低优先级任务临时提升到等待者的最高优先级,从而尽快释放锁;优先级天花板则为每个互斥量设定一个天花板优先级,任何持有该锁的任务都提升到该优先级。
典型优先级反转时序:
T_high 需要 mutex,但 mutex 被 T_low 持有
T_mid 就绪并抢占 T_low
T_high 被迫等待 T_mid 执行完毕
结果:T_high 的响应时间被 T_mid 无限拉长
使用优先级继承后:
T_low 持有 mutex 期间继承 T_high 优先级
T_mid 无法抢占 T_low
T_low 尽快释放 mutex,T_high 恢复执行
四、实时调度理论:从 RM 到 EDF
实时调度理论为任务集的可调度性提供数学判据。常见模型包括周期任务、偶发任务和截止时间约束。速率单调调度(Rate Monotonic, RM)为周期越短的任务分配越高优先级,适用于固定优先级系统;最早截止时间优先(Earliest Deadline First, EDF)则动态选择截止时间最近的任务,理论上可达到 100% CPU 利用率。
| 调度算法 | 优先级类型 | 可调度性判据 | 适用场景 |
|---|---|---|---|
| RM | 静态固定优先级 | Σ(Ci/Ti) ≤ n(2^(1/n)−1) | 周期稳定、实现简单 |
| EDF | 动态优先级 | Σ(Ci/Ti) ≤ 1 | 利用率高、需动态调度 |
| SCHED_FIFO | Linux 静态实时 | 依赖优先级与 CPU 隔离 | PREEMPT_RT 实时线程 |
| SCHED_RR | Linux 时间片轮转 | 同优先级轮转 | 多个同优先级实时任务 |
在 Linux 中,实时任务通常使用 SCHED_FIFO 或 SCHED_RR,并通过 chrt、sched_setscheduler() 设置优先级。S32G 上还需结合 CPU 亲和性、中断亲和性和 isolcpus 隔离核心,减少非实时干扰。
# 查看实时线程调度策略与优先级
chrt -p $(pgrep my_rt_task)
# 以 SCHED_FIFO 优先级 80 启动实时任务
chrt -f 80 ./my_rt_task
# 将实时任务绑定到 CPU2
taskset -c 2 chrt -f 80 ./my_rt_task
五、案例与常见误区
假设 S32G 上一个 1 ms 周期的电机控制任务运行在 Linux 侧,使用 SCHED_FIFO 优先级 90,但未隔离 CPU,也未关闭内核动态时钟。此时网络中断、日志刷盘或 RCU 回调可能引入数百微秒抖动,导致控制质量下降。改进路径是:隔离 CPU2 给实时任务、将中断迁移到其他核、启用 PREEMPT_RT、使用优先级继承互斥量,并用 cyclictest 测量最坏延迟。
复盘时建议建立三项指标:最坏中断延迟、最坏调度延迟、任务抖动分布。只有这些指标稳定落在截止时间以内,Linux 实时系统才具备工程可用性。