一.简介
用于通知任务。任务控制块中的结构体成员变量ulNotifiedValue,就是这个通知值。以及ucNotifyState这个是通知状态
信号量,队列,事件标志组这些都可以模拟通知任务的功能。但是任务通知功能与前面这些最主要的区别就是内存消耗比较小。信号量,队列,事件标志组这些需要提前创建,而任务通知则不需要,其结构体成员就在TCB中。
对比信号量,队列,事件标志组:
优势:
效率更好;内存需求更小;
劣势:
无法发送数据给ISR(中断);无法广播给多个任务;无法缓存多个数据(只能保持一个数据);发送方无法进入阻塞状态等待
二.结构体解析
ulNotifiedValue:
任务通知的更新方式:
1.不覆盖接收任务的通知值(类似队列)
2.覆盖接收任务的通知值(类似队列)
3.更新任务接收通知值的一个或多个bit(类似事件标志组)
4.增加接收任务的通知值(类似信号量)
ucNotifyState:
通知状态:
taskNOT_WAITING_NOTIFICATION 0 //任务未开始等待,默认初始化状态
taskWAITING_NOTIFICATION 1 //任务正在等待中(发送方未发送,接收方已开始接收)
taskNOTIFICATION_RECEIVED 2 //任务等待接收(发送方已发送,接收方还未开始接收)
三.api
//发送通知,并带有通知值
xTaskNotify( xTaskToNotify, ulValue, eAction )
//发送通知,并带有通知值,且保留接收任务原通知值
xTaskNotifyAndQuery( xTaskToNotify, ulValue, eAction, pulPreviousNotifyValue )
//发送通知,不带有通知值
xTaskNotifyGive( xTaskToNotify )
//中断
xTaskNotifyFromISR( xTaskToNotify, ulValue, eAction, pxHigherPriorityTaskWoken )
xTaskNotifyAndQueryFromISR( xTaskToNotify, ulValue, eAction, pulPreviousNotificationValue, pxHigherPriorityTaskWoken )
vTaskNotifyGiveFromISR( TaskHandle_t xTaskToNotify, BaseType_t *pxHigherPriorityTaskWoken )
xTaskGenericNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue )
xTaskToNotify: 接收任务通知的任务句柄
ulValue: 任务通知值,发送值
eAction 通知方式
pulPreviousNotificationValue: 保存更新前的任务通知值
//接收通知,获取任务通知时,可以设置在退出此函数的时候,将任务通知清零或者减一
uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait )
//接收通知,可获取通知值/清楚通知值的指定位
BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait )