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函数列表如下:

相关推荐
007张三丰1 天前
AIoT与嵌入式系统深度解析:2026软考案例核心考点全攻略
物联网·mqtt·kafka·freertos·时序数据库·tdengine·aiot
╰⋛⋋⊱⋋翅膀⋌⊰⋌⋚╯10 天前
FreeRTOS--CPU利用率
stm32·freertos
追兮兮11 天前
MCUQuickStart v1.1.0发布,一键生成Keil工程+RTOS模板
stm32·单片机·嵌入式硬件·freertos·gd32·keil5
山木嵌入式11 天前
【嵌入式】裸机VS RTOS 核心对比+落地选型指南
freertos·嵌入式开发·rtos·裸机编程
嵌入式Q14 天前
FreeRTOS源码解析(10)软件定时器
单片机·mcu·freertos
Nice__J16 天前
os操作系统——第2讲:任务的三六九等
freertos·zpzer
山木嵌入式16 天前
FreeRTOS从入门到进阶:核心概念与调度原理全解析
stm32·操作系统·嵌入式·freertos·rtos
一支闲人17 天前
Free RTOS:信号量实验
freertos
济61717 天前
FreeRTOS看门狗任务设计---软件看门狗 + 硬件 IWDG 双保险实现
嵌入式·freertos