在前面的文章中,我们连续讨论了实时 Linux 中几个非常容易被忽略的问题:调度器决定任务什么时候运行,CPU 核心隔离决定实时任务能不能拥有相对独立的执行环境,内存管理决定任务运行过程中会不会突然遇到缺页和内存分配抖动,而 IRQ、SoftIRQ 等机制又可能把大量不可预测的系统活动带进实时任务所在的 CPU。

这些问题解决之后,一个新的问题自然会出现:

如果控制程序需要通过网络与传感器、伺服驱动器、机器人关节或者其他控制器通信,那么网络本身出现抖动怎么办?

这其实是工业控制和机器人系统进入高速协同之后非常关键的一层。

例如,一个机器人控制周期是 1 ms。控制器需要在每个周期内读取编码器、获取传感器数据,计算运动控制结果,再把新的控制指令发送给多个伺服驱动器。如果这些数据都在本地 CPU 上完成,那么实时性主要取决于操作系统、调度器、中断、内存和 CPU 资源。但如果传感器和执行器通过工业网络连接,那么完整的控制链路就变成了:

传感器 → 网络 → 网卡 → 中断 → 网络协议栈 → 实时线程 → 控制计算 → 网络发送 → 驱动器。

此时,系统是否“实时”,就不能只看 CPU 上的任务有没有按时运行。

一个控制任务可能每 1 ms 准时启动,但数据晚了 300 μs 才到;也可能程序只用了 100 μs 就计算完成,却因为网络排队导致控制指令迟迟没有发送出去。

因此,实时系统真正需要解决的问题,并不是单纯的“CPU执行得快不快”,而是:

从数据产生,到数据传输,再到控制任务执行和控制结果输出,整个链路能不能在规定时间内稳定完成。

这就是工业控制领域为什么需要实时网络,也是实时 Linux 从“实时操作系统”进一步走向“实时控制平台”时必须面对的问题。


一、实时控制为什么不能只看CPU:真正困难的是“端到端确定性”

普通计算机网络最关心的往往是吞吐量、平均延迟和带宽。

例如下载文件时,网络延迟从 10 ms 变成 20 ms,用户通常不会特别在意;视频播放过程中出现几十毫秒的抖动,也可能通过缓存机制被消化。

但工业控制完全不同。

假设一个伺服控制周期是 1 ms。

理想情况下,控制器可能按照下面的节奏运行:

0 ms       1 ms       2 ms       3 ms
 |----------|----------|----------|
 采集        计算       输出

如果每个周期都能够稳定完成,那么系统具有比较好的周期确定性。

但如果网络延迟变成:

周期1:120 μs
周期2:130 μs
周期3:150 μs
周期4:800 μs
周期5:140 μs

平均下来可能并不算特别夸张。

但对于实时控制而言,真正危险的恰恰是那个突然出现的 800 μs。

因为实时系统关心的不是:

“大部分情况下有多快?”

而是:

“最坏情况下到底会有多慢?”

这就是普通网络系统与实时网络系统非常重要的区别。

在普通网络中,平均延迟是一个很重要的指标;而在硬实时控制中,更重要的是延迟上界、周期抖动和最坏情况响应时间

假设一个机器人关节控制周期是 1 ms。

如果网络延迟稳定在 200 μs 左右,即使它不是最低延迟,控制系统依然可能比较容易设计。

反过来,如果网络平均只有 50 μs,但偶尔出现 3 ms 的延迟,那么对于严格的周期控制来说,这种网络反而更加危险。

因为控制系统真正需要的是:

可预测,而不仅仅是快速。

这也是理解实时网络最重要的一个概念。

实时网络并不是简单地追求“更快的网络”,而是要让网络传输过程中的时间行为更加确定。


二、从网卡中断到网络协议栈:为什么网络数据也会干扰实时任务

很多人在配置实时 Linux 时,会注意 CPU affinity、CPU isolation,却容易忽略一个问题:

网络数据最终还是要经过 CPU。

一个网络数据包从网卡进入系统之后,并不是直接“跳进”用户态控制程序。

它通常要经历类似这样的路径:

工业设备
   ↓
网线
   ↓
网卡
   ↓
DMA
   ↓
网卡中断
   ↓
IRQ / NAPI
   ↓
SoftIRQ
   ↓
Linux网络协议栈
   ↓
Socket / 驱动接口
   ↓
实时控制线程

这条链路中的任何一个环节出现明显抖动,都可能最终表现为控制任务的数据延迟。

例如,一个实时控制线程运行在 CPU 2 上,本来希望 CPU 2 专门执行控制任务。

但如果网卡的 IRQ 同样被分配到了 CPU 2,那么网络数据一到,CPU 2 就可能需要响应网卡中断。

