2、基础知识:掌握实时系统的基本概念,包括硬实时、软实时、周期性任务和截止时间(Deadline)的分类

TinyML 实时推理的核心挑战,并非单纯追求“算得快”,而是要在确定的时间边界内完成推理并输出结果。理解实时系统的基本概念,是设计可预测推理管线的第一道门槛。本节将系统梳理硬实时与软实时的本质差异、周期性任务的数学模型,以及截止时间的分类与工程含义,为后续讨论 Deadline 与 Jitter 管理奠定理论基础。

实时系统核心概念关系图 实时系统 硬实时 (Hard RT) 错过截止时间 = 系统失效 例:安全气囊、心脏除颤器 软实时 (Soft RT) 错过截止时间 = 质量下降 例:语音识别、视频帧率 周期性任务模型 周期 T = 任务释放间隔 | 执行时间 C = 最坏执行时间 (WCET) 截止时间 D ≤ T | 利用率 U = C / T 截止时间分类:相对截止时间 vs 截止时间

2.1 实时性的本质:时间正确性与逻辑正确性同等重要

在通用计算系统中,我们关注的是“结果是否正确”;而在实时系统中,“结果是否在正确的时间产生”与结果本身同样重要。一个迟到的正确结果,在实时系统中往往等同于错误结果。例如,一个麦克风阵列的语音唤醒模型,如果在说话结束 500ms 后才给出唤醒判断,即便判断完全正确,用户体验也已严重受损。

实时性并不等于“高速”或“低延迟”。一个系统即使平均延迟很高,只要其最坏情况延迟(Worst-Case Latency)有明确上界且不超过截止时间,它就是实时系统;反之,一个平均延迟极低但偶尔出现长尾延迟的系统,反而可能不满足实时性要求。TinyML 场景中,MCU 上的推理任务通常具有周期性特征,因此我们需要从任务模型的角度来精确描述实时性。

2.2 硬实时与软实时:失效模式的本质差异

根据错过截止时间的后果严重程度,实时系统分为硬实时和软实时两大类。这一分类直接决定了我们在 TinyML 推理管线中采用何种调度策略、预留多少资源余量。

对比维度 硬实时 (Hard Real-Time) 软实时 (Soft Real-Time)
错过截止时间的后果 灾难性后果:设备损坏、人身伤害、任务失败 性能退化:输出质量下降、用户体验受损,但系统仍可运行
典型应用 安全气囊触发、医疗除颤器、电机过流保护 音频关键词检测、视频帧分类、传感器数据融合
验证方法 必须证明最坏情况下仍满足截止时间(静态分析) 通常通过统计方法保证(如 99% 的推理在截止时间内完成)
资源预留策略 按 WCET 预留全部资源,不允许超时 允许偶尔超时,通过缓冲或降级策略吸收抖动
TinyML 中的典型场景 工业安全联锁、无人机避障急停 智能音箱唤醒词、可穿戴设备活动识别

需要特别指出的是,TinyML 中大多数推理任务属于软实时范畴。例如,一个持续监测心率的可穿戴设备,偶尔一次推理超时并不会造成生命危险,但会导致心率曲线出现毛刺。然而,当 TinyML 被用于工业现场的设备预测性维护或安全联锁时,推理结果就具有硬实时属性——迟到的故障判断可能意味着设备损坏甚至人员伤害。

工程判断准则:在项目启动时,请明确回答以下问题——如果本次推理结果晚到 10ms,会发生什么?如果晚到 100ms 呢?如果晚到 1s 呢?根据答案的严重程度,确定系统属于硬实时还是软实时,并据此选择调度策略和验证方法。

2.3 周期性任务模型:T、C、D 与 U 的数学刻画

