文章目录
- 任务通知 定义
- FreeRTOS 任务通知机制
任务通知 定义
实时操作系统(RTOS)的任务通知机制是一种用于任务间通信和同步的机制。在FreeRTOS中,任务通知允许一个任务向另一个任务发送通知,表明某个事件已经发生或者某些条件已经满足。 这种机制特别适用于轻量级的同步需求,因为它不需要使用更重的互斥锁或信号量。
任务通知包括一个32位的通知值,这个值可以是整数或者位掩码,具体含义由应用程序定义。任务可以等待特定的通知值或位掩码,以便在通知发生时采取相应的行动。
每个任务都会自己的任务结构体TCB,任务C的TCB结构体中有两个成员,一个是val值,一个是state状态。任务C等待结构体中的val值改变,当任务A改变任务C中的val值时,任务C才会被唤醒。当前任务状态由state成员决定。这就是任务通知。
FreeRTOS 任务通知机制
FreeRTOS 提供了几个API函数来实现任务通知,包括:
xTaskNotify(): 向指定任务发送通知,并可选择如何更新接收任务的通知值。
xTaskNotifyWait(): 允许任务等待接收通知,并可以设置在进入和退出时要清零的通知比特位。
xTaskNotifyAndQueryFromISR(): 中断服务例程(ISR)中使用的版本,允许从ISR向任务发送通知并返回任务之前的一个通知值。
ulTaskNotifyTake(): 允许任务在阻塞状态下等待其通知值大于零,并在返回之前减少或清除任务的通知值。
任务通知的优点包括轻量级、高效,适用于一对多通信,并且具有强实时性。
然而,它也有一些限制,比如不支持数据传递,只能传递一个32位的通知值,适用性有限,不适用于多生产者-多消费者问题,也不适合长期阻塞。
任务通知的三种状态包括:
taskNOT_WAITING_NOTIFICATION:任务没有在等待通知。
taskWAITING_NOTIFICATION:任务正在等待通知。
taskNOTIFICATION_RECEIVED:任务已经接收到通知。
在使用任务通知时,需要注意它与队列、信号量等其他通信机制的区别。任务通知适用于事件通知和轻量级的同步,队列适用于任务间的数据传递,而信号量适用于资源访问的同步和互斥。
总的来说,任务通知是一种高效的任务间通信机制,适用于简单的事件通知和同步需求,但对于复杂的数据传递和同步问题,可能需要结合其他FreeRTOS机制来实现。