一、任务通知
1.1 任务通知简介
任务通知:用来通知任务的,任务控制块中的结构体成员变量 ulNotifiedValue就是这个通知值
(2)使用任务通知时,任务结构体TCB中就包含了内部对象,可以直接接收别人发过来的"通知"
只要合理,灵活的利用任务通知的特点,可以在一些场合中替代队列、信号量、事件标志组
优点:
(1)效率高:使用任务通知向任务发送事件或数据比使用队列、事件标志组或信号量快得多
(2)占用内存更小:使用其他方法时都要先创建对应的结构体,使用任务通知时无需创建结构体
缺点:
(1)无法发送数据给中断:ISR没有任务结构体,所以无法给ISR发送数据。但是ISR可以使用任务通知的功能,发数据给任务。
(2)无法广播给多个任务:任务通知只能是被指定的一个任务接收并处理(一对一)
(3)无法缓存多个数据:任务通知是通过更新任务通知值来发送数据的,任务结构体中只有一个任务通知值,只能保持一个数据
(4)发送受阻不支持阻塞:发送方无法进入阻塞状态等待
1.2 任务通知值和通知状态
注:这两个成员变量均为数组
任务通知值:
任务通知状态:
二、相关API
任务通知API函数主要有两类:①发送通知 ,②接收通知
注意:发送通知API函数可以用于任务和中断服务函数中;接收 通知API函数只能用在 任务中。
(1)发送通知函数
函数 | 描述 |
xTaskNotify() | 发送通知,带有通知值 |
xTaskNotifyAndQuery() | 发送通知,带有通知值并且保留接收任务的原通知值 |
xTaskNotifyGive() | 发送通知,不带通知值,此函数会将接收任务的通知值加一,常用于信号量 |
xTaskNotifyFromISR() | 在中断中发送任务通知 |
xTaskNotifyAndQueryFromISR() | |
vTaskNotifyGiveFromISR() |
注:uxIndexToNotify:任务通知相关数组的成员,实际上就是TCB中任务通知数组的第一个元素(下标为0)
(2)接收通知
函数 | 描述 |
ulTaskNotifyTake() | 获取任务通知,可以设置在退出此函数的时候将任务通知值清零(模拟二值信号量)或者减一(模拟计数型信号量) 当任务通知用作二值信号量或者计数信号量的时候,使用此函数来获取信号量 |
xTaskNotifyWait() | 获取任务通知,比 ulTaskNotifyTak()更为复杂,可获取通知值和清除通知值的指定位 |
总结:
1. 当任务通知用作于信号量时,使用函数获取信号量:ulTaskNotifyTake()
2. 当任务通知用作于事件标志组或队列时,使用此函数来获取: xTaskNotifyWait()