2、TinyML基础回顾:微控制器资源限制、典型工作负载(采样、推理、通信)及实时性要求

TinyML 的核心战场并非云端 GPU 集群,而是功耗受限、资源受限的微控制器(MCU)。在讨论任务优先级设计之前,必须首先建立对 MCU 硬件底座的清晰认知:它有多少内存、多少算力、多少存储,以及这些资源如何约束采样、推理和通信三大典型工作负载。本章将系统梳理 MCU 的资源边界、三类负载的特征与实时性要求,并给出一个可量化的资源评估框架,为后续章节的任务调度与优先级设计奠定基础。

MCU 资源约束与 TinyML 工作负载关系图 MCU 核心资源 • 闪存:256KB ~ 2MB • SRAM:16KB ~ 512KB • 主频:16 ~ 240 MHz • 外设:ADC/DAC/UART/SPI/I2C • 功耗:mW 级(活跃) 采样 (Sensing) ADC/传感器读取,周期性触发 数据量:10~100 KB/s 推理 (Inference) CNN/RNN 前向计算 计算量:1~100 MFLOPs 通信 (Communication) BLE/WiFi/UART 数据传输 速率:1 Kbps ~ 2 Mbps 实时性要求 硬实时(采样) • 采样周期抖动 < 5% • 中断响应延迟 < 10 μs 软实时(推理) • 推理完成时间可预测 • 允许偶发超时,但需统计 弱实时(通信) • 数据包可缓冲重传 • 延迟容忍度:ms ~ s 级 资源约束 → 工作负载特征 → 实时性分级 → 优先级设计 关键瓶颈:SRAM 容量决定模型规模与批处理能力;主频决定推理延迟;外设中断优先级决定采样实时性

2.1 微控制器的资源限制:理解硬件天花板

微控制器与通用处理器(如 x86/ARM Cortex-A 系列)的本质差异在于资源量级。一颗典型的 TinyML 级 MCU(如 STM32L4、ESP32-S3、nRF52840)通常具备以下特征:闪存(Flash)用于存储程序代码和静态模型参数,容量在 256KB 到 2MB 之间;静态随机存取存储器(SRAM)用于运行时数据、中间激活值和堆栈,容量仅为 16KB 到 512KB;CPU 主频在 16MHz 到 240MHz 之间,且多为单核或双核 Cortex-M 系列;外设接口包括 ADC、DAC、UART、SPI、I2C、PWM、DMA 等,但数量有限。

这些资源限制直接决定了 TinyML 系统的设计边界。以 SRAM 为例,一个 100KB 的量化模型(int8)在推理过程中,中间激活值可能额外占用 20~50KB 的 SRAM。如果 MCU 仅有 64KB SRAM,那么留给采样缓冲区和通信协议栈的空间就非常有限。因此,资源预算(Memory Budget)是任务优先级设计的第一约束条件。

资源类型 典型范围 对任务优先级的影响
闪存 (Flash) 256KB ~ 2MB 决定模型大小与代码复杂度;模型过大需分块加载,影响推理任务调度
SRAM 16KB ~ 512KB 决定采样缓冲区深度、推理中间激活值上限、通信协议栈内存占用
CPU 主频 16 ~ 240 MHz 决定单次推理耗时;主频低时推理任务需拆分为多个时间片
外设中断 NVIC 支持 16~64 个中断 采样任务通常绑定高优先级中断,需预留足够中断优先级层级
DMA 通道 2~12 个 采样数据搬运可借助 DMA 减轻 CPU 负担,但 DMA 通道数量有限
常见误区:许多开发者将 PC 端深度学习的内存管理思维直接移植到 MCU 上,试图在推理前一次性加载整个模型到 SRAM。实际上,MCU 的 SRAM 往往无法容纳完整模型,必须采用流式推理(Streaming Inference)或模型分块(Model Partitioning)策略,这直接影响推理任务的优先级划分——推理任务可能需要被拆分为多个子任务,穿插在采样间隙执行。

2.2 典型工作负载一:采样(Sensing)——硬实时约束

采样任务负责从传感器(加速度计、麦克风、温湿度传感器、光传感器等)读取原始数据。采样具有周期性和硬实时特征:如果采样周期发生抖动或延迟,会导致信号失真、频谱混叠或事件漏检。例如,在振动监测中,以 1kHz 采样率采集加速度数据,若某次采样延迟超过 100μs,则可能丢失关键的冲击峰值。

采样任务的关键参数包括:采样率(Sampling Rate)、采样分辨率(ADC 位数)、通道数和缓冲区深度。采样数据通常通过 DMA 搬运到 SRAM 缓冲区,当缓冲区半满或全满时触发中断,通知 CPU 进行数据处理。在任务优先级设计中,采样中断应设置为最高优先级,因为数据丢失不可恢复。

