FANYI / 嵌入式单片机 / INTERVIEW 03
面试官给出三任务场景:低优先级任务占有I²C总线互斥锁,高优先级任务等待这把锁,另有中优先级任务持续运行。为什么高优先级任务反而可能长时间无法执行?
面试先给结论
互斥锁(mutex)主要用于保护共享资源,FreeRTOS互斥锁具有优先级继承机制;二值信号量更常用于任务同步或事件通知,通常不提供优先级继承。发生优先级反转时,低优先级任务占锁、高优先级任务阻塞,中优先级任务又抢占低优先级持锁者,使高优先级任务等待更久。

01先把三个任务的执行顺序讲明白
任务L先获取I²C设备互斥锁并进入临界区。随后高优先级任务H尝试取锁,因为L持有该锁而阻塞;此时中优先级任务M就绪,并不断抢占L,导致L迟迟不能释放锁。H虽然优先级更高,却间接被M影响,这就是经典优先级反转。
02互斥锁的优先级继承怎样缓解
如果L持有的是FreeRTOS互斥锁,H因该锁阻塞时,内核可临时提升L的有效优先级,使它尽快运行并释放锁,随后恢复优先级。它用于限制部分优先级反转的持续时间,并不意味着所有复杂嵌套锁和死锁都会被自动解决。
03为什么二值信号量不能随意替代互斥锁
二值信号量适合“中断通知任务”或“任务A通知任务B”这样的同步语义,允许由不同上下文给出与获取。互斥锁具有所有者语义,通常由取锁任务释放,且不应在ISR里使用。共享I²C总线、SPI总线或文件系统访问通常更适合用互斥锁保护,并缩短持锁区间。
04实际调试怎么看证据
通过STM32CubeIDE或Tracealyzer等工具查看任务状态、优先级、阻塞原因、持锁时间与事件序列。若高优先级任务延迟过长,先核对是否等待同一资源以及中优先级任务是否抢占;减少持锁期间的阻塞I/O,并在压力测试下验证。
面试中常见失分点
把二值信号量和互斥锁完全等同,忽略优先级继承与资源所有者语义。
认为用了互斥锁就彻底不可能出现优先级反转或死锁。
面试官可能继续追问
FreeRTOS互斥锁为什么不能在中断服务函数ISR中调用xSemaphoreTake()来等待?

扫码关注






























