在RTOS中,信号量(Semaphore)和互斥量(Mutex)在ISR内使用时,优先级反转是核心陷阱。信号量允许任务阻塞,但ISR中不能阻塞,因此需用非阻塞API(如xSemaphoreGiveFromISR),且信号量无优先级继承,高优先级任务可能被低优先级任务长期阻塞。互斥量虽支持优先级继承,但在ISR内使用会引发致命问题:ISR无法被阻塞,若尝试获取互斥量(如xSemaphoreTake),会导致系统崩溃或未定义行为。应对策略:1)ISR内严禁获取互斥量,仅用信号量或直接通知(TaskNotify)做事件传递;2)若必须保护共享资源,在ISR中仅标记标志,由任务上下文处理互斥;3)使用优先级继承的互斥量时,确保所有获取操作在任务中完成,并通过队列或事件组将ISR数据延迟处理。实操建议:设计时明确ISR职责为“最小化”,仅做快速通知,资源访问移至任务层,并用xHigherPriorityTaskWoken参数触发上下文切换。
mcuku 阿沐 · 2026-08-27