摘要: 工业编码器每 10μs 产生一次边沿中断,STM32F407 的 CPU 占用率飙到 80%,主控任务被压得只剩 20% 时间片,位置环抖动超过 50μs。这是典型的"中断风暴"问题——不是中断本身慢,是中断太频繁。本文用一个真实的编码器采集事故,建立高频中断的 CPU 占用模型,对比三种治理策略(提高中断效率、DMA 链、硬件 FIFO),并给出完整可移植的 DMA 链配置代码。实测把 CPU 占用从 80% 降到 5%,位置环抖动从 50μs 降到 3μs。
一、引子:一台"看起来没问题"的伺服驱动器
2024 年做一款伺服驱动器,主控 STM32F407 @168MHz,跑 FreeRTOS。系统三个任务:
抖动超预期 50% 以上。 更糟的是,用 FreeRTOS 的 vTaskGetRunTimeStats 看 CPU 占用:
Task CPU% PositionLoop 11% CurrentLoop 9% CommTask 2% IDLE 2% >>> ISR 76% ← 中断占用 76%!中断占用了 76% 的 CPU 时间。 主控任务加起来才 22%,IDLE 只剩 2%。</