采样任务设计要点:
  • 使用 DMA + 双缓冲(Double Buffering)机制,避免 CPU 频繁介入数据搬运。
  • 采样中断服务函数(ISR)应保持极短执行时间(< 10μs),仅做数据标记和缓冲区切换。
  • 采样率与缓冲区大小需匹配:缓冲区应能容纳至少一个完整推理窗口的数据(如 256 个采样点)。
  • 若使用多个传感器,需考虑 ADC 采样通道的切换时间(通常为 1~5μs)。

2.3 典型工作负载二:推理(Inference)——软实时约束

推理任务是对采样数据进行模型前向计算,输出分类结果、回归值或检测框。推理具有计算密集和软实时特征:推理延迟需要可预测,但偶发的超时(如 10~20ms)通常不会导致灾难性后果,只会影响系统响应速度。推理任务通常由 RTOS 任务或裸机主循环中的函数调用触发。

推理任务的资源消耗主要体现在三个方面:模型参数存储(Flash)、中间激活值(SRAM)和计算时间(CPU 周期)。以 MobileNetV1 的量化版本为例,输入 32×32×3 的图像,模型大小约 0.5MB,单次推理在 80MHz Cortex-M4 上约需 300~500ms。这意味着在 1 秒的采样窗口内,推理任务可能占用 30~50% 的 CPU 时间。

// 推理任务优先级设计示例(基于 FreeRTOS)
// 采样任务:最高优先级,硬实时
#define TASK_PRIO_SENSING   (configMAX_PRIORITIES - 1)
// 推理任务:中等优先级,软实时
#define TASK_PRIO_INFERENCE (configMAX_PRIORITIES - 2)
// 通信任务:最低优先级,弱实时
#define TASK_PRIO_COMM      (configMAX_PRIORITIES - 3)

// 推理任务可被采样任务抢占,但不会被通信任务抢占
void inference_task(void *arg) {
    while (1) {
        // 等待采样缓冲区满
        xSemaphoreTake(infer_sem, portMAX_DELAY);
        // 执行推理(可被采样中断打断)
        float *result = model_predict(input_buffer);
        // 将结果放入输出队列
        xQueueSend(result_queue, result, 0);
    }
}

2.4 典型工作负载三:通信(Communication)——弱实时约束

通信任务负责将推理结果或原始数据传输到上位机、云端或其他设备。通信具有突发性和弱实时特征:数据包可以缓冲、重传,延迟容忍度从毫秒到秒级不等。常见的通信方式包括 UART(115200bps~2Mbps)、SPI(最高 40Mbps)、I2C(400Kbps~1Mbps)、BLE(2Mbps 物理层速率)和 WiFi(802.11n 可达 150Mbps)。

通信任务的优先级通常最低,原因有三:第一,通信数据可以暂存于 SRAM 或 Flash 的环形缓冲区中;第二,通信协议栈(如 BLE 协议栈)本身具有流控和重传机制;第三,通信任务往往阻塞在等待发送完成或等待接收数据,不会持续占用 CPU。然而,通信任务也需注意缓冲区溢出问题:如果推理结果产生速度大于通信发送速度,需要设计背压机制(如丢弃旧数据或降低采样率)。

工作负载 实时性类型 典型延迟要求 优先级建议 资源消耗特征
采样 硬实时 周期抖动 < 5%,中断延迟 < 10μs 最高(中断级) 低 CPU,高 DMA 占用,固定 SRAM 缓冲区
推理 软实时 单次推理延迟可预测,允许偶发超时 中高(RTOS 任务) 高 CPU,高 SRAM(激活值),Flash 存储模型
通信 弱实时 延迟容忍 ms~s 级,可重传 低(RTOS 任务) 中 CPU(协议栈),中 SRAM(缓冲区),外设占用

2.5 实时性要求与任务优先级映射

实时性要求是任务优先级设计的核心依据。在 TinyML 系统中,通常采用固定优先级抢占式调度(如 FreeRTOS、Zephyr、RT-Thread)。优先级映射遵循以下原则:

  1. 中断优先级 > RTOS 任务优先级:采样任务通常绑定在定时器中断或 DMA 中断中,其优先级高于任何 RTOS 任务。
  2. 硬实时任务 > 软实时任务 > 弱实时任务:推理任务优先级高于通信任务,但低于采样中断。
  3. 短任务优先:如果两个任务具有相同的实时性等级,优先执行执行时间短的任务,以减少对高优先级任务的阻塞时间。
  4. 考虑优先级反转:当低优先级任务持有高优先级任务需要的资源时,需使用优先级继承或互斥信号量。
