在RTOS中,中断服务程序(ISR)中禁止使用阻塞型API,包括信号量、互斥量和消息队列的阻塞获取。信号量(如xSemaphoreGiveFromISR)和消息队列(如xQueueSendFromISR)有专门的FromISR版本,仅用于非阻塞发送/释放,且需检查返回值并触发调度器(如portYIELD_FROM_ISR)。互斥量(含优先级继承)严禁在ISR中使用,因为其可能阻塞且涉及调度器状态,ISR中无法安全处理。替代方案:1)使用二值信号量或事件标志组通知任务,配合任务级处理;2)使用队列的FromISR版本传递数据,但需确保缓冲区足够;3)对于紧急事件,直接置位标志位或使用任务通知(TaskNotify)的FromISR版本,开销更小。实操建议:在ISR中仅做最小化操作,将复杂逻辑推迟到高优先级任务中,并确保所有FromISR调用后检查返回值,必要时触发上下文切换。
mcuku 阿沐 · 2026-08-27