// EMBEDDED SYSTEMS · REAL-TIME

实时不是
而是可预测

RTOS 的核心不在于吞吐量,而在于在确定的截止时间内响应事件。本页将深入解析实时性的定义、关键指标、以及工业级测量方法。

ISR Latency Demo · 中断响应延迟波形 LIVE

什么是实时性?

实时性(Real-Time)是指系统在严格的时间约束(截止时间,Deadline)内完成特定任务的能力。关键点在于确定性(Determinism)——系统行为必须可预测,最坏情况下的响应时间是已知的、有界的。

核心误解:实时 ≠ 高吞吐

通用操作系统(GPOS)
优化目标:平均响应时间、公平性、高吞吐量
例:Linux 公平调度器(CFS)力求公平分配 CPU 时间
实时操作系统(RTOS)
优化目标:最坏情况响应时间(WCRT)、确定性
例:VxWorks、FreeRTOS、QNX、Zephyr 的抢占式优先级调度
// 一个直观的例子:刹车踏板中断 void brake_interrupt_handler(void) { // 硬实时要求:从踩下踏板到制动器激活, // 必须在 < 5ms 内完成。不是"平均 5ms", // 而是"任何情况下都不超过 5ms"。 activate_brakes(MAX_FORCE); } // 如果延迟 100ms 才刹车呢? // 60km/h 时,100ms = 1.67 米 —— 可能就是生与死的差距

实时系统的三种类型

按截止时间被违反后的后果严重程度,实时系统分为三类。后果越严重,对延迟的要求越严格。

HARD · 硬实时

逾期 = 系统失败

错过截止时间会导致灾难性后果——人身伤害、设备损坏、或系统完全失效。响应时间必须绝对保证

典型延迟要求:< 10μs ~ 100μs
应用:汽车安全气囊、飞行控制、心脏起搏器、核反应堆控制
FIRM · 固实时

逾期 = 结果无用

错过截止时间不会导致灾难,但计算结果变得无意义并被丢弃。偶尔的逾期可以容忍,但会降低系统质量。

典型延迟要求:< 1ms ~ 10ms
应用:视频流解码、金融交易系统、工业机器人运动控制
SOFT · 软实时

逾期 = 性能下降

截止时间是期望值而非严格要求。逾期只会导致服务质量降低(QoS),系统仍可继续运行。统计意义上满足即可。

典型延迟要求:< 10ms ~ 100ms
应用:网络通信、用户界面、在线游戏、气象预报

衡量实时性的核心指标

实时性不能笼统地说"快"或"慢",需要用精确的、可测量的量化指标来描述。以下是工业界最常用的六个核心指标。

① 中断延迟

TIL = tISR_start − tIRQ_assert

从中断硬件信号置位(IRQ assert)到中断服务程序(ISR)第一条指令开始执行的时间。这是最基础、最常引用的实时性指标。

影响因素:中断屏蔽时间、中断控制器延迟、CPU 流水线刷新、缓存未命中、总线仲裁。

0.5 ~ 5 μs (典型 RTOS)
10 ~ 100+ μs (GPOS/Linux)

② 上下文切换时间

TCS = tnew_task_start − told_task_preempt

保存当前任务状态(寄存器、栈指针、PC)并恢复新任务状态的时间。这是衡量 RTOS 内核效率的核心指标。

典型值范围:ARM Cortex-M 上约 0.2~2μs,依赖 CPU 架构和 FPU 保存策略。

0.2 ~ 2 μs

③ 调度延迟

TSCHED = ttask_run − tevent_ready

从事件发生(使某任务变为就绪态)到该任务实际开始运行的时间。包含了中断延迟、ISR 执行时间、内核调度决策时间和上下文切换时间。

这是评估端到端实时响应最全面的单一指标。

2 ~ 50 μs (RTOS)

④ 抖动(Jitter)

J = max|Ti − Tavg|

周期性事件之间的时间偏差。即使平均延迟达标,高抖动也意味着确定性差——你永远不知道某一次响应会快还是慢。

低抖动是实时系统与通用系统的根本区别。

μs

⑤ 最坏情况执行时间(WCET)

Ci = max⁡( execution_time(all_paths) )

一段代码在所有可能的输入和路径下的最长执行时间。这是实时可调度性分析(如利用率测试、响应时间分析)的基础输入。

测量法(实测 WCET)与静态分析法(WCET 分析工具如 aiT)结果可能差数倍。

μs

⑥ 截止时间错过率

DMR = Nmissed / Ntotal × 100%

在所有任务实例中,未能在截止时间内完成的比率。硬实时系统要求 DMR = 0%,软实时系统可以有可接受的 DMR 阈值。

通常以 nines 表示:99.99% 意味着万分之一截止时间错过。

0.00%

优先级抢占式调度模拟器

这是理解 RTOS 实时性的核心工具。观察高优先级任务如何抢占低优先级任务、中断如何打断一切、以及延迟如何随之变化。点击「触发中断」或调整任务参数,观察时间线的变化。

速度
Task A (优先级 3)
Task B (优先级 2)
Task C (优先级 1)
ISR (最高优先级)
Idle
模拟时间
0.00 ms
上下文切换次数
0
最近中断延迟
— μs
最近调度延迟
— μs

系统负载如何影响延迟?

拖动滑块模拟不同的系统负载条件,观察中断延迟和调度延迟如何分布变化。在高负载或禁用抢占时,延迟分布的长尾效应会变得极其明显。

系统参数

延迟分布(1000 次采样模拟)

