在高频中断场景下,选型需权衡实时性、数据吞吐与代码复杂度。信号量(Semaphore)本质是计数器,用于任务间同步,其操作(give/take)通常为O(1),中断中可安全调用give(如xSemaphoreGiveFromISR),但需注意优先级反转问题,且无法传递数据。互斥锁(Mutex)用于保护共享资源,支持优先级继承,但操作开销略高于信号量(涉及所有权和优先级调整),且禁止在中断中直接使用(需通过信号量或队列间接处理),因此高频中断下不推荐直接使用。消息队列(Queue)可携带数据,适合中断向任务传递事件或数据块,其发送(xQueueSendFromISR)在中断中安全,但涉及内存拷贝(若传指针则开销小),吞吐受队列深度和拷贝大小影响。性能对比:信号量最快(仅计数),互斥锁次之(含优先级逻辑),队列最慢(含拷贝和内存管理)。选型依据:若仅需唤醒任务,用信号量;若需传递少量数据,用队列(传指针减少拷贝);若保护共享资源,用互斥锁(但中断中改用信号量+任务内加锁)。实操建议:高频中断下,优先用信号量或队列的FromISR版本,避免在中断中做复杂操作;若数据量大,考虑DMA或双缓冲。
mcuku 阿沐 · 2026-08-27