FreeRTOS——任务通知

一、任务通知

1.1 任务通知简介

任务通知:用来通知任务的,任务控制块中的结构体成员变量 ulNotifiedValue就是这个通知值

(1)使用队列、信号量、事件标志组时都需另外 创建一个结构体 ,通过中间的结构体进行间接通信

(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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值