在RTOS中,信号量(Semaphore)和互斥锁(Mutex)在ISR中的使用有严格限制:信号量通常允许在ISR中通过`xSemaphoreGiveFromISR`释放(带上下文切换请求),但获取操作(`xSemaphoreTake`)绝不能在ISR中阻塞;互斥锁则完全禁止在ISR中使用,因为其优先级继承机制依赖任务调度,且操作可能阻塞。为降低延迟,推荐使用任务通知(Task Notification)替代:任务通知是轻量级的,直接向目标任务发送32位值或事件位,无需内核对象,且`xTaskNotifyFromISR`在ISR中可安全调用,开销远小于信号量。实操建议:在ISR中仅做标记或数据传递,使用`xTaskNotifyFromISR`并设置`eSetBits`或`eIncrement`,然后通过`portYIELD_FROM_ISR`触发调度,确保高优先级任务立即响应。若需计数或同步,可用任务通知的计数功能(`ulTaskNotifyTake`),但注意其无优先级继承,适用于无共享资源保护的场景。
mcuku 阿沐 · 2026-08-27