任务通知:每个任务有一个32位的通知值在大多数情况下,任务通知可以替代二值信号量、计数信号量、事件组,也可以替代长度为 1 的队列(可以保存一个 32位整数或指针值)。
FreeRTOS给任务发送通知的方式:
(1)任务通知的值,可以保存一个 32 位整数或指针值。
xTaskNotifyGive():
xTaskNotifyGive()是一个宏,宏展开是调用函数 xTaskNotify( ( xTaskToNotify ), ( 0 ), eIncrement ),即向一个任务发送通知,并将对方的任务通知值加 1。该函数可以作为二值信号量和计数信号量的一种轻量型的实现,速度更快,在这种情况下对象任务在等待任务通 知 的 时 候 应 该 是 使 用 函 数 ulTaskNotifyTake() 而不是 xTaskNotifyWait() 。
使用实例:
vTaskNotifyGiveFromISR():
vTaskNotifyGiveFromISR()函数作用,每次调用该函数都会增加任务的通知值,任务通过接收函数返回值是否大于零,判断是否获取到了通知,任务通知值初始化为 0,(如果与信号量做对比)则对应为信号量无效。当中断调用vTaskNotifyGiveFromISR()通知函数给任务的时候,任务的通知值增加,使其大于零,使其表示的通知值变为有效,任务获取有效的通知值将会被恢复。
使用实例:
xTaskNotify() :
用于在任务中直接向另外一个任务发送一个事件,接收到该任务通知的任务有可能解锁。如果你想使用任务通知来实现二值信号量和计数信号量,那么应该使用更加简单的函数 xTaskNotifyGive() ,而不是使用 xTaskNotify(),xTaskNotify()函数在发送任务通知的时候会指定一个通知值,并且用户可以指定通知值发送的方式。
使用实例:
中断中发送任务通知通用函数 xTaskGenericNotifyFromISR():
使用实例:
xTaskNotifyAndQuery():
使用实例:
获取任务通知函数:
使用实例:
实验:任务通知代替消息队列
实验现象: