在RTOS中,信号量超时等待(如xSemaphoreTake)与直接任务通知(如xTaskNotifyGive)在ISR中的延迟差异主要源于实现机制。信号量操作涉及内核对象(队列或信号量结构)的锁保护、等待列表遍历和调度器状态检查,尤其在多核或抢占式内核中,需禁用中断或自旋锁,导致额外开销。实测中,信号量在ISR到任务切换的延迟通常比任务通知高20-50%,因为任务通知是轻量级直接写入目标任务的控制块(TCB)字段,无需经过队列或信号量管理。实操建议:若ISR仅需唤醒单个任务且无需计数或互斥语义,优先使用任务通知;若需多任务同步或超时机制,则用信号量。测试时需关闭编译器优化并固定CPU频率,用逻辑分析仪或硬件定时器精确测量ISR入口到任务执行首条指令的时间差。注意,FreeRTOS中任务通知的ulTaskNotifyTake支持超时,但ISR内只能用xTaskNotifyFromISR,其延迟比give略高,因需检查通知值。
mcuku 阿沐 · 2026-08-27