Free RTOS:任务通知的两类函数

目录

1.xTaskNotifyGive/ulTaskNotifyTake

[在任务中使用 xTaskNotifyGive 函数,在 ISR 中使用 vTaskNotifyGiveFromISR 函数,都是直接给其他任务发送通知:](#在任务中使用 xTaskNotifyGive 函数,在 ISR 中使用 vTaskNotifyGiveFromISR 函数,都是直接给其他任务发送通知:)

可以使用ulTaskNotifyTake函数来取出通知值:

[使用 ulTaskNotifyTake 函数可以实现轻量级的、高效的二进制信号量、计数型信号量](#使用 ulTaskNotifyTake 函数可以实现轻量级的、高效的二进制信号量、计数型信号量)

这几个函数的原型如下:

xTaskNotifyGive函数的参数说明如下:

vTaskNotifyGiveFromISR函数的参数说明如下:

ulTaskNotifyTake函数的参数说明如下:

2.xTaskNotify/xTaskNotifyWait

[xTaskNotify 函数功能更强大,可以使用不同参数实现各类功能,比如:](#xTaskNotify 函数功能更强大,可以使用不同参数实现各类功能,比如:)

[xTaskNotify() 比 xTaskNotifyGive() 更灵活、强大,使用上也就更复杂](#xTaskNotify() 比 xTaskNotifyGive() 更灵活、强大,使用上也就更复杂)

[xTaskNotifyFromISR()是它对应的 ISR 版本](#xTaskNotifyFromISR()是它对应的 ISR 版本)

使用xTaskNotifyWait()函数!它比ulTaskNotifyTake()更复杂:

这几个函数的原型如下:

xTaskNotify函数的参数说明如下:

eNotifyAction参数说明:

[xTaskNotifyFromISR 函数跟 xTaskNotify 很 类 似 , 就 多 了 最 后 一 个 参 数pxHigherPriorityTaskWoken。在很多ISR函数中,这个参数的作用都是类似的,使用场景如下:'](#xTaskNotifyFromISR 函数跟 xTaskNotify 很 类 似 , 就 多 了 最 后 一 个 参 数pxHigherPriorityTaskWoken。在很多ISR函数中,这个参数的作用都是类似的,使用场景如下:‘)

xTaskNotifyWait函数列表如下:


使用任务通知,可以实现轻量级的队列(长度为 1)、邮箱(覆盖的队列)、计数型信号量、二进制信号量、事件组
任务通知有 2 套函数,简化版、专业版,列表如下:

简化版函数的使用比较简单,它实际上也是使用专业版函数实现的

专业版函数支持很多参数,可以实现很多功能

1.xTaskNotifyGive/ulTaskNotifyTake

在任务中使用 xTaskNotifyGive 函数,在 ISR 中使用 vTaskNotifyGiveFromISR 函数,都是直接给其他任务发送通知:

使得通知值加一

并使得通知状态变为"pending",也就是taskNOTIFICATION_RECEIVED,表示有数据了、待处理

可以使用ulTaskNotifyTake函数来取出通知值:

如果通知值等于 0,则阻塞(可以指定超时时间)

当通知值大于 0 时,任务从阻塞态进入就绪态

在ulTaskNotifyTake 返回之前,还可以做些清理工作:把通知值减一,或者把通知值清零

使用 ulTaskNotifyTake 函数可以实现轻量级的、高效的二进制信号量、计数型信号量

这几个函数的原型如下:

xTaskNotifyGive函数的参数说明如下:

vTaskNotifyGiveFromISR函数的参数说明如下:

ulTaskNotifyTake函数的参数说明如下:


2.xTaskNotify/xTaskNotifyWait

xTaskNotify 函数功能更强大,可以使用不同参数实现各类功能,比如:

让接收任务的通知值加一:这时 xTaskNotify()等同于 xTaskNotifyGive()

设置接收任务的通知值的某一位、某些位,这就是一个轻量级的、更高效的事件组

把一个新值写入接收任务的通知值:上一次的通知值被读走后,写入才成功。这就是轻量级的、长度为 1 的队列

用一个新值覆盖接收任务的通知值:无论上一次的通知值是否被读走,覆盖都成功。类似 xQueueOverwrite()函数,这就是轻量级的邮箱

xTaskNotify() 比 xTaskNotifyGive() 更灵活、强大,使用上也就更复杂

xTaskNotifyFromISR()是它对应的 ISR 版本

使用xTaskNotifyWait()函数!它比ulTaskNotifyTake()更复杂:

可以让任务等待(可以加上超时时间),等到任务状态为"pending"(也就是有数据)

还可以在函数进入、退出时,清除通知值的指定位

这几个函数的原型如下:

xTaskNotify函数的参数说明如下:

eNotifyAction参数说明:

xTaskNotifyFromISR 函数跟 xTaskNotify 很 类 似 , 就 多 了 最 后 一 个 参 数pxHigherPriorityTaskWoken。在很多ISR函数中,这个参数的作用都是类似的,使用场景如下:'

被通知的任务,可能正处于阻塞状态

xTaskNotifyFromISR 函数发出通知后,会把接收任务从阻塞状态切换为就绪态

如果被唤醒的任务的优先级,高于当前任务的优先级,则"*pxHigherPriorityTaskWoken"被设置为 pdTRUE,这表示在中断返回之前要进行任务切换

xTaskNotifyWait函数列表如下:

相关推荐
长江后浪博客11 天前
ESP32-SOLO-1 在 ESP-IDF v5.5 下启动不断重启问题分析与解决
单片机·嵌入式硬件·嵌入式·esp32·freertos·esp-idf
WWJA王文举12 天前
FreeRTOS动态创建任务和静态创建任务详解:xTaskCreate与xTaskCreateStatic区别
操作系统·freertos·嵌入式开发
离凌寒15 天前
一、关于rtthread nano使用上的细节总结
freertos
桃蹊、15 天前
串口/网络透传实战:FreeRTOS 多任务架构与连接池设计
stm32·物联网·wifi·freertos
虎王物联16 天前
ESP32 FreeRTOS多任务优先级翻转与互斥量保护实战
物联网·嵌入式·esp32·freertos
桃蹊、16 天前
FreeRTOS(六)之队列:任务间通信的基石
freertos·队列
桃蹊、17 天前
FreeRTOS(二)之堆和栈:内存基础入门
freertos·内存管理··
桃蹊、17 天前
FreeRTOS(四)之任务管理(上):创建、删除与任务参数
freertos·任务·task·创建任务
论迹复利19 天前
PendSV与RISC-V trap——上下文切换的两种设计哲学
内核·freertos·risc-v
捷瑞电子工坊22 天前
FreeRTOS中断管理:从原理到实践(标准库版)
嵌入式·freertos·实时操作系统·任务通知·临界区·中断管理·二值信号量