绝大多数 TinyML 推理任务具有周期性:传感器以固定频率采样,推理任务随之周期性地被释放(Release)。例如,一个 6 轴 IMU 以 100Hz 输出数据,则推理任务每 10ms 被唤醒一次。为了精确描述这种任务,实时系统领域定义了四个关键参数:

  • 周期 T(Period):任务两次连续释放之间的时间间隔。对于 100Hz 的 IMU,T = 10ms。
  • 执行时间 C(Computation Time):任务完成一次推理所需的处理器时间。通常使用最坏执行时间(WCET, Worst-Case Execution Time)作为设计依据。
  • 截止时间 D(Deadline):任务释放后,必须在该时间点之前完成执行。D 可以等于 T,也可以小于 T(D ≤ T)。
  • 利用率 U(Utilization):U = C / T,表示处理器被该任务占用的时间比例。对于单任务系统,U 必须 ≤ 1;对于多任务系统,总利用率必须满足可调度性条件。

以一个运行在 80MHz Cortex-M4 上的关键词检测模型为例:音频采样周期 T = 20ms(50Hz),模型推理的 WCET 为 8ms,则 C = 8ms,U = 8/20 = 0.4。这意味着处理器有 40% 的时间用于推理,剩余 60% 的时间可用于其他任务(如音频采集、通信)。如果系统还运行一个 T=50ms、C=10ms 的传感器融合任务(U=0.2),则总利用率 U_total = 0.4 + 0.2 = 0.6,仍处于安全范围。

2.4 截止时间的分类:相对与、隐式与显式

截止时间可以从不同维度进行分类,理解这些分类有助于我们在代码中正确实现定时逻辑。

按时间参考点分类:

  • 相对截止时间(Relative Deadline):相对于任务释放时刻的时间长度。例如“推理必须在释放后 15ms 内完成”,这里的 15ms 就是相对截止时间。
  • 截止时间(Absolute Deadline):相对于系统启动或某个全局时钟的时刻。例如“推理必须在系统时间 1000ms 时完成”。在实现中,截止时间 = 释放时刻 + 相对截止时间。

按约束强度分类:

  • 隐式截止时间(Implicit Deadline):D = T,即任务必须在下一个周期开始前完成。这是最宽松的约束,也是许多 TinyML 任务默认采用的模型。
  • 显式截止时间(Explicit Deadline):D < T,即任务必须在一个周期内更早的时刻完成。例如,推理任务必须在采样后 8ms 内完成,而采样周期是 20ms,这样可以为后续的通信任务留出时间。
  • 约束截止时间(Constrained Deadline):D ≤ T,是隐式和显式的统称。
  • 任意截止时间(Arbitrary Deadline):D 可以大于 T,即任务可以跨越多个周期完成。这种情况在 TinyML 中较少见,但在多级流水线处理中可能出现。
实践建议:在 TinyML 项目中,建议始终使用显式截止时间(D < T)来设计推理任务。原因有二:第一,为中断处理、DMA 传输等不可预测事件预留时间余量;第二,为后续可能增加的任务留出调度空间。例如,如果采样周期 T=10ms,推理 WCET=4ms,建议将 D 设为 6ms,而不是 10ms。

2.5 案例拆解:可穿戴 ECG 设备的实时推理参数设计

下面通过一个完整的案例,展示如何将上述概念应用于实际 TinyML 系统设计。

背景与约束:设计一款胸贴式 ECG(心电图)可穿戴设备,用于心律失常检测。设备采用 Nordic nRF52840(Cortex-M4F @ 64MHz),板载 500Hz 采样率的 ECG 前端。系统需要同时运行两个任务:ECG 特征提取与分类(Task A)和蓝牙低功耗(BLE)数据上报(Task B)。

初始参数与目标:

  • ECG 采样率:500Hz → 采样周期 T_s = 2ms
  • 推理任务(Task A):每 20ms 对 40 个采样点(一个窗口)进行一次分类,即 T_A = 20ms
  • BLE 上报任务(Task B):每 100ms 将 5 个分类结果打包发送,即 T_B = 100ms
  • 目标:确保 Task A 的推理结果在下一个窗口采样完成前产出,即 D_A ≤ 20ms

