3、周期性采样任务概述:采样周期定义、任务模型、实时性与功耗的权衡

TinyML 设备(如智能手表、工业振动传感器、农业环境监测节点)的核心工作模式,并非持续满负荷运算,而是以固定的时间间隔唤醒,采集传感器数据,执行推理或特征提取,随后再次进入休眠。这种“采样-处理-休眠”的循环,构成了周期性采样任务的基本形态。理解采样周期的本质、任务模型的数学表达,以及实时性与功耗之间的博弈关系,是设计低功耗调度框架的基石。本章将系统拆解这三个核心维度,并给出可落地的工程判断方法。

周期性采样任务调度核心模型 任务周期模型 采样周期 T_s = 1/f_s 执行时间 C_i (最坏情况 WCET) 截止时间 D_i (通常 D_i = T_s) 空闲时间 = T_s - C_i 占空比 = C_i / T_s 实时性约束 硬实时:错过截止时间 = 系统失效 软实时:偶尔错过可容忍,但需控制 利用率 U = Σ(C_i / T_i) ≤ 1 调度可行性:EDF 需 U ≤ 1 RM 需 U ≤ n(2^(1/n)-1) 功耗权衡 动态功耗 ∝ f · V² · 活动因子 静态功耗 ∝ 漏电流 · V 唤醒开销 E_wake (启动 ADC/时钟) 通信功耗 E_tx (射频发送) 总能耗 = E_active + E_sleep + E_wake 调度决策:采样周期 T_s 的选择 信号带宽约束 f_s ≥ 2 × f_max (奈奎斯特) 欠采样导致混叠失真 功耗预算约束 平均电流 I_avg ≤ I_budget 电池寿命 = 容量 / I_avg 任务可调度性 U = C_i / T_s ≤ U_max 预留余量应对中断抖动 最优 T_s = max(信号约束最小周期, 功耗约束最小周期, 调度约束最小周期)

3.1 采样周期的定义与物理意义

采样周期(Sampling Period, T_s)是指两次相邻采样启动之间的时间间隔,其倒数即为采样频率 f_s = 1/T_s。在 TinyML 场景中,采样周期并非一个可以随意设定的参数,它首先受限于被采样信号的物理特性。根据奈奎斯特-香农采样定理,为了无失真地重建一个最高频率分量为 f_max 的连续信号,采样频率必须满足 f_s ≥ 2·f_max。例如,一个用于监测电机轴承振动的加速度传感器,若轴承故障特征频率最高为 2 kHz,则采样频率至少需要 4 kHz,对应采样周期 T_s ≤ 250 μs。

然而,TinyML 设备往往面临更复杂的约束。除了信号带宽,采样周期还受到传感器建立时间、ADC 转换时间、前端模拟滤波器的稳定时间等因素的影响。例如,许多 MEMS 加速度计在从休眠模式唤醒后,需要 0.5~1 ms 的稳定时间才能输出有效数据。如果采样周期设置得比传感器稳定时间还短,那么每次采样读到的都是无效数据,导致系统整体失效。因此,实际可行的采样周期必须满足:T_s ≥ T_sensor_settle + T_adc_conv + T_processing,其中 T_processing 包括特征提取和推理执行时间。

从任务调度的视角看,采样周期定义了任务的释放速率。每个采样周期内,系统需要完成一次完整的“采集-处理-决策”流水线。这个流水线的总执行时间 C_i(最坏情况执行时间,WCET)必须小于采样周期 T_s,否则任务将无法在下一个周期到来之前完成,造成任务堆积和实时性丧失。通常,工程上要求 C_i ≤ 0.7·T_s,预留 30% 的余量以应对中断处理、系统调用和时钟抖动。

3.2 周期性任务模型:从单任务到多任务

在 TinyML 调度框架中,周期性采样任务通常被建模为实时系统中的周期任务。一个周期任务 τ_i 可以用四元组 (Φ_i, T_i, C_i, D_i) 来描述:Φ_i 为相位偏移(首次释放时刻),T_i 为周期,C_i 为最坏情况执行时间,D_i 为相对截止时间。对于大多数采样任务,D_i = T_i,即任务必须在本周期结束前完成。当系统同时运行多个周期性任务(如温度采样、加速度采样、无线发送)时,需要验证任务集的可调度性。

可调度性分析有两种经典方法。对于固定优先级调度(如速率单调 RM),充分条件为总利用率 U = Σ(C_i/T_i) ≤ n(2^(1/n) - 1),其中 n 为任务数量。当 n=1 时,U ≤ 1;当 n=2 时,U ≤ 0.828;当 n 趋于无穷时,U 趋近于 ln2 ≈ 0.693。对于动态优先级调度(如最早截止时间优先 EDF),充要条件为 U ≤ 1。EDF 在理论上能实现 100% 的利用率,但在 TinyML 的裸机或 RTOS 环境中,EDF 的实现复杂度较高,通常采用 RM 或基于优先级抢占的调度器。

