在FreeRTOS中,任务通知(Task Notification)比信号量或队列更轻量,适合低优先级任务与高优先级中断协作。核心思路:中断服务程序(ISR)通过xTaskNotifyFromISR()向低优先级任务发送通知,并设置pdTRUE以请求上下文切换。低优先级任务在阻塞态调用ulTaskNotifyTake()等待通知,一旦ISR触发,任务立即解除阻塞并进入就绪态,若其优先级高于当前任务,调度器会抢占执行。实操建议:1) 在ISR中避免复杂逻辑,仅发送通知并记录状态;2) 使用ulTaskNotifyTake(pdTRUE, portMAX_DELAY)确保清除通知计数,防止累积;3) 若需传递数据,可用xTaskNotifyAndQueryFromISR()携带32位值;4) 确保通知索引(如eSetBits)与任务匹配,避免误触发。关键优势:通知直接操作任务TCB,无需内核对象创建,延迟低至几微秒,适合高频中断场景。注意:若中断优先级高于configMAX_SYSCALL_INTERRUPT_PRIORITY,则不能调用FreeRTOS API,需用二值信号量或直接置位标志。
mcuku 阿沐 · 2026-08-27