优先级反转在FreeRTOS中通常由互斥量(Mutex)持有者被低优先级任务抢占,而高优先级任务等待导致。实战排查,先用vTaskList()打印任务状态,观察高优先级任务是否长期处于'Blocked'状态,而低优先级任务处于'Running'或'Ready'。若高优先级任务卡在互斥量上,vTaskList会显示其状态为'B'(阻塞),但无法直接看出等待的互斥量。此时需结合事件跟踪(如SystemView或FreeRTOS+Trace)捕获调度器事件,重点查看互斥量获取/释放事件。定位死锁:1. 在vTaskList输出中,若多个任务互相等待(如任务A持有Mutex1等Mutex2,任务B持有Mutex2等Mutex1),则死锁。2. 使用uxTaskGetStackHighWaterMark()检查低优先级任务栈是否溢出,导致异常。3. 启用互斥量优先级继承(configUSE_MUTEXES和configUSE_PRIORITY_INHERITANCE),可缓解反转,但需验证是否仍卡死。实操建议:在死锁发生时,通过调试器暂停,调用vTaskList()和vTaskGetRunTimeStats(),结合事件跟踪时间线,确认阻塞原因。若跟踪显示高优先级任务反复尝试获取互斥量但失败,而低优先级任务未释放,则反转确认。最终修复:调整优先级或使用临界区,或改用信号量(但信号量无继承)。
mcuku 阿沐 · 2026-08-27