做销售网站,哪个网站有免费,济南网站建设,建设网站选择主机时费用最昂贵的方案是文章目录 前言一、任务通知介绍1.1 任务通知怎么通信1.2 任务通知与其他通信方式的区别1.3 优势及限制任务通知的优势任务通知的限制 1.4 内部原理 二、任务通知的使用2.1 发出与接收通知简化版2.1 发出与接收通知专业版 总结 前言
FreeRTOS 提供了丰富而灵活的任务通知机制为多任务协作提供了一种有效的方式。任务通知允许任务之间进行轻量级的信息传递从而实现更加紧密的协同工作。在本篇文章中我们将深入了解 FreeRTOS 中的任务通知探索其基础概念和简单用法帮助读者更好地理解和应用这一关键特性。 一、任务通知介绍
1.1 任务通知怎么通信
在任务通知中我们可以直接把需要通知的东西发给对方就行了
1.2 任务通知与其他通信方式的区别
使用队列、信号量、事件组时我们都要事先创建对应的结构体双方通过中间的结构体通信 但我们的任务通知只需要对方的TCB结构体即可任务结构体 TCB 中就包含了内部对象可以直接接收别人发过来的通知
1.3 优势及限制
任务通知的优势
效率更高使用任务通知来发送事件、数据给某个任务时效率更高。比队列、信号量、事件组都有大的优势。 更节省内存使用其他方法时都要先创建对应的结构体使用任务通知时无需额外创建结构体。
任务通知的限制
不能发送数据给 ISR ISR 并没有任务结构体所以无法使用任务通知的功能给 ISR 发送数据。但是 ISR可以使用任务通知的功能发数据给任务。 数据只能给该任务独享 使用队列、信号量、事件组时数据保存在这些结构体中其他任务、ISR 都可以访问这些数据。使用任务通知时数据存放入目标任务中只有它可以访问这些数据。 在日常工作中这个限制影响不大。因为很多场合是从多个数据源把数据发给某个任务而不是把一个数据源的数据发给多个任务。 无法缓冲数据 使用队列时假设队列深度为 N那么它可以保持 N 个数据。使用任务通知时任务结构体中只有一个任务通知值只能保持一个数据。 无法广播给多个任务 使用事件组可以同时给多个任务发送事件。使用任务通知只能发个一个任务。 如果发送受阻发送方无法进入阻塞状态等待假设队列已经满了使用 xQueueSendToBack()给队列发送数据时任务可以进入阻塞状态等待发送完成。使用任务通知时即使对方无法接收数据发送方也无法阻塞等待只能即刻返回错误
1.4 内部原理
在TCB_t里面存储着这两个成员:ulNotifiedValue与ucNotifyState他们分别表示通知的数据和通知的状态如下图所示 通知状态有 3 种取值 taskNOT_WAITING_NOTIFICATION任务没有在等待通知 taskWAITING_NOTIFICATION任务在等待通知 taskNOTIFICATION_RECEIVED任务接收到了通知也被称为 pending(有数据了待处理)
通知值可以有很多种类型 计数值 位(类似事件组) 任意数值
二、任务通知的使用
如果你想使用任务通知应该加上:configUSE_TASK_NOTIFICATIONS这个宏
任务通知有 2 套函数简化版、专业版列表如下 简化版函数的使用比较简单它实际上也是使用专业版函数实现的 专业版函数支持很多参数可以实现很多功能
2.1 发出与接收通知简化版
在任务中发送通知可以使用下面这个函数
BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify );他的参数是任务的handle。他会使对方任务的通知值加1并使得通知状态变为pending也就是 taskNOTIFICATION_RECEIVED表示有数据了、待处理
在中断中发送通知可以使用下面这个函数
void vTaskNotifyGiveFromISR( TaskHandle_t xTaskHandle, BaseType_t *pxHigherPriorityTaskWoken );我们可以使用下面这个函数来等待接收通知
uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait );参数1为是否清除值在退出此函数之后.参数2为等待时间
如果通知值等于 0则阻塞(可以指定超时时间) 当通知值大于 0 时任务从阻塞态进入就绪态
2.1 发出与接收通知专业版
在任务中发送通知可以使用下面这个函数
BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction );参数2为你要为那个任务的TCB的value设置为多少。 eNotifyAction 参数说明
eNoAction 仅仅是更新通知状态为pending未使用 ulValue。这个选项相当于轻量级的、更高效的二进制信号量。eSetBits 通知值 原来的通知值 | ulValue按位或。相当于轻量级的、更高效的事件组。eIncrement 通知值 原来的通知值 1未使用 ulValue。相当于轻量级的、更高效的二进制信号量、计数型信号量。相当于 xTaskNotifyGive()函数。eSetValueWithoutOverwrite 不覆盖。如果通知状态为pending(表示有数据未读)则此次调用 xTaskNotify 不做任何事返回 pdFAIL。如果通知状态不是pending(表示没有新数据)则通知值 ulValue。eSetValueWithOverwrite 覆盖。无论如何不管通知状态是否为pendng通知值 ulValue。
在中断中发送通知可以使用下面这个函数
BaseType_t xTaskNotifyFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue,
eNotifyAction eAction, BaseType_t *pxHigherPriorityTaskWoken );我们可以使用下面这个函数来等待通知
BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit,
uint32_t *pulNotificationValue, TickType_t xTicksToWait );参数1为在 xTaskNotifyWait 入口处要清除通知值的哪些位通知状态不是pending的情况下才会清除。 参数2为在 xTaskNotifyWait 出口处如果不是因为超时推出而是因为得到了数据而退出时通知值 通知值 ~(ulBitsToClearOnExit)。 参数3用来取得对应的值 参数4为等待时间 总结
任务通知是 FreeRTOS 中一个强大的工具为多任务系统中的任务间通信提供了高效可靠的机制。通过任务通知任务可以在不同的优先级下进行快速的同步和信息传递避免了使用更为复杂的信号量和队列时可能引入的开销。了解和善用任务通知可以让我们更好地设计和优化 FreeRTOS 应用程序提高系统的效率和可维护性。
在使用任务通知时需要注意合理规划任务间的通信和同步需求避免过度使用通知以确保系统的可靠性。通过深入学习 FreeRTOS 的任务通知机制我们可以更加灵活地掌握多任务编程的技巧提高嵌入式系统的性能和响应能力。
在日益复杂的嵌入式应用中任务通知作为 FreeRTOS 提供的重要特性为开发者提供了更多处理任务间协作的选择。通过深入理解和应用任务通知我们能够更加高效地构建稳定可靠的嵌入式系统。希望本文能够为初学者提供一个简明易懂的入门指南帮助读者更好地利用 FreeRTOS 的任务通知功能。