任务通知
- 什么是任务通知
FreeRTOS 从 V8.2.0 版本开始提供任务通知这个功能,每个任务都有一个 32 位的通知值,在大多数情况下,任务通知可以替代二值信号量、计数信号量、事件组,也可以替代长度为 1 的队列(可以保存一个 32位整数或指针值)。
configUSE_TASK_NOTIFICATIONS 设置为 1。
任务通知的控制块
这个任务控制块的结构体与任务创建的结构是一样的。
相当于在创建任务的时候,任务通知也相对应的创建了
- 任务通知的值,可以保存一个32位的整数值,也可以是一个指针
- 用于任务通知的状态,用于标志任务是否在等待通知
- API函数
发送任务通知函数
xTaskGenericNotify() 发送任务通知函数(这是通用的在任务中发送任务通知的API函数)
下边的三个函数只是是更新值得方式不同
xTaskNotifyGive()
xTaskNotify()
xTaskNotifyAndQuery()
xTaskNotifyAndQuery() 比xTaskNotify() 多了一个参数(用于回传上一个通知值)
(获取)接收任务通知函数
ulTaskNotifyTake() 主要用于二值信号量和计数信号量得使用
xTaskNotifyWait() 用于通用型得全功能得获取任务通知(消息队列,二值信号量、计数信号量、事件组)
发送任务通知函数 xTaskGenericNotify()
- 被通知的任务的句柄,发送给谁,就是谁的任务句柄
- 发送的通知值
- 一个枚举类型,指定更新值的一个类型,可以看最上边的任务通知的介绍里边的
- 用于任务原本的通知值得保存,可以传入一个变量,来保存原本的任务通知值
中断中发送任务通知通用函数 xTaskGenericNotifyFromISR()
xTaskNotifyGive() 可以用于二值信号量或计数信号量得一种轻量级得应用
对象任务在等待通知得时候要用take,而不是使用wait
可以看到是一个宏定义,引用的是通用得那个函数
vTaskNotifyGiveFromISR()
vTaskNotifyGiveFromISR()是 vTaskNotifyGive()的中断保护版本
xTaskNotify() 当成事件组来使用
下边这是最后一个参数可取得值
xTaskNotifyFromISR()
xTaskNotifyFromISR()是 xTaskNotify()的中断保护版本。
xTaskNotifyAndQuery()
xTaskNotifyAndQueryFromISR()
接收任务通知函数
ulTaskNotifyTake()
主要用于二值信号量和计数信号量
xTaskNotifyWait()
通用得全功能的获取任务通知