在实际 TinyML 系统中,除了周期性任务,还存在异步事件(如外部中断唤醒、看门狗定时器)。这些异步任务会抢占周期性采样任务的执行,导致采样任务的 WCET 增加。因此,在计算 C_i 时,必须将最坏情况下的中断嵌套时间计入。例如,一个 I2C 传感器读取任务,其标称执行时间为 200 μs,但若在读取过程中发生一个 50 μs 的射频中断服务程序,则实际 WCET 应计为 250 μs。忽略这种干扰是导致系统在压力测试下崩溃的常见原因。

任务类型 周期 T_i WCET C_i 截止时间 D_i 利用率 U_i
加速度采样+推理 10 ms 2.5 ms 10 ms 0.25
温度采样 100 ms 1.0 ms 100 ms 0.01
无线发送(BLE) 50 ms 3.0 ms 50 ms 0.06
系统状态监测 500 ms 0.5 ms 500 ms 0.001
总利用率 U_total 0.321

上表展示了一个典型的多任务 TinyML 系统的利用率计算。总利用率 0.321 远低于 RM 调度在 n=4 时的理论上限 0.756,因此该任务集在固定优先级调度下是可调度的。但需要注意的是,这个计算假设所有任务都是独立的,且没有共享资源导致的优先级反转。若多个任务共享 I2C 总线或 SPI 总线,则需要引入互斥锁,这会增加阻塞时间,必须在 WCET 中体现。

3.3 实时性与功耗的权衡:能量-延迟积

实时性与功耗的权衡是 TinyML 调度设计的核心矛盾。缩短采样周期可以提高系统的响应速度和信号保真度,但代价是更高的功耗。反之,延长采样周期可以降低功耗,但可能错过重要的瞬态事件或导致信号混叠。为了量化这种权衡,工程上引入能量-延迟积(Energy-Delay Product, EDP)作为优化目标。EDP = E_total × T_response,其中 E_total 为一个采样周期内的总能耗,T_response 为从事件发生到系统响应的延迟。

总能耗 E_total 由三部分组成:活跃能耗 E_active(传感器采样 + 处理器计算 + 通信发送)、休眠能耗 E_sleep(漏电流 + 低功耗定时器)、唤醒能耗 E_wake(时钟启动 + 电源稳定 + ADC 参考电压建立)。值得注意的是,E_wake 是一个固定开销,与采样周期无关。当采样周期 T_s 缩短时,单位时间内的唤醒次数增加,E_wake 在总能耗中的占比上升。例如,某 BLE 芯片的唤醒能耗为 5 μJ,若采样周期从 100 ms 缩短到 10 ms,则每秒的唤醒能耗从 50 μJ 增加到 500 μJ,增加了 10 倍。

因此,存在一个最优采样周期,使得 EDP 最小化。这个最优值可以通过对 EDP 关于 T_s 求导并令其为零来获得。简化模型下,若活跃功耗为 P_active,休眠功耗为 P_sleep,唤醒能耗为 E_wake,则平均功耗 P_avg = (P_active·C_i + E_wake + P_sleep·(T_s - C_i)) / T_s。对 T_s 求导可得最优周期 T_opt = sqrt((E_wake - P_sleep·C_i) / (P_active - P_sleep))。在实际工程中,由于 P_sleep 通常远小于 P_active,且 E_wake 远大于 P_sleep·C_i,最优周期近似为 T_opt ≈ sqrt(E_wake / P_active)。

工程经验公式:对于典型的 Cortex-M4 内核(活跃功耗约 10 mW @ 64 MHz)搭配 BLE 射频(发送功耗约 30 mW),若唤醒能耗 E_wake ≈ 8 μJ(包括 1 ms 的时钟稳定 + ADC 建立),则最优采样周期 T_opt ≈ sqrt(8e-6 / 0.04) ≈ 14 ms。这意味着采样周期在 10~20 ms 范围内,系统能获得较好的功耗与实时性平衡。若采样周期低于 5 ms,唤醒开销将主导功耗;若高于 100 ms,则可能丢失关键事件。

3.4 案例拆解:工业振动监测节点的采样周期设计

我们以一个实际的工业电机振动监测节点为例,完整展示采样周期的设计过程。该节点部署在工厂车间,用于监测电机轴承的早期故障。电机转速为 3000 RPM(50 Hz),轴承故障特征频率(BPFO)约为 4.3 倍转频,即 215 Hz。为了捕捉故障特征,需要至少 10 次谐波,因此信号最高频率 f_max ≈ 2.15 kHz。根据奈奎斯特定理,采样频率至少为 4.3 kHz,对应采样周期 T_s ≤ 232 μs。然而,这是纯信号处理视角的下限。