最坏情况
— μs
平均
— μs
99.99 百分位
— μs

硬实时 vs 软实时:逾期会发生什么?

选择不同的实时类型,观察任务在负载波动时如何表现。硬实时系统中,一次逾期就是系统失败;软实时系统中,逾期只是性能降级。

总任务数 / 逾期数
0 / 0
系统状态
运行正常

如何测量实时性?

测量实时性需要专门的工具和方法。核心原则是:测量行为本身不能影响被测系统的实时性(这被称为探针效应,Probe Effect)。

METHOD 01

硬件示波器 + GPIO 翻转

最经典、最可靠的方法。在被测事件发生时翻转一个 GPIO 引脚,用示波器测量物理延迟。

// 进入 ISR 时拉高 GPIO void isr_handler(void) { GPIO_WRITE(DEBUG_PIN, HIGH); // ... 中断处理 ... GPIO_WRITE(DEBUG_PIN, LOW); } // 触发中断前也拉高另一个引脚作为参考
✓ 优势
  • 纳秒级精度
  • 零探针效应
  • 测量延迟本身无开销
✗ 局限
  • 需要物理设备
  • 引脚数量有限
  • 无法查看内核内部状态
METHOD 02

硬件定时器捕获

使用 MCU 内置的硬件定时器(如 ARM 的 DWT 周期计数器)在 ISR 入口/出口读取时间戳,精确到 CPU 时钟周期。

// 使用 ARM Cortex-M 的 DWT 周期计数器 uint32_t measure_latency(void) { uint32_t t1 = DWT->CYCCNT; trigger_interrupt(); // 在 ISR 中记录 t2 return (t2 - t1) / SystemCoreClock_MHz; }
✓ 优势
  • 周期级精度
  • 无需外部设备
  • 可同时测多个事件
✗ 局限
  • 微小探针效应
  • 需硬件支持 DWT
  • 仅限单核测量
METHOD 03

软件追踪工具

在内核关键路径插入追踪钩子(Trace Hook),记录任务切换、中断、系统调用等事件的时间戳。工具如 Tracealyzer、Percepio、Lauterbach TRACE32。

// FreeRTOS + Tracealyzer 钩子示例 void vTraceISR(void) { vTraceStoreISRBegin(xHandle); // ISR 处理逻辑 vTraceStoreISREnd(0); }
✓ 优势
  • 完整的系统可视化
  • 可离线分析
  • 展示因果链
✗ 局限
  • 探针效应明显
  • 内存开销大
  • 改变时序行为
METHOD 04

压力测试 + 统计分析

在高负载条件下长时间运行,收集数百万次延迟样本,生成延迟分布直方图。关注尾部(99.99 百分位)而非平均值。

// 典型的 stress test 方案 // 1. 全部核满载运行 CPU 密集任务 // 2. 并发触发网络/磁盘 I/O 中断 // 3. 测量 >10^6 次 IRQ 响应延迟 // 4. 关注 max 和 P99.99 而非 mean // cyclictest (Linux 实时性测试工具) $ cyclictest -p 99 -m -t1 -i 1000 -l 1000000
✓ 优势
  • 暴露最坏情况
  • 贴近真实场景
  • 可量化确定性
✗ 局限
  • 耗时长
  • 无法保证覆盖所有路径
  • 依赖负载代表性

交互式示波器:测量中断延迟

模拟示波器测量中断延迟的过程。上方信号线是中断请求(IRQ),下方是 ISR 响应。两者的时间差就是中断延迟。点击按钮触发测量。

时间基准5 μs/div
CH1 IRQ:
CH2 ISR:
测得延迟: — μs
采样数: 0
最大延迟: — μs

RTOS vs GPOS:实时性对比

以 FreeRTOS(典型 RTOS)和标准 Linux(典型 GPOS)为例,在关键实时指标上的差异。

指标RTOS (FreeRTOS / Zephyr)GPOS (标准 Linux)实时扩展 (PREEMPT_RT)
中断延迟< 1~5 μs10~100+ μs5~50 μs
调度延迟< 5~20 μs50~1000+ μs10~100 μs
最坏情况抖动< 几十 μs可达几十 ms< 100 μs
抢占粒度任意点抢占自愿让步为主几乎所有上下文
优先级反转保护优先级继承协议不保证支持
中断禁用时间< 几 μs(有界)可能 > 100 μs< 100 μs
调度算法固定优先级抢占 (RMS)CFS 公平调度SCHED_FIFO / SCHED_RR
适用场景硬/固实时嵌入式通用计算/软实时需要 Linux 生态的软实时

数学能保证实时性吗?

实时系统的核心承诺是可以在数学上证明所有截止时间都能被满足。最常用的分析方法是基于速率单调调度(RMS)的利用率测试。

RMS 利用率上界测试

对于 n 个独立的周期性任务,如果调度器使用固定优先级(周期越短优先级越高),利用率满足以下条件,则所有截止时间保证被满足

U = Σ (Ci / Ti) ≤ n × (21/n − 1)

其中 Ci 是任务 i 的 WCET,Ti 是任务 i 的周期。当 n→∞ 时,上界趋近于 ln(2) ≈ 0.693(69.3%)。这意味着在最坏情况下,CPU 利用率不能超过 69.3% 才能保证可调度性。对于和谐的(harmonic)任务集,该上界可以接近 100%。

交互式利用率计算器

添加任务,设置周期和 WCET,检查是否可调度。

总利用率 U
0.00%
上界: 69.3%
可调度性判定