RTOS任务通知
[ 任务间通信和同步 ]
描述
每个RTOS任务都有一个32位的 通知值 。的 RTOS的任务通知 是直接发送到可以解锁接收任务,和任选的任务的事件 更新接收任务的通知值 。任务通知可以通过以下方式更新接收任务的通知值:
- 设置接收任务的通知值而不覆盖以前的值
- 覆盖接收任务的通知值
- 在接收任务的通知值中设置一个或多个位
- 增加接收任务的通知值
使用xTaskNotify() 和xTaskNotifyGive() API函数(及其中断安全等价函数 )发送通知,并保持待处理状态,直到接收RTOS任务调用 xTaskNotifyWait()或 ulTaskNotifyTake() API函数。如果接收RTOS任务已经被阻止,等到接收RTOS任务到达时,将从阻塞状态中删除接收RTOS任务,并清除通知。
RTOS任务通知功能默认启用,并且可以通过在FreeRTOSConfig.h中将configUSE_TASK_NOTIFICATIONS设置为0来从构建中排除(每个任务节省8个字节)。
性能优点和使用限制
与其他可用于执行等效功能的FreeRTOS功能相比,任务通知具有速度和内存占用的优势。正如预期的那样,这些好处需要一些用例限制:- 只有只有一个任务可以成为事件的接收者时,才能使用RTOS任务通知。然而,这种情况在大多数真实世界的应用中都能满足。
- 只有在使用RTOS任务通知代替队列的情况下,虽然接收任务可以等待处于阻止状态的通知(因此不消耗任何CPU时间),但是如果发送无法立即完成,则发送任务不能等待处于阻止状态以等待发送完成。
用途和范例
相关的API 旨在允许RTOS任务通知用作 二进制 和 计数 信号量, 事件组 以及某些情况下 队列 的更快,更轻的替代选择(在文档中称为邮箱,因为队列长度必须等于1) 。本页面底部可以找到说明如何完成的文档页面链接。从此页:
* 使用FreeRTOS V8.1.2中的二进制信号量实现度量,使用GCC进行-O2优化编译,并且没有定义configASSERT()。使用FreeRTOS V8.2.0及更高版本中改进的二进制信号量实现仍然可以获得35%的提升。