2、TinyML基础回顾:微控制器资源限制、典型工作负载(采样、推理、通信)及实时性要求
TinyML 的核心战场并非云端 GPU 集群,而是功耗受限、资源受限的微控制器(MCU)。在讨论任务优先级设计之前,必须首先建立对 MCU 硬件底座的清晰认知:它有多少内存、多少算力、多少存储,以及这些资源如何约束采样、推理和通信三大典型工作负载。本章将系统梳理 MCU 的资源边界、三类负载的特征与实时性要求,并给出一个可量化的资源评估框架,为后续章节的任务调度与优先级设计奠定基础。
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 通道数量有限 |
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)。优先级映射遵循以下原则:
- 中断优先级 > RTOS 任务优先级:采样任务通常绑定在定时器中断或 DMA 中断中,其优先级高于任何 RTOS 任务。
- 硬实时任务 > 软实时任务 > 弱实时任务:推理任务优先级高于通信任务,但低于采样中断。
- 短任务优先:如果两个任务具有相同的实时性等级,优先执行执行时间短的任务,以减少对高优先级任务的阻塞时间。
- 考虑优先级反转:当低优先级任务持有高优先级任务需要的资源时,需使用优先级继承或互斥信号量。
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 中断,导致采样数据丢失。
解决方案:
- 将采样 DMA 中断优先级提升至 2(高于 BLE 协议栈的 3),确保采样实时性。
- 推理任务优先级设置为 4(RTOS 任务最高),通信任务优先级设置为 6(最低)。
- 推理任务中增加超时保护:若推理超过 60ms,则丢弃本次结果并重新初始化模型状态。
- 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 负载率,导致后期集成时资源不足,被迫降低采样率或模型精度。