任务通知简介:
def: 任务通知是用来通知任务的,任务控制块中的结构体成员变量ulNotifiedValue就是这个通知值。
任务通知的内存消耗比较小
- 1: 使用队列,信号量,时间标志组都需要另外创建结构体,通过中间结构体进行间接通信。
- 2:使用任务通知时,任务结构体TCB中就包含了内部对象,可以直接接收别人发送过来的通知。
任务通知值的更新方式
- 1:不覆盖接收任务通知值
- 2:覆盖接收任务的通知值
- 3:更新接受任务通知值的一个或多个bit
- 4:增加接受任务的通知值
注:合理的利用任务通知的特点,可以在一些场合中替代队列,信号量,事件标志组
任务通知的优势和劣势
任务通知的优势:
- 1:效率更高,使用任务通知向任务发送事件或数据比使用队列事件标志组或信号量快得多。
- 2:使用内存更小,使用其他方法时都要先创建对应的结构体,使用任务通知时无需额外创建结构体。
任务通知劣势:
- 1:ISR中没有任务结构体,无法给ISR发送数据,但是ISR可以使用任务通知功能,发数据给任务
- 2:无法广播给多个任务,任务通知只能是被指定的一个任务接收处理
- 3:无法缓存多个数据,任务通知是通过更新任务通知值来发送数据的,任务结构体中只有一个任务通知值,只能保持一个数据
- 4:发送受阻不支持阻塞,发送方无法进入阻塞状态等待
任务通知状态栏:
任务都有一个结构体:任务控制块TCB,它里面有两个结构体成员变量
任务通知值:任务通知值的更新方式有多种类型
- 1:计数值(数值累加,类似信号量)
- 2:相应为设置为1(类似事件标志组)
- 3:任意数值(支持覆写和不覆写,类似队列)------》覆写有没有数值都能将数据写进去,不覆写--------》 有数值就写不进去。
任务的通知状态
任务通知状态的三种取值:
#define taskNot_WAITING_NOTIFICATION ((uint8_t)0) // 任务未等待通知
#define taskWAITING_NOTIFICATION ((uint8_t)1) // 任务在等待通知
#define taskNOTIFICATION_RECEIVED ((uint8_t)2) // 任务在等待接收
注:
- 1:任务未等待通知:任务通知默认的初始化状态
- 2:任务等待通知:接收方已经准备好(调用接收任务通知函数),等待发送方给个通知
- 3:任务等待接收:发送方已经发送出去(调用了发送任务通知函数),等待接收方接收
任务通知API函数:
任务通知API函数主要有两类:
- 1:发送通知
- 2:接受通知
注:发送通知API函数可以用于任务和中断服务函数中,接收通知API函数只能用在任务中。
发送通知相关API函数
函数 | 描述 |
xTaskNotify() | 发送通知,带有通知值 |
xTaskNotifyAndQuery() | 发送通知,带有通知值并且保留接收任务的原通知值 |
xTaskNotifyGive() | 发送通知,不带通知值 |
xTaskNotifyFromISR() | 在中断中发送任务通知 |
xTaskNotifyAndQueryFromISR() | |
vTaskNotifyGiveFromISR |
BaseType_t xTaskGenericNotify(
TaskHandle_t xTaskToNotify // 接收任务通知的任务句柄
UBaseType_t uxIndexToNotify // 任务的指定通知
uint32_t ulValue // 任务通知值
eNotifyAction eAction // 通知方式
pulPreviousNotificationValue // 用于保存更新前任务通知值
NULL表示不保存
)
形参 | 描述 |
xTaskToNotify | 接收任务通知的任务句柄 |
uxIndexToNotify | 任务的指定通知(任务通知相关数组) |
ulValue | 任务通知值 |
eAction | 通知方式 |
pulPreviousNotificationValue | 用于保存更新前任务通知值, NULL表示不保存 |
任务通知的几种方式
接收通知相关API函数
函数 | 描述 |
ulTaskNotifyTask() | 获取任务通知,可以设置在推出次函数的时候将任务通知值清零或者减去1 当任务通知用于二值信号量或者计数信号量时,使用此函数获取信号量 |
xTaskNotifyWait() | 获取任务通知,比ulTaskNotifyTak()更复杂,可以获取通知值和清除通知值 指定位 |
注:
- 1:当任务通知用作于信号量时,使用函数获取信号量:ulTaskNotifyTake()
- 2: 当任务通知作用于事件标志组或队列时,使用此函数来获取:xTaskNoyifyWait()
#define ulTaskNotifyTake( xClearCountOnExit , xTicksToWait )
ulTaskGenericNotifyTake( ( tskDEFAULT_INDEX_TO_NOTIFY),
( xClearCountOnExit ),
( xTicksToWait ) )
形参 | 描述 |
uxIndexToWaitOn | 任务的指定通知(任务通知相关数组成员) |
xClearCountOnExit | 指定在成功接收通知后,将通知值清0或则减1 pdTRUE:把通知值清0 pdFALSE:把通知值减1 |
xTicksToWait | 阻塞等待任务通知值的最大时间 |
返回值 | 描述 |
0 | 接收失败 |
非0 | 接收成功,返回任务通知的通知值 |
获取通知值/清除通知值的指定位置
#define xTaskNotifyWait
(
ulBitsToClearOnEntry,
ulBitsToClearOnExit,
pulNotificationValue,
xTicksToWait
)
xTaskGenericNotifyWait
(
tskDEFAULT_INDEX_TO_NOTIFY,
( ulBitsToClearOnEntry ),
( ulBitsToClearOnExit ),
( pulNotificationValue ),
( xTicksToWait )
)
返回值 ----------------------》
返回 pdTRUE 表示任务通知成功
返回 pdFALSE 表示等待任务通知失败
任务通知实验
1: 任务通知模拟信号量实验