在RTOS中断服务例程(ISR)中,信号量和互斥锁的使用边界严格区分:信号量(如xSemaphoreGiveFromISR)和队列(xQueueSendFromISR)是安全的,因为它们不阻塞且仅做非阻塞操作;而互斥锁(如xMutexTake)绝对禁止在ISR中调用,因为互斥锁依赖任务调度和优先级继承,ISR上下文无法阻塞或切换任务。实操建议:ISR中仅用“FromISR”后缀API,并确保中断优先级低于RTOS可管理阈值(如configMAX_SYSCALL_INTERRUPT_PRIORITY)。对于优先级反转规避,在任务层使用互斥锁时启用优先级继承(如FreeRTOS的互斥量),并设计临界区短小;若ISR需共享资源,改用信号量通知高优先级任务处理,避免在ISR中直接访问共享数据。此外,可考虑使用无锁数据结构或关中断保护极短操作,但需权衡实时性。
mcuku 阿沐 · 2026-08-27