在RTOS中,中断服务程序(ISR)内使用同步原语需严格遵循“仅允许无阻塞操作”原则。信号量:ISR中只能调用“give”类函数(如xSemaphoreGiveFromISR),且需检查返回值并触发任务切换(portYIELD_FROM_ISR),禁止“take”以避免阻塞。互斥锁:绝对禁止在ISR中使用,因其涉及优先级继承和阻塞等待,可能导致系统崩溃或死锁;若需保护共享资源,应使用关中断或专用无锁机制。消息队列:ISR中仅允许“send”类函数(如xQueueSendFromISR),且队列需预分配空间,禁止接收。常见死锁案例:1) ISR中尝试获取互斥锁,而持有锁的任务被更高优先级任务抢占,导致ISR无限等待;2) 两个ISR或任务间循环等待信号量,且未使用超时参数;3) 在ISR中调用阻塞API(如vTaskDelay),直接触发断言或系统挂起。实操建议:在ISR中仅使用“FromISR”后缀API,并确保所有共享数据通过关中断或原子操作保护;使用死锁检测工具(如FreeRTOS的configUSE_TIMERS)和超时机制(如xSemaphoreTake(..., timeout))降低风险。
mcuku 阿沐 · 2026-08-27