1. 课程导入

在工业自动化、机器人、数控机床、电力电子和汽车电子等领域,控制系统不仅要“算得对”,还要“算得及时”。当控制算法的输出必须在确定的时间窗口内送达执行机构时,系统就进入了实时控制的范畴。本课程围绕 PREEMPT RT Linux 展开,目标是让读者掌握在 Linux 平台上构建可预测、可测量、可调优的实时控制系统的完整方法。

一、什么是实时控制系统

实时控制系统是指系统对外部事件的响应时间具有明确约束,并且必须在约束期限内完成计算与输出的控制系统。这里的“实时”并不等于“快”,而是强调确定性:最坏情况下的响应时间(Worst-Case Execution Time, WCET)必须可分析、可测量、可保证。

实时系统通常分为三类:

  • 硬实时:错过截止时间会造成安全事故或重大经济损失,如电机伺服、安全联锁。
  • 软实时:偶尔超时只降低服务质量,如视频播放、人机界面刷新。
  • 固实时:超时结果无效但不会造成灾难,如部分数据采集系统。

一个典型的实时控制回路包含四个环节:传感器采样、控制算法计算、执行器输出、以及周期调度。其核心指标包括周期抖动、中断延迟、调度延迟和最坏响应时间。

实时控制的本质不是“平均快”,而是“最坏情况下仍然准时”。因此,评估一个实时平台时,抖动(jitter)往往比吞吐量更重要。

二、发展历程:从裸机到 PREEMPT RT

实时控制平台的演进大致经历了四个阶段:

  1. 裸机与前后台系统:主循环加中断,结构简单,但任务多了以后响应时间难以保证。
  2. RTOS 阶段:VxWorks、QNX、FreeRTOS 等提供优先级抢占和确定性调度,但生态相对封闭,开发成本高。
  3. 双内核阶段:RTLinux、Xenomai 在 Linux 旁挂一个实时内核,实时任务跑在实时核上,非实时任务跑在 Linux 上,性能好但编程模型复杂。
  4. 单内核 PREEMPT RT 阶段:通过将 Linux 内核中不可抢占的区域改造为可抢占,使标准 Linux 本身具备硬实时能力,兼顾生态与实时性。

PREEMPT RT 的关键改造包括:自旋锁转为可睡眠的实时互斥锁、中断线程化、优先级继承、以及减少关中断临界区。这些改造使 Linux 在保持 POSIX 接口和丰富驱动生态的同时,能够把调度延迟压到几十微秒量级。

三、PREEMPT RT Linux 的定位

PREEMPT RT Linux 位于“通用操作系统”与“专用 RTOS”之间。它既不是纯粹的通用分时系统,也不是完全脱离 Linux 生态的专用内核。其定位可以用三个关键词概括:

  • 确定性:通过抢占改造和优先级调度,提供可测量的最坏延迟。
  • 兼容性:保留 Linux 系统调用、驱动模型和开发工具链。
  • 可调优:通过 CPU 隔离、线程优先级、内存锁定等手段进一步压缩抖动。

下面的 SVG 展示了从通用 Linux 到 PREEMPT RT Linux 的实时能力演进,以及实时控制回路中各个延迟环节的对应关系。

实时控制回路与 PREEMPT RT Linux 延迟环节 传感器采样 ADC / 编码器 / 总线 控制算法计算 PID / 状态观测器 执行器输出 PWM / DAC / 继电器 周期调度 定时器 / 中断 闭环反馈 关键延迟环节 中断延迟 硬件响应 → ISR 入口 调度延迟 唤醒 → 实时任务运行 计算抖动 缓存 / 内存 / 分支 输出延迟 写寄存器 → 生效 实时平台演进与 PREEMPT RT 定位 裸机 / 前后台 简单,无确定性 专用 RTOS 确定性强,生态弱 双内核方案 性能好,模型复杂 PREEMPT RT Linux 生态 + 确定性

四、课程整体学习路线

本课程共 30 章,按照“基础认知 → 内核机制 → 编程实践 → 调优排障 → 工程落地”的主线展开。学习路线可以概括为五个阶段:

阶段 核心内容 关键产出
基础认知 实时定义、发展历程、PREEMPT RT 定位 建立确定性思维
内核机制 抢占模型、中断线程化、优先级继承、调度器 理解延迟来源
编程实践 POSIX 线程、时钟、信号量、内存锁定、CPU 亲和 编写实时任务
调优排障 cyclictest、ftrace、perf、延迟分解与优化 测量并压缩抖动
工程落地 实时控制回路、驱动适配、系统集成与部署 完整实时控制系统

五、常见误区与复盘

误区一:把“实时”等同于“高性能”。 实时系统追求的是最坏情况下的确定性,而不是平均吞吐量。一个平均响应 1 微秒但偶尔抖动 10 毫秒的系统,可能比平均响应 50 微秒但抖动不超过 100 微秒的系统更不适合硬实时控制。
误区二:装上 PREEMPT RT 补丁就万事大吉。 内核补丁只是提供了基础能力,实际抖动还取决于 CPU 隔离、内存锁定、中断亲和、电源管理、驱动行为等多个因素。实时性是一个系统工程。

在后续章节中,我们会从内核抢占机制讲起,逐步深入到实时任务编写、延迟测量与调优,最终完成一个可运行的实时控制回路。建议在学习过程中始终带着三个问题:延迟从哪里来?如何测量?如何压缩? 这三个问题将贯穿整个课程。

# 快速体验 PREEMPT RT 实时性(后续章节会详细展开)
uname -a
# 查看内核是否带 PREEMPT_RT 标记
cat /sys/kernel/realtime
# 运行 cyclictest 观察延迟分布
cyclictest -t1 -p 80 -n -i 1000 -l 10000

实时控制系统的学习不是记住几个命令,而是建立一套从“事件发生”到“输出生效”的完整时间观。当你能够清晰地画出控制回路中每一个延迟环节,并知道如何测量和优化它们时,你就真正掌握了 PREEMPT RT Linux 实时控制工程的核心能力。