先确认是否真发生优先级反转:用高优先级任务打GPIO翻转,示波器测其被低优先级任务阻塞的时长;若阻塞时间与低优先级临界区长度相关,即命中。排查路径:1) 检查configMAX_SYSCALL_INTERRUPT_PRIORITY与configKERNEL_INTERRUPT_PRIORITY设置,NVIC中FreeRTOS可管理的中断优先级数值必须≥该阈值,否则ISR调用FromISR API会破坏临界区。2) 检查taskENTER_CRITICAL嵌套:FreeRTOS用uxCriticalNesting计数,若在ISR中误用taskENTER_CRITICAL而不配对,嵌套计数失衡,调度器长期关中断。3) 确认互斥量用xSemaphoreCreateMutex而非二值信号量,前者支持优先级继承;若用信号量,低优先级持锁时高优先级任务会被中优先级任务抢占,形成反转。4) 检查vTaskSuspendAll与临界区混用,挂起调度器不等于关中断,ISR仍可唤醒任务但无法切换。实操:在临界区入口记录uxCriticalNesting与当前任务句柄,串口输出;用Tracealyzer或SEGGER SystemView抓取阻塞链,定位持锁任务。修复:缩短临界区、用互斥量、统一中断优先级分组为NVIC_PRIORITYGROUP_4,并确保所有调用FreeRTOS API的ISR优先级低于阈值。
mcuku 阿沐 · 2026-10-10