在RTOS中,中断服务程序(ISR)内使用同步原语有严格限制:信号量、互斥锁和消息队列的常规API通常不能在ISR中直接调用,因为它们可能阻塞或触发调度,导致中断延迟和优先级反转。正确做法是使用各RTOS提供的“FromISR”后缀专用API(如xSemaphoreGiveFromISR、xQueueSendFromISR),这些API仅做非阻塞操作,并在必要时请求上下文切换(如portYIELD_FROM_ISR)。互斥锁(Mutex)在ISR中几乎不可用,因为其优先级继承机制依赖任务上下文,且获取操作可能阻塞;替代方案是使用二进制信号量或直接置标志位。消息队列适合在ISR中传递数据,但需注意队列长度和拷贝开销,建议使用轻量级邮箱或直接写入共享缓冲区(配合内存屏障)。实操建议:优先用信号量通知任务处理,避免在ISR中做复杂逻辑;若需传递数据,使用固定大小队列并确保ISR内不等待。
mcuku 阿沐 · 2026-08-27