简介
在之前的应用中我们通过一系列独立的任务来使用FREERTOS。但有时我们也需要任务之间相互交流。
通过中间项目交流
之前章节我们都是通过中间相来进行交流。例如信号量,队列等,中断或任务先将信号量或数据放入队列,然后等待其他任务的使用。
任务通知(直接交流)
任务通知,使得任务间可以直接交流,或使任务与中断同步。通过任务通知,中断或任务可直接将事件传递给需要的任务。
任务通知功能是可选功能,若要使用,需要将 FreeRTOSConfig.h中的configUSE_TASK_NOTIFICATIONS置为1。
当将configUSE_TASK_NOTIFICATIONS置为1后,每个任务都有一个通知状态,(挂起(Pending)或没挂起(Not-Pending))以及一个32位无符号整形的通知值,当一个任务接收到一个通知,它的通知状态会变为挂起,当任务读取了通知值后,其状态转为未挂起状态。一个任务可以阻塞等待其通知状态挂起。
任务通知的优点与限制
任务通知的性能优点
使用任务通知相比于信号量与队列可以更快传递数据。
任务通知的内存消耗优点
任务通知由于不用创建队列,信号量或事件组,因此消耗内存较小。
任务通知的限制
任务通知也有许多首先地方,例如:
1,给中断函数发送数据或事件,信号量等可以将事件或数据从任务传递给中断,也可从中断传递给任务,而任务通知只能从中断传递给任务,不能从任务传递给中断。
2,使能超过一个接受任务,中间交流相可以通过它的句柄被任意一个中断和任务所获取。而任务通知只能传递给一个任务。
3,多重数据,队列同一时间可以传递包含多个数据的项目,多个数据会保存在队列中等待使用,而任务通知一次性只能传递一个。
4等等。
使用任务通知
任务通知可选接口函数
任务通知非常灵活可以替换二进制信号量,计数信号量,,一个事件组或甚至一个队列。这个广泛的应用可通过 xTaskNotify() 来实现发送一个任务通知,通过 xTaskNotifyWait() 来接收一个任务通知。
然大多数情况下一个完整功能的xTaskNotify() 和 xTaskNotifyWait() 并不需要,因此我们可以采用 功能稍微受限的xTaskNotifyGive()来代替xTaskNotify(),通过功能受限的ulTaskNotifyTake()来代替xTaskNotifyWait() 。
xTaskNotifyGive()
将任务通知传递给任务,这将使得被传递的任务的任务通知状态进入挂起态,并且使任务通知的值加一。函数原型如下:
BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify );
参数:
xTaskToNotify :任务句柄。
返回值,由于该函数是一个调用xTaskNotify() 的宏,故其返会值只有pdTRUE.
vTaskNotifyGiveFromISR()
中断安全函数,函数原型:
void vTaskNotifyGiveFromISR( TaskHandle_t xTaskToNotify,
BaseType_t *pxHigherPriorityTaskWoken )