1. 实时系统概述
实时系统(Real-Time System)是指系统不仅要在逻辑上正确计算结果,还必须在规定的时间约束内完成计算。时间正确性与功能正确性同等重要,任何超出截止时间(Deadline)的输出都可能被视为系统失效。
核心定义:实时系统的正确性 = 逻辑正确性 + 时间正确性。系统必须在确定的、可预测的时间窗口内对外部事件做出响应。
1.1 硬实时与软实时区别
根据错过截止时间对系统造成的影响,实时系统分为硬实时(Hard Real-Time)和软实时(Soft Real-Time)两大类。两者的核心差异在于时间违约的后果严重程度。
| 对比维度 | 硬实时系统 | 软实时系统 |
|---|---|---|
| 截止时间违约后果 | 灾难性后果(设备损坏、人员伤亡) | 性能下降、用户体验受损,但无灾难性后果 |
| 时间确定性要求 | 必须100%保证最坏情况执行时间(WCET) | 统计意义上满足平均响应时间即可 |
| 调度策略 | 优先级抢占、时间触发、预留资源 | 优先级调度、尽力而为、负载均衡 |
| 典型应用 | 航空电子、汽车发动机控制、医疗起搏器 | 视频播放、网络电话、交互式游戏 |
| Linux适用性 | 需配合PREEMPT_RT补丁、内核裁剪 | 标准内核即可满足大部分场景 |
调优启示:本课程重点面向硬实时场景下的Linux内核裁剪与优化。软实时场景通常不需要激进的非核心功能裁剪,而硬实时系统必须消除一切不可预测的延迟来源。
1.2 实时系统典型应用场景
实时系统已广泛渗透到工业控制、自动驾驶、航空航天、医疗设备等关键领域。以下重点分析工业控制与自动驾驶两个典型场景。
1.2.1 工业控制
工业控制是实时系统最成熟的应用领域,涵盖PLC(可编程逻辑控制器)、DCS(分布式控制系统)、运动控制、机器人控制等子系统。工业控制对实时性的要求通常为微秒级到毫秒级确定性响应。
- PLC循环扫描:典型的PLC工作周期包括输入采样、程序执行、输出刷新三个阶段,整个周期必须在固定时间(如1ms~10ms)内完成。
- 运动控制:伺服电机的位置环、速度环控制周期通常为50μs~1ms,任何抖动都会导致轨迹偏差。
- 工业以太网:EtherCAT、PROFINET IRT等实时工业以太网协议要求网络栈延迟低于100μs。
Linux在工业控制中的挑战:标准Linux内核的调度延迟通常在1ms~10ms级别,且存在不可预测的中断关闭时间。必须通过PREEMPT_RT补丁、中断线程化、CPU隔离、内核裁剪等手段将最大延迟压缩到100μs以内。
1.2.2 自动驾驶
自动驾驶系统是近年来对实时性要求最严苛的新兴领域之一。从传感器数据采集、感知融合、决策规划到车辆控制,整个流水线必须在严格的端到端延迟约束内完成。
| 功能模块 | 实时性要求 | 延迟违约后果 |
|---|---|---|
| 摄像头帧采集与预处理 | 30~60 FPS,帧间隔16~33ms | 目标检测丢失、帧率不稳定 |
| 激光雷达点云处理 | 10~20 Hz,周期50~100ms | 障碍物感知延迟、碰撞风险 |
| 多传感器融合 | 端到端延迟 < 100ms | 融合结果过时、决策错误 |
| 路径规划与决策 | 规划周期 50~100ms | 避障失败、车道偏离 |
| 车辆纵向/横向控制 | 控制周期 10~50ms | 车辆失控、制动延迟 |
关键指标:自动驾驶系统通常要求端到端感知-决策-控制延迟 < 200ms,其中Linux内核调度延迟必须控制在50μs~1ms以内。任何超过100ms的调度延迟都可能导致安全事故。
1.3 实时系统对Linux内核的挑战
标准Linux内核是为通用计算设计的,在实时性方面存在以下固有缺陷:
- 大内核锁与中断关闭:内核代码中仍存在长时间关闭中断的临界区,导致高优先级任务被阻塞。
- 不可抢占的内核路径:系统调用、软中断、tasklet等路径在标准内核中不可被抢占,延迟可达毫秒级。
- 中断处理优先级反转:中断处理程序优先级高于任何用户态任务,即使该任务更重要。
- 内存管理不确定性:缺页异常、页面回收、TLB刷新等操作引入不可预测的延迟。
- 非核心功能干扰:内核自带的电源管理、设备热插拔、cgroup、namespace等机制在实时场景下成为延迟噪声源。