第14章 任务通知TaskNotify
约 624 字大约 2 分钟
2026-01-19
14.1 概述
使用队列、信号量或事件组进行任务间通信需要通过中间对象, 发送任务写入通信对象,接收任务从通信对象读取:

使用任务通知进行任务间通信,发送任务直接向接收任务发送通知,而无需中间对象:

相关宏:
configUSE_TASK_NOTIFICATIONS 是否启动任务通知功能
configTASK_NOTIFICATION_ARRAY_ENTRIES 定义每个任务的任务通知数组大小,即每个任务支持的通知条目数相关函数
xTaskNotify() 发送通知,带有通知值
xTaskNotifyAndQuery() 发送通知,带有通知值并且保留接收任务的原通知值
xTaskNotifyGive() 发送通知,不带通知值
xTaskNotifyFromISR() 在中断中发送任务通知
xTaskNotifyAndQueryFromISR()
vTaskNotifyGiveFromISR()
ulTaskNotifyTake() 获取任务通知,可选退出函数时对通知置清零或减1
xTaskNotifyWait() 获取任务通知,可获取通知值和清除通知值的指定位14.2 任务通知模拟信号量(Semaphore)案例
案例需求:
task1:检测到按键 SW3 按下,向 task2 发送任务通知; 检测到按键 SW4 按下,向task3发送任务通知
task2:接收来自于 task1 的任务通知(模拟二进制信号量)。
task3:检测到按键 SW5 按下,接收来自于 task1 的通知,并打印通知值(模拟计数信号量)。所用函数:
xTaskNotifyGive() 发送通知,通知值+1(从0开始)
ulTaskNotifyTake() 获取任务通知,第一个参数:设置pdTRUE模拟二进制信号量(通知值清0),设置为pdFLASE模拟计数信号量(通知值-1)14.3 任务通知模拟消息队列(Mailbox,消息邮箱)案例
案例需求
task1:检测到按下按键 SW3,向 task2 发送任务通知,指定通知值。
task2:用于接收任务通知,获取通知值并打印。所用函数:
xTaskNotify() 发送通知,指定通知值
xTaskNotifyWait() 获取任务通知,可获取通知值和清除通知值的指定位14.4 任务通知模拟事件标志组(EventGroup)案例
案例需求
task1:用于按键扫描,SW3按下,BIT0置1; SW4按下,BIT1置1,SW5按下,BIT2置1,
task2:用于接收任务通知(只有BIT0、BIT1、BIT2全部置1),并打印相关提示信息。所用函数:
xTaskNotify() 发送通知,带有通知值
xTaskNotifyWait() 获取任务通知,可获取通知值和清除通知值的指定位