在RTOS中,信号量超时等待与ISR释放信号量之间的时序漏洞,本质是任务在超时等待期间被ISR抢占,导致信号量状态与任务调度状态不一致。规避的核心是确保信号量操作(获取/释放)与任务状态切换的原子性。实操建议:1) 在任务侧,使用临界区(如`taskENTER_CRITICAL()`/`taskEXIT_CRITICAL()`)包裹信号量获取和超时判断,防止ISR在检查超时和挂起任务之间插入释放操作;2) 在ISR侧,使用调度器锁(如`vTaskSuspendAll()`/`xTaskResumeAll()`)延迟上下文切换,确保ISR释放信号量后,任务调度不会在临界区执行期间发生;3) 若使用FreeRTOS,可依赖`xSemaphoreTake`内部临界区,但需注意超时参数为0时,应显式关闭中断或使用`portSET_INTERRUPT_MASK_FROM_ISR()`保护。关键点:临界区保护共享资源,调度器锁保护任务切换,两者结合可消除竞态。
mcuku 阿沐 · 2026-08-27