如果系统网络流量较大,还可能进一步触发 SoftIRQ 等处理。

最终就形成了这样的竞争:

CPU 2
├── 实时控制线程
├── 网卡IRQ
├── SoftIRQ
├── 网络协议栈处理
├── 系统定时器
└── 其他内核活动

从普通 Linux 的角度看,这完全合理。

操作系统希望充分利用 CPU,尽可能让任务、网络和系统服务都能够快速得到处理。

但从硬实时控制的角度看,这就意味着:

原本应该尽可能稳定的控制 CPU,又多了一批不可预测的工作。

这也是为什么前面我们一直强调:

CPU核心隔离不能只理解成“把任务绑到一个CPU上”。

真正有意义的核心隔离,应该进一步考虑:

  • 哪些实时任务运行在这个核心;

  • 哪些 IRQ 可以进入这个核心;

  • 哪些 SoftIRQ 会在这个核心处理;

  • 网卡队列对应哪个 CPU;

  • 网络协议栈是否会给实时核心制造额外负载;

  • 其他系统服务是否可能进入这个实时执行域。

对于工业控制系统而言,这个问题尤其明显。

比如机器人控制器同时承担:

  • 关节控制;

  • 视觉数据接收;

  • 激光雷达数据处理;

  • 工业网络通信;

  • 日志记录;

  • 人机交互;

  • AI 推理。

如果所有业务都混在几个 CPU 核心上运行,那么即使实时线程使用了 SCHED_FIFO,也不能自动获得真正稳定的执行环境。

因为调度优先级只能解决:

“CPU资源发生竞争时谁先运行。”

它不能自动解决:

“哪些中断可以进入这个CPU。”

也不能解决:

“网络数据什么时候到达。”

更不能保证:

“整个通信链路什么时候完成。”

因此,实时网络的第一步其实并不是马上讨论 EtherCAT 或 TSN,而是先把网络处理本身纳入实时系统的整体资源隔离设计。

例如,可以构建这样的结构:

             实时控制域
        ┌──────────────────┐
        │   CPU Core 2     │
        │                  │
        │ 实时控制线程     │
        │ SCHED_FIFO/RR    │
        │ 控制算法         │
        └────────┬─────────┘
                 │
           实时网络数据
                 │
        ┌────────┴─────────┐
        │   专用网络队列    │
        └────────┬─────────┘
                 │
        ┌────────┴─────────┐
        │      NIC         │
        └──────────────────┘

             非实时域
        ┌──────────────────┐
        │ AI / 日志 / UI   │
        │ 普通网络 / 存储  │
        └──────────────────┘

这时候,“核心隔离”的含义就更加完整了。

它不再只是把一个线程固定到某个 CPU,而是在 CPU、IRQ、网络队列以及任务调度等多个层面共同建立一个低干扰实时执行域


三、EtherCAT为什么适合工业控制?核心不是“速度快”,而是时间可控

说到工业实时网络,EtherCAT 是一个绕不开的技术。

在机器人、运动控制、伺服系统、数控设备以及智能制造设备中,经常需要让一个控制器同时与多个从站设备进行周期通信。

例如:

        主控制器
            │
            ▼
      ┌───────────┐
      │ EtherCAT  │
      └─────┬─────┘
            │
     ┌──────┼──────┐
     ▼      ▼      ▼
   伺服1   伺服2   伺服3
     │      │      │
   电机1   电机2   电机3

传统网络通信往往需要设备逐个接收数据、处理数据、再发送出去。

而 EtherCAT 的一个重要思路,是让数据帧在经过从站设备时直接进行数据处理,从而减少大量传统网络交换过程中的等待。

更重要的是,EtherCAT 并不只是追求吞吐量,而是围绕周期通信和同步控制建立机制。

对于运动控制来说,最关键的并不是:

“我一秒钟可以传多少数据。”

而是:

“我能不能在每一个控制周期的确定时间窗口里完成数据交换。”

这两个问题看起来非常接近,实际上完全不同。

假设机器人控制周期为 1 ms:

0ms       1ms       2ms       3ms
│---------│---------│---------│
 ↑         ↑         ↑
周期1      周期2      周期3

控制系统希望每一个周期都完成:

读取位置
   ↓
读取速度
   ↓
控制计算
   ↓
输出力矩
   ↓
进入下一周期

如果网络通信在某个周期突然延迟,那么下一周期使用的数据可能已经过期。

对于高速运动控制而言,这不仅仅意味着“程序慢了一点”,而可能直接影响运动轨迹、同步误差和控制稳定性。

因此,工业实时网络通常需要同时关注三个问题:

通信周期、时间同步、延迟抖动。

