在RTOS中,信号量(Semaphore)与互斥锁(Mutex)在ISR内的使用有本质区别:信号量无优先级继承,而互斥锁通常内置优先级继承机制。要彻底规避优先级反转,核心是:在ISR内严禁使用互斥锁(因ISR无任务上下文,无法阻塞),应改用信号量或直接通知任务。若必须保护共享资源,推荐在ISR中仅做标记(如置位事件标志),由高优先级任务在任务上下文中获取互斥锁并执行临界区。对于信号量场景,优先级反转无法通过继承消除,需设计为:ISR释放信号量后,由最高优先级等待任务立即运行,且该任务内部使用互斥锁保护资源,从而将继承机制转移到任务层。实操建议:1) 在FreeRTOS中,ISR内使用xSemaphoreGiveFromISR,并触发调度(portYIELD_FROM_ISR);2) 将临界区操作封装在任务中,用互斥锁(带优先级继承)保护;3) 避免在ISR中直接操作共享数据,采用队列或事件组传递。彻底规避需从架构上隔离ISR与任务资源访问,而非依赖锁本身。
mcuku 阿沐 · 2026-08-27