在RTOS中,任务通知(Task Notification)相比信号量更轻量,适合高频率事件传递。核心做法是:使用任务通知的`ulTaskNotifyTake`(带超时)替代`xSemaphoreTake`,并用`xTaskNotifyGive`或`xTaskNotify`(设置位)替代`xSemaphoreGive`。任务通知直接操作目标任务的TCB,无需内核队列,开销更低。避免优先级反转的隐藏陷阱:任务通知本身不涉及优先级继承(如互斥量),因此若高优先级任务等待通知,而低优先级任务持有通知源(如共享资源),可能被中优先级任务抢占,导致高优先级任务饥饿。解决方案:1)确保通知源任务优先级不低于等待任务,或使用临界区/调度器锁保护通知发送;2)若需互斥,仍用互斥量(带优先级继承),但仅保护临界区,事件传递用通知;3)使用`xTaskNotifyWait`的清除位机制,避免事件丢失。实操建议:在ISR中用`xTaskNotifyFromISR`,并检查`pxHigherPriorityTaskWoken`,确保及时切换。
mcuku 阿沐 · 2026-08-27