实际约束如下:传感器选用 ADXL357(MEMS 加速度计),其从休眠到数据稳定的时间为 0.8 ms;ADC 为内置 12 位逐次逼近型,转换时间 2 μs;处理器为 STM32L4(Cortex-M4 @ 80 MHz),执行一次 128 点 FFT 和特征提取需要 1.2 ms;BLE 发送 20 字节数据需要 2.5 ms(包括协议开销)。若采用连续采样模式,则每个周期的总执行时间 C_i = 0.8 + 0.002 + 1.2 + 2.5 = 4.502 ms。为了满足实时性,T_s 必须大于 4.502 ms,且预留 30% 余量,即 T_s ≥ 6.43 ms。

接下来考虑功耗约束。节点使用 500 mAh 的 CR2032 纽扣电池,目标寿命为 6 个月(约 180 天)。平均电流预算 I_avg = 500 mAh / (180 × 24 h) ≈ 0.116 mA。在 3.3 V 供电下,平均功耗预算为 0.383 mW。若采样周期为 10 ms,则每秒执行 100 次采样。每次采样的活跃能耗包括:传感器稳定 0.8 ms × 0.5 mA = 0.4 μAh,FFT 计算 1.2 ms × 6 mA = 2 μAh,BLE 发送 2.5 ms × 15 mA = 10.4 μAh,唤醒开销 0.5 μAh。单次采样总能耗约 13.3 μAh,每秒能耗 1.33 mAh,远超预算。因此,10 ms 周期不可行。

经过迭代,将采样周期调整为 50 ms,并采用两级采样策略:平时以 50 ms 周期进行低速特征提取(仅计算 RMS 和峰值),当检测到振动幅值超过阈值时,临时切换到 1 ms 周期进行 256 点高速采样,完成故障诊断后恢复低速模式。这样,正常工况下每秒能耗为 20 次 × 13.3 μAh = 0.266 mAh,加上休眠功耗 0.01 mAh,总计 0.276 mAh,低于 0.383 mAh 的预算。最终节点在 6 个月测试中,电池剩余容量 18%,满足设计要求。

关键教训:在本案例中,如果直接采用信号带宽决定的 232 μs 采样周期,系统将因功耗过高而无法工作。正确的做法是:先计算信号约束的最小周期,再计算功耗约束的最大周期,最后在两者之间寻找满足可调度性的最优值。两级采样策略是 TinyML 中常用的折中方案——用慢速采样保证平均功耗,用突发快速采样保证瞬态事件的捕获。

3.5 常见误区与设计复盘

在周期性采样任务的设计中,工程师常犯以下四类错误。第一类是忽略唤醒开销,只计算活跃功耗而忘记每次唤醒的固定能量消耗。这会导致理论功耗远低于实测值,尤其在采样周期较短时,唤醒开销可能占总能耗的 50% 以上。第二类是将 WCET 等同于典型执行时间,没有考虑最坏情况下的中断嵌套、总线仲裁和缓存未命中。正确的做法是使用逻辑分析仪或硬件跟踪工具测量多次执行时间,取最大值并加上 20% 的安全裕量。

第三类错误是盲目追求高采样率,认为采样率越高越好。实际上,过高的采样率不仅增加功耗,还会产生大量冗余数据,增加处理器的计算负担和无线传输的带宽需求。对于缓慢变化的信号(如温度、湿度),采样周期可以长达数秒甚至数分钟。第四类错误是没有考虑任务间的相互干扰,例如两个采样任务共享 I2C 总线时,一个任务的执行时间会因为另一个任务占用总线而显著增加。解决方法是使用资源预留或优先级继承协议。

复盘整个设计流程,可以总结出以下可复用的步骤:第一步,明确信号的物理带宽和传感器建立时间,确定采样周期的下限;第二步,测量或估算各子任务的 WCET,包括传感器读取、信号处理、通信发送;第三步,根据电池容量和寿命目标计算平均功耗预算,推导采样周期的上限;第四步,在上下限之间选择初始周期,并使用可调度性分析验证;第五步,在真实硬件上测量功耗和响应延迟,迭代调整周期。这个流程确保了采样周期既满足信号保真度,又满足功耗预算,同时保证任务可调度。

设计建议:在 TinyML 项目中,建议为采样任务建立一张“周期-功耗-延迟”对照表,通过实际测量绘制曲线。通常,功耗随周期缩短呈近似反比关系,而延迟随周期缩短呈线性下降。选择曲线拐点附近的周期值,往往能获得最佳的性价比。此外,利用 MCU 的低功耗定时器(LPTIM)实现异步唤醒,可以避免主 CPU 频繁唤醒,进一步降低功耗。