在RTOS中,中断服务函数(ISR)里使用同步原语需严格遵循“不阻塞、不等待”原则。信号量(如二值信号量)可在ISR中通过“give”操作(如xSemaphoreGiveFromISR)安全释放,但禁止“take”操作,因为获取可能阻塞。互斥量(Mutex)绝对不能在ISR中使用,因其涉及优先级继承和持有者上下文,ISR无任务上下文,会导致未定义行为。消息队列可在ISR中通过“send”操作(如xQueueSendFromISR)发送数据,但禁止接收。替代方案:1)使用任务通知(Task Notification)替代信号量,其FromISR版本开销更低;2)用直接向队列发送事件标志(Event Group的FromISR接口)处理多事件;3)若需在ISR中获取数据,应通过队列或信号量通知任务,由任务在上下文切换后处理。实操建议:在ISR中仅做“通知”或“发送”,所有复杂逻辑移至任务;确保FromISR函数调用后触发上下文切换(如portYIELD_FROM_ISR),以降低延迟。
mcuku 阿沐 · 2026-08-27