关键输入数据与测量:通过 ARM Cycle Counter 实测,Task A 的推理 WCET = 6.2ms(包含特征提取 2.1ms + CNN 推理 3.5ms + 后处理 0.6ms)。Task B 的 WCET = 1.8ms(包含 BLE 协议栈处理)。

分析判断过程:

  1. Task A 利用率:U_A = 6.2 / 20 = 0.31
  2. Task B 利用率:U_B = 1.8 / 100 = 0.018
  3. 总利用率:U_total = 0.31 + 0.018 = 0.328,远小于 1,理论上可调度。
  4. 但需考虑中断开销:ECG 采样中断每 2ms 触发一次,每次中断处理约 0.05ms,则中断总开销 = 0.05 / 2 = 0.025(2.5%)。
  5. 实际可用处理器时间 = 1 - 0.025 = 0.975,仍大于 0.328,满足要求。

实际操作步骤:

// 任务参数定义(基于 FreeRTOS 静态优先级调度)
// Task A: 优先级 5,周期 20ms,WCET 6.2ms,D=15ms(显式截止时间)
// Task B: 优先级 3,周期 100ms,WCET 1.8ms,D=80ms

// 在代码中显式检查截止时间
uint32_t start_tick = osKernelGetTickCount();
inference_result_t result = run_ecg_inference(window);
uint32_t elapsed = osKernelGetTickCount() - start_tick;

if (elapsed > 15) {  // 超过显式截止时间 15ms
    // 记录超时事件,但不丢弃结果(软实时策略)
    metrics.overrun_count++;
    // 可选:降低模型精度以缩短执行时间
}

结果对比与复盘:在 24 小时连续运行测试中,Task A 的实测最大执行时间为 6.8ms(略高于 WCET 估计,因温度变化导致 Flash 读取速度下降),但仍在 15ms 截止时间内。系统未发生推理结果覆盖或数据丢失。通过预留 D=15ms(而非 20ms),系统在 BLE 连接事件突发占用 CPU 时仍有 8.2ms 的余量,避免了任务超时。

风险与代价:将 D 设为 15ms 意味着处理器在每 20ms 周期内有 5ms 的空闲时间无法用于低功耗睡眠,增加了约 25% 的功耗。这是保证实时性的必要代价。

2.6 常见误区与总结复盘

在理解实时系统概念时,初学者常犯以下错误,需要特别警惕:

误区一:将“平均延迟低”等同于“实时性好”。实时性的核心是可预测性,而非平均性能。一个平均延迟 3ms 但最坏延迟 50ms 的系统,比平均延迟 8ms 但最坏延迟 10ms 的系统更不适合硬实时场景。

误区二:忽略中断和系统调用的开销。在计算任务利用率时,只考虑推理本身的执行时间,而忽略了 ADC 采样中断、RTOS 调度器开销、DMA 传输等。这些开销在 TinyML 中可能占总 CPU 时间的 10%-20%。

误区三:将 WCET 等同于典型执行时间。WCET 必须考虑最坏情况:缓存未命中、Flash 等待状态、总线仲裁延迟、温度变化导致的频率漂移。建议在实测典型执行时间基础上乘以 1.5-2 的安全系数作为 WCET 估计值。

误区四:混淆周期与截止时间。周期 T 是任务释放的间隔,截止时间 D 是任务必须完成的时间限制。D 可以小于 T,但绝不能大于 T(除非使用任意截止时间模型,这在 TinyML 中极少见)。

本节核心要点回顾:

  • 实时系统的核心是时间确定性,而非单纯的高速处理。
  • 硬实时要求最坏情况下满足截止时间,软实时允许偶发超时但需控制频率和影响。
  • 周期性任务用四元组 (T, C, D, U) 描述,其中 U = C/T 是利用率。
  • 截止时间分为相对/、隐式/显式,工程上建议使用显式截止时间(D < T)以预留余量。
  • 设计 TinyML 实时推理系统时,必须将中断开销、调度开销纳入利用率计算,并基于 WCET 而非平均执行时间进行资源预留。