经验建议:在 Cortex-M 系列 MCU 上,建议将采样中断设置为最高中断优先级(如 0 或 1),推理任务设置为 RTOS 最高任务优先级,通信任务设置为最低任务优先级。同时,为推理任务预留一个看门狗定时器,若推理超时(如超过 2 倍预期时间),则强制跳过本次推理并复位任务状态,避免影响后续采样。

2.6 案例拆解:可穿戴 ECG 监测设备的任务优先级设计

下面通过一个可穿戴 ECG(心电图)监测设备案例,完整展示资源评估与优先级设计过程。

背景与约束:设备基于 nRF52840 MCU(Cortex-M4F @ 64MHz,1MB Flash,256KB SRAM),使用 BLE 通信。ECG 采样率为 500Hz,ADC 为 12 位,单通道。推理模型为 1D CNN(量化 int8),模型大小 80KB,单次推理需 45ms CPU 时间。BLE 每 100ms 发送一次数据包(包含 50 个采样点 + 1 个推理结果)。

初始现象:在原型测试中,发现 BLE 通信偶尔导致采样数据丢失,且推理结果延迟不稳定(有时 50ms,有时 120ms)。

分析过程:

  • 采样缓冲区:500Hz × 2 字节 × 0.1s = 100 字节/100ms,使用双缓冲共 200 字节,SRAM 占用可忽略。
  • 推理任务:45ms CPU 时间,在 64MHz 下约占用 2.88M 周期。若采样中断每 2ms 触发一次(500Hz),每次中断服务约 5μs,则采样中断总开销为 0.25% CPU,可忽略。
  • BLE 协议栈:nRF52840 的 SoftDevice 协议栈占用约 60KB SRAM 和 120KB Flash,且 BLE 事件(连接事件、广播事件)具有较高中断优先级。

问题根因:BLE 协议栈的中断优先级默认设置为 3(在 nRF 系列中,SoftDevice 使用中断优先级 3 和 4),而采样 DMA 中断优先级设置为 5。当 BLE 事件密集时,BLE 中断会抢占采样 DMA 中断,导致采样数据丢失。

解决方案:

  1. 将采样 DMA 中断优先级提升至 2(高于 BLE 协议栈的 3),确保采样实时性。
  2. 推理任务优先级设置为 4(RTOS 任务最高),通信任务优先级设置为 6(最低)。
  3. 推理任务中增加超时保护:若推理超过 60ms,则丢弃本次结果并重新初始化模型状态。
  4. BLE 发送缓冲区从 200 字节增加到 400 字节,允许在推理任务执行期间缓存更多数据。

结果对比:调整后,采样数据丢失率为 0%,推理延迟稳定在 45~55ms 之间,BLE 通信成功率从 96.2% 提升至 99.8%。

复盘经验:在 MCU 上,中断优先级是比 RTOS 任务优先级更底层的调度机制。设计任务优先级时,必须同时考虑外设中断优先级和 RTOS 任务优先级,且要查阅芯片厂商提供的协议栈中断优先级占用表(如 Nordic 的 SoftDevice、ST 的 Cortex-M 内核优先级分组)。

2.7 常见误区与总结复盘

在 TinyML 任务优先级设计中,以下误区最为常见:

  • 误区一:所有任务都用 RTOS 任务实现。实际上,采样任务应尽量使用中断 + DMA 实现,避免 RTOS 任务切换带来的微秒级延迟。
  • 误区二:优先级越高越好。过高的优先级会导致低优先级任务饿死。例如,若推理任务优先级设置过高且推理时间过长,通信任务可能永远无法执行,导致数据积压。
  • 误区三:忽略中断嵌套和临界区。在采样中断中调用 RTOS API(如 xQueueSendFromISR)时,需确保中断优先级在 RTOS 可安全调用的范围内(通常为 configMAX_SYSCALL_INTERRUPT_PRIORITY 以下)。
  • 误区四:不进行资源预算评估。在编码前未计算 SRAM 占用、Flash 占用和 CPU 负载率,导致后期集成时资源不足,被迫降低采样率或模型精度。
总结:本章建立了 TinyML 任务优先级设计的资源基础框架。核心要点可归纳为:采样是硬实时,必须用中断保护;推理是软实时,需可预测且可超时恢复;通信是弱实时,可缓冲可重传。优先级设计应遵循“中断 > 硬实时任务 > 软实时任务 > 弱实时任务”的总体原则,同时结合具体 MCU 的中断优先级分组和协议栈占用情况做精细调整。下一章将在此基础上,深入讨论采样、推理和通信三类任务的具体协调策略与优先级反转解决方案。