在RTOS中,ISR内使用同步原语需严格区分。信号量(Semaphore)的‘give’操作(如xSemaphoreGiveFromISR)是安全的,因为它仅唤醒任务并置位,不涉及阻塞或调度,且不会引发优先级反转——优先级反转源于互斥锁的优先级继承机制,而信号量无所有权。互斥锁(Mutex)的‘give’在ISR内绝对禁止,因为其释放需检查持有者优先级并可能触发调度,且ISR上下文无法执行阻塞操作。安全调用边界:1)ISR内只能调用带‘FromISR’后缀的API(如xQueueSendFromISR、xSemaphoreGiveFromISR);2)禁止调用任何可能阻塞的API(如xSemaphoreTake);3)互斥锁的take/give均不可在ISR使用,改用二进制信号量模拟互斥。实操建议:若ISR需保护共享资源,应使用临界区(taskENTER_CRITICAL_FROM_ISR)或专用ISR安全队列,避免信号量。优先级反转仅在互斥锁场景出现,ISR内使用信号量不会引发,但需确保唤醒任务优先级高于被中断任务,否则可能延迟高优先级任务。
mcuku 阿沐 · 2026-08-27