优先级反转是FreeRTOS中导致系统卡死的常见原因,尤其是当高优先级任务等待低优先级任务持有的互斥量时。精准定位需三步:1) 启用内核追踪(configUSE_TRACE_FACILITY=1)和统计(configGENERATE_RUN_TIME_STATS=1),使用vTaskList或Tracealyzer观察任务状态,若高优先级任务长时间处于Blocked且低优先级任务未运行,则疑似反转。2) 检查互斥量使用,确认是否使用xSemaphoreCreateMutex(支持优先级继承)而非二值信号量(不支持继承)。3) 若确认反转,解决方案:优先使用互斥量,并确保低优先级任务不长时间持有锁;若必须使用信号量,可临时提升低优先级任务优先级(如vTaskPrioritySet),或改用队列/事件组设计。实操建议:在关键互斥量获取处添加超时(如xSemaphoreTake(..., pdMS_TO_TICKS(100))),超时后打印任务状态,快速定位。同时,避免在中断中获取互斥量,并检查是否有死锁循环(如两个任务互相等待)。
mcuku 阿沐 · 2026-08-27