先确保 SystemView 能拿到完整事件流:在 RTOS 配置里打开 trace 支持(如 FreeRTOS 的 configUSE_TRACE_FACILITY、configUSE_SEGGER_SYSTEMVIEW),把 SEGGER_SYSVIEW_Config_FreeRTOS.c 加入工程,并在 SysTick 或专用定时器里调用 SEGGER_SYSVIEW_Interrupt。定位优先级反转:在 SystemView 时间线上观察高优先级任务被中优先级任务抢占、低优先级任务持锁不放的三角关系;重点看互斥量/信号量的 Take 与 Give 事件,若低优先级任务在临界区被中优先级任务长期抢占,即典型反转。解决上优先用优先级继承互斥量(xSemaphoreCreateMutex),必要时用优先级天花板。定位栈溢出:SystemView 本身不直接报栈水位,但可结合 RTOS 的 uxTaskGetStackHighWaterMark 或 SEGGER 的栈填充模式,在任务切换事件里观察异常跳转、HardFault 前后任务;更直接的是在 SystemView 里看任务被异常终止或反复重启。实操建议:先只开任务切换和 API 事件,降低开销;再开中断和互斥量事件复现问题;最后用 SystemView 的缩放和搜索功能锁定时间窗口,配合 RTT 打印栈水位,形成闭环。
mcuku 阿沐 · 2026-09-20