【FreeRTOS 应用开发笔记】任务通知(十)

一、任务通知的基本概念

相对于以前使用 FreeRTOS 内核通信的资源,必须创建队列、二进制信号量、计数信号量或事件组的情况,使用任务通知显然更灵活。按照 FreeRTOS 官方的说法,使用任务通知比通过信号量等 ICP 通信方式解除阻塞的任务要快 45%,并且更加省 RAM 内存空间 (使用 GCC 编译器,-o2 优化级别),任务通知的使用无需创建队列。(由于任务通知的数据结构包含在任务控制块中,只要任务存在,任务通知数据结构就已经创建完毕,可以直接使用)

FreeRTOS 提供以下几种方式发送通知给任务 : 1、发送通知给任务, 如果有通知未读,不覆盖通知值。 2、 发送通知给任务,直接覆盖通知值。 3、发送通知给任务,设置通知值的一个或者多个位,可以当做事件组来使用。 4、发送通知给任务,递增通知值,可以当做计数信号量使用。消息通知虽然处理更快,RAM 开销更小,但也有以下限制 : 1、 只能有一个任务接收通知消息,因为必须指定接收通知的任务。2、只有等待通知的任务可以被阻塞,发送通知的任务,在任何情况下都不会因为发送失败而进入阻塞态。

任务通知可以在任务中向指定任务发送通知,也可以在中断中向指定任务发送通知,FreeRTOS 的每个任务都有一个 32 位的通知值,任务控制块中的成员变量 ulNotifiedValue就是这个通知值。只有在任务中可以等待通知,而不允许在中断中等待通知。

二、常用的任务函数。(更详细的用法以及函数源码可以参考《FreeRTOS 内核实现与应用开发实战指南 》)

xTaskNotifyGive()
用于在任务中向指定任务发送任务通知,并更新对方的任务通知值(加 1 操作)。该函数可以作为二值信号量和计数信号量的一种轻量型的实现。等待任务通知的时候 应该是使用函数ulTaskNotifyTake()而不是xTaskNotifyWait() 。
vTaskNotifyGiveFromISR()
用于在中断中向指定任务发送任务通知,并更新对方的任务通知值(加 1 操作),在某些场景中可以替代信号量操作,因为这两个通知都是不带有通知值的。
xTaskNotify()
向指定的任务发送一个任务通知,带有通知值并且用户可以指定通知值的发送方式。主要用于在任务中直接向另外一个任务发送一个事件,接收到该任务通知的任务有可能解锁。
xTaskNotifyFromISR()
xTaskNotifyFromISR()是 xTaskNotify()的中断保护版本
xTaskNotifyAndQuery()
与 xTaskNotify()很像。都是调用通用的任务通知发送函数 xTaskGenericNotify() 来 实 现 通 知 的 发 送 , 不同的是多了一个附加的参数
pulPreviousNotifyValue 用于回传接收任务的上一个通知值
xTaskNotifyAndQueryFromISR()
xTaskNotifyAndQueryFromISR()是 xTaskNotifyAndQuery ()的中断版本
ulTaskNotifyTake()
用于获取一个任务通知,获取二值信号量、计数信号量类型的任务通知。 返回任务的当前通知值,在其减 1 或者清 0 之前。
xTaskNotifyWait()
xTaskNotifyWait()函数用于实现全功能版的等待任务通知,根据用户指定的参数的不
同,可以灵活的用于实现轻量级的消息队列队列、二值信号量、计数信号量和事件组功能,并带有超时等待。

三、实验源码

因为源码较多,源码可以直接参考《FreeRTOS 内核实现与应用开发实战指南 》。

猜你喜欢

转载自blog.csdn.net/qq_29031103/article/details/121009250