这也是为什么 EtherCAT 这样的工业网络协议,会特别强调周期通信以及分布式时钟等机制。

所谓分布式时钟,可以简单理解成:

让网络中的多个设备尽可能拥有统一的时间基准。

这样,控制器、伺服驱动器以及其他节点就可以按照共同的时间节拍工作。

例如:

控制器时钟
     │
     ├──── 周期T0
     │
     ├──── 周期T1
     │
     ├──── 周期T2
     │
     ▼

驱动器1
     │
     ├──── T0
     ├──── T1
     ├──── T2

驱动器2
     │
     ├──── T0
     ├──── T1
     ├──── T2

这对于多轴运动控制尤其重要。

如果不同设备之间没有可靠的时间关系,那么即使网络带宽足够,多个执行机构也可能出现不同步。

所以从这里可以看到一个非常重要的变化:

实时系统的“时间确定性”已经从 CPU 内部扩展到了网络。


四、TSN解决的又是什么问题?从“工业专网”走向“确定性以太网”

如果说 EtherCAT 是工业实时通信的重要代表,那么 TSN(Time-Sensitive Networking,时间敏感网络)则代表了另一条非常值得关注的技术路线。

它背后的核心思想可以简单理解为:

让标准以太网也具备更加可预测的时间行为。

传统以太网非常适合大量数据通信。

但当网络中同时存在:

  • AI 数据;

  • 视频流;

  • 普通 TCP/IP;

  • 控制指令;

  • 传感器数据;

  • 日志;

  • 管理流量;

不同类型的数据可能互相竞争网络资源。

例如:

普通网络流量 ───────┐
视频数据 ───────────┤
AI数据 ─────────────┼──→ 交换机 → 控制器
日志 ───────────────┤
实时控制 ───────────┘

如果没有进一步的机制,实时控制数据就可能受到其他业务流量影响。

TSN 的价值就在于,通过时间同步、流量调度、优先级控制等机制,让不同类型的数据在共享以太网基础设施时能够获得更加明确的传输行为。

其中一个非常重要的概念就是时间感知调度

可以把网络理解成一条高速公路。

普通网络的模式比较像:

谁先到谁先走

而实时网络更希望变成:

这个时间窗口:
允许控制数据通过

下一个时间窗口:
允许普通数据通过

再下一个时间窗口:
允许其他业务通过

这样,网络资源就从“尽可能高效地使用”变成了:

按照预先设计好的时间规则进行使用。

这对于机器人、汽车电子、工业控制以及多设备协同等场景尤其重要。

TSN体系中还有时间同步、帧抢占等不同机制,它们分别从不同角度降低网络中的不确定性。

例如时间同步解决的是:

“大家的时钟是不是一致?”

而调度机制解决的是:

“什么时候允许哪些数据通过?”

帧抢占则进一步解决:

“当实时数据到来时,正在发送的普通数据怎么办?”

这些技术组合起来,本质上都是在解决同一个问题:

如何让网络传输行为变得更加可预测。

这里也能看到 EtherCAT 和 TSN 的一个重要区别。

EtherCAT 更典型地服务于工业自动化、运动控制等场景,是围绕实时工业通信设计的一套完整技术体系。

TSN 则更多是在标准以太网基础上增强确定性能力,希望让不同类型业务可以在统一网络架构中共存。

因此,在未来的智能制造系统中,很可能不是简单地出现“EtherCAT替代TSN”或者“TSN替代工业以太网”的单一答案,而是根据控制周期、设备架构、网络规模、协议生态以及系统集成方式选择不同的通信技术。

对于操作系统而言,真正重要的也不是“支持某一个协议”这么简单。

更重要的是:

操作系统能不能把网络通信纳入整个实时执行链路。


五、从“实时CPU”到“实时网络”:真正的实时系统必须做端到端设计

到这里,我们可以把前面几篇文章讨论过的内容重新串起来。

如果一个机器人控制系统需要在 1 ms 周期内完成一次完整控制,那么真正的执行链路可能是:

传感器
  ↓
实时网络
  ↓
网卡
  ↓
IRQ
  ↓
SoftIRQ / 网络处理
  ↓
实时线程唤醒
  ↓
实时调度
  ↓
控制算法
  ↓
执行器计算
  ↓
网络发送
  ↓
伺服驱动器
  ↓
电机

这意味着:

实时性从来不是操作系统某一个模块单独提供的能力。

它是整个系统共同作用的结果。

前面我们讨论 SCHED_FIFO、SCHED_RR、SCHED_DEADLINE,是在解决“任务什么时候获得 CPU”。

讨论 CPU affinity 和核心隔离,是在解决“实时任务在哪里运行,以及如何减少 CPU 干扰”。

