FreeRTOS--任务通知

任务通知:每个任务有一个32位的通知值在大多数情况下,任务通知可以替代二值信号量、计数信号量、事件组,也可以替代长度为 1 的队列(可以保存一个 32位整数或指针值)。

  使用任务通知比通过信号量等 ICP 通信方式解除阻塞的任务要快 45%,并且更加省 RAM 内存空间(使用 GCC 编译器,-o2 优化级别),任务通知的使用无需创建队列.

  FreeRTOS给任务发送通知的方式:

  发送通知给任务, 如果有通知未读,不覆盖通知值。
  发送通知给任务,直接覆盖通知值。
  发送通知给任务,设置通知值的一个或者多个位,可以当做事件组来使用。
  发送通知给任务,递增通知值,可以当做计数信号量使用。
通过对任务通知方式的灵活使用 可以在一定场合中代替FreeRTOS的信号量。但是存在以下限制:
    只能有一个任务接收通知消息,因为必须指定接收通知的任务。
    只有等待通知的任务可以被阻塞,发送通知的任务,在任何情况下都不会因为发
送失败而进入阻塞态。
任务通知的运作机制:
   
任务通知是属于任务中附带的资源,所以在任务被创建的时候,任务通知也被初始化的,而在分析队列和信号量的章节中,我们知道在使用队列、信号量前,必须先创建队列和信号量,目的是为了创建队列数据结构。任务通知,由于任务通知的数据结构包含在任务控制块中,只要任务存在,任务通知数据结构就已经创建完毕,可以直接使用。
  任务通知可以在任务中向指定任务发送通知,也可以在中断中向指定任务发送通知FreeRTOS 的每个任务都有一个 32 位的通知值,任务控制块中的成员变量 ulNotifiedValue就是这个通知值。只有在任务中可以等待通知,而不允许在中断中等待通知。
任务通知的数据结构:
在任务块中:
  

 (1)任务通知的值,可以保存一个 32 位整数或指针值。

 (2) 任务通知状态,用于标识任务是否在等待通知。
发送任务通知函数 xTaskGenericNotify():
   

 

 xTaskNotifyGive():

xTaskNotifyGive()是一个宏,宏展开是调用函数 xTaskNotify( ( xTaskToNotify ), ( 0 ), eIncrement ),即向一个任务发送通知,并将对方的任务通知值加 1。该函数可以作为二值信号量和计数信号量的一种轻量型的实现,速度更快,在这种情况下对象任务在等待任务通 知 的 时 候 应 该 是 使 用 函 数 ulTaskNotifyTake() 而不是 xTaskNotifyWait()

 

使用实例:

 vTaskNotifyGiveFromISR():

   vTaskNotifyGiveFromISR()函数作用,每次调用该函数都会增加任务的通知值,任务通过接收函数返回值是否大于零,判断是否获取到了通知,任务通知值初始化为 0,(如果与信号量做对比)则对应为信号量无效。当中断调用vTaskNotifyGiveFromISR()通知函数给任务的时候,任务的通知值增加,使其大于零,使其表示的通知值变为有效,任务获取有效的通知值将会被恢复。

 使用实例:

 

xTaskNotify() :

用于在任务中直接向另外一个任务发送一个事件,接收到该任务通知的任务有可能解锁。如果你想使用任务通知来实现二值信号量和计数信号量,那么应该使用更加简单的函数 xTaskNotifyGive() ,而不是使用 xTaskNotify()xTaskNotify()函数在发送任务通知的时候会指定一个通知值,并且用户可以指定通知值发送的方式。

 使用实例:

xTaskNotifyFromISR():

 

 中断中发送任务通知通用函数 xTaskGenericNotifyFromISR():

使用实例:

 

 xTaskNotifyAndQuery():

使用实例:

 

 获取任务通知函数:

ulTaskNotifyTake():
ulTaskNotifyTake() 作为二值信号量和计数信号量的一种轻量级实现,速度更快。如果
FreeRTOS 中使用函数 xSemaphoreTake() 来获取信号量,这个时候则可以试试使用函数
ulTaskNotifyTake() 来代替。

 使用实例:

 实验:任务通知代替消息队列

 两个任务是用于接收任务通知,另一个任务发送任务通知。三个任务独立运行,发送消息任务是通过检测按键 的按下情况来发送消息通知,另两个任务获取消息通知,在任务通知中没有可用的通知之 前就一直等待消息,一旦获取到消息通知就把消息打印在串口调试助手里。

 

 

 

 

 实验现象:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值