1. 课程导入
在工业自动化、机器人、数控机床、电力电子和汽车电子等领域,控制系统不仅要“算得对”,还要“算得及时”。当控制算法的输出必须在确定的时间窗口内送达执行机构时,系统就进入了实时控制的范畴。本课程围绕 PREEMPT RT Linux 展开,目标是让读者掌握在 Linux 平台上构建可预测、可测量、可调优的实时控制系统的完整方法。
一、什么是实时控制系统
实时控制系统是指系统对外部事件的响应时间具有明确约束,并且必须在约束期限内完成计算与输出的控制系统。这里的“实时”并不等于“快”,而是强调确定性:最坏情况下的响应时间(Worst-Case Execution Time, WCET)必须可分析、可测量、可保证。
实时系统通常分为三类:
- 硬实时:错过截止时间会造成安全事故或重大经济损失,如电机伺服、安全联锁。
- 软实时:偶尔超时只降低服务质量,如视频播放、人机界面刷新。
- 固实时:超时结果无效但不会造成灾难,如部分数据采集系统。
一个典型的实时控制回路包含四个环节:传感器采样、控制算法计算、执行器输出、以及周期调度。其核心指标包括周期抖动、中断延迟、调度延迟和最坏响应时间。
二、发展历程:从裸机到 PREEMPT RT
实时控制平台的演进大致经历了四个阶段:
- 裸机与前后台系统:主循环加中断,结构简单,但任务多了以后响应时间难以保证。
- RTOS 阶段:VxWorks、QNX、FreeRTOS 等提供优先级抢占和确定性调度,但生态相对封闭,开发成本高。
- 双内核阶段:RTLinux、Xenomai 在 Linux 旁挂一个实时内核,实时任务跑在实时核上,非实时任务跑在 Linux 上,性能好但编程模型复杂。
- 单内核 PREEMPT RT 阶段:通过将 Linux 内核中不可抢占的区域改造为可抢占,使标准 Linux 本身具备硬实时能力,兼顾生态与实时性。
PREEMPT RT 的关键改造包括:自旋锁转为可睡眠的实时互斥锁、中断线程化、优先级继承、以及减少关中断临界区。这些改造使 Linux 在保持 POSIX 接口和丰富驱动生态的同时,能够把调度延迟压到几十微秒量级。
三、PREEMPT RT Linux 的定位
PREEMPT RT Linux 位于“通用操作系统”与“专用 RTOS”之间。它既不是纯粹的通用分时系统,也不是完全脱离 Linux 生态的专用内核。其定位可以用三个关键词概括:
- 确定性:通过抢占改造和优先级调度,提供可测量的最坏延迟。
- 兼容性:保留 Linux 系统调用、驱动模型和开发工具链。
- 可调优:通过 CPU 隔离、线程优先级、内存锁定等手段进一步压缩抖动。
下面的 SVG 展示了从通用 Linux 到 PREEMPT RT Linux 的实时能力演进,以及实时控制回路中各个延迟环节的对应关系。
四、课程整体学习路线
本课程共 30 章,按照“基础认知 → 内核机制 → 编程实践 → 调优排障 → 工程落地”的主线展开。学习路线可以概括为五个阶段:
| 阶段 | 核心内容 | 关键产出 |
|---|---|---|
| 基础认知 | 实时定义、发展历程、PREEMPT RT 定位 | 建立确定性思维 |
| 内核机制 | 抢占模型、中断线程化、优先级继承、调度器 | 理解延迟来源 |
| 编程实践 | POSIX 线程、时钟、信号量、内存锁定、CPU 亲和 | 编写实时任务 |
| 调优排障 | cyclictest、ftrace、perf、延迟分解与优化 | 测量并压缩抖动 |
| 工程落地 | 实时控制回路、驱动适配、系统集成与部署 | 完整实时控制系统 |
五、常见误区与复盘
在后续章节中,我们会从内核抢占机制讲起,逐步深入到实时任务编写、延迟测量与调优,最终完成一个可运行的实时控制回路。建议在学习过程中始终带着三个问题:延迟从哪里来?如何测量?如何压缩? 这三个问题将贯穿整个课程。
# 快速体验 PREEMPT RT 实时性(后续章节会详细展开)
uname -a
# 查看内核是否带 PREEMPT_RT 标记
cat /sys/kernel/realtime
# 运行 cyclictest 观察延迟分布
cyclictest -t1 -p 80 -n -i 1000 -l 10000
实时控制系统的学习不是记住几个命令,而是建立一套从“事件发生”到“输出生效”的完整时间观。当你能够清晰地画出控制回路中每一个延迟环节,并知道如何测量和优化它们时,你就真正掌握了 PREEMPT RT Linux 实时控制工程的核心能力。