讨论优先级反转,是在解决“任务拿不到资源时会不会被低优先级任务间接阻塞”。

讨论内存锁定,是在解决“任务运行过程中会不会因为缺页和内存管理产生不可预测延迟”。

讨论 IRQ 和 SoftIRQ,是在解决“系统中断和内核异步活动会不会打扰实时任务”。

而到了实时网络,我们又增加了一层:

数据什么时候到达?

所以,一个完整的实时系统可以进一步理解成:

                实时系统
                    │
      ┌─────────────┼─────────────┐
      │             │             │
   调度确定性    执行确定性     通信确定性
      │             │             │
 SCHED_FIFO      核心隔离       EtherCAT
 SCHED_RR        IRQ隔离        TSN
 SCHED_DEADLINE  内存管理       PTP
      │             │             │
      └─────────────┼─────────────┘
                    │
             端到端确定性
                    │
              工业控制/机器人

这也是为什么未来的实时 Linux,不应该只讨论“Linux内核是不是实时”。

真正应该讨论的是:

从任务调度到 CPU,从内存到中断,从网络到控制算法,能不能共同形成一个可预测的实时执行环境。

对于望获OS而言,这也是实时操作系统技术路线非常重要的一点。

望获OS并不是简单地把某一个实时调度策略加入 Linux,而是围绕硬实时场景,对操作系统运行环境进行系统性的实时化设计。望获rtLinux、望获rtEuler等产品面向不同应用环境,在实时调度、核心隔离、系统资源管理以及工业应用适配等方面形成相应能力。

其中,核心隔离依然是非常值得关注的一环。

因为当机器人控制、AI推理、视觉计算、网络通信、日志和人机交互全部集中到同一台设备之后,真正困难的问题已经不再是“有没有足够的 CPU 性能”,而是:

能不能把不同性质的计算任务放进不同的资源域,让实时任务拥有相对稳定、可预测的执行环境。

例如可以进一步形成这样的系统架构:

                多业务智能控制器
                       │
        ┌──────────────┴──────────────┐
        │                             │
    实时控制域                     非实时计算域
        │                             │
   独立CPU核心                    AI/视觉计算
   核心隔离                       普通Linux任务
   IRQ隔离                        日志/存储
   实时调度                       普通网络
        │                             │
        ↓                             ↓
   EtherCAT/TSN                  高吞吐网络
        │
        ↓
   伺服/机器人/PLC

这种架构的意义在于:

不是要求所有任务都实时,而是让真正需要实时的任务拥有确定性的运行环境。

这其实也是未来智能制造操作系统非常重要的设计方向。

因为未来的工业控制器很可能不再是一台“只做控制”的机器。

它同时可能运行 AI 推理、机器视觉、数字孪生、边缘计算、数据采集、设备管理甚至大模型相关任务。

如果所有任务都按照传统通用计算模式混在一起,系统越复杂,实时性越难保证。

而如果从架构层面建立实时域与非实时域,通过核心隔离、IRQ隔离、实时调度、内存管理以及实时网络等技术共同控制干扰,那么一台计算设备就可以同时承担“智能计算”和“确定性控制”。

这也是“AI负责思考,实时系统负责按时执行”真正落到工程层面的关键。


结语:真正的“实时”,不是某一个指标,而是一条完整的时间链

从 SCHED_FIFO 到核心隔离,从优先级反转到内存管理,再到 IRQ、SoftIRQ 和实时网络,我们实际上一直在回答同一个问题:

一个系统怎样才能在规定的时间内,稳定地完成规定的事情?

答案并不是单独提高 CPU 主频,也不是单独选择一个实时调度策略,更不是简单地换成某一种工业网络。

真正的实时性,需要从整个系统的时间链路去理解:

任务调度是否确定 → CPU执行是否确定 → 内存访问是否可控 → 中断干扰是否可控 → 网络传输是否确定 → 控制周期是否同步。

因此,工业控制和机器人系统中的“实时”,最终一定会从单点实时走向端到端实时

CPU实时,只能保证程序有机会按时执行;

网络实时,才能保证数据有机会按时到达;

而只有二者结合起来,才能真正支撑高速运动控制、机器人协同、工业自动化和智能制造中的确定性控制。

对于实时 Linux 而言,这也意味着未来值得关注的已经不只是“内核能做到多少微秒”,而是:

从应用任务、调度器、CPU核心、中断、内存,到工业网络,整个系统能不能建立一条真正可预测的时间链。

这可能才是实时操作系统在下一阶段智能制造和机器人系统中的真正价值。

而当越来越多的 AI、视觉和复杂计算进入工业控制器之后,如何在一台计算平台上同时实现“高算力”和“强实时”,也将成为实时 Linux 以及国产实时操作系统继续发展的重要方向。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