一、基本介绍
任务通知,是利用任务控制块(TCB)中的结构体成员变量ulNotifiedValue进行任务通知。相对于队列、信号量和事件标志组这几种通信方式,任务通知不需要创建一个结构体,直接就可以进行任务间的通信。
任务通知值的更新方式主要分为四种:1.不覆盖接受任务的通知值;2覆盖接受任务的通知值;3.更新接受任务通知值的一个或多个bit;4.增加接受任务的通知值。、
任务通知既有其优势也存在劣势,
优势:
1.效率更高,可以在任务间直接通信。
2.内存消耗更小,在创建任务时就创建了任务通知值,不需要额外内存空间。
劣势:
1.无法在中断和任务间通信,因为中断没有TCB。
2.无法进行广播,任务通知只能单对单通信。
3.无法缓存多个数据(其实也可以,不过FreeRTOS源码对用户进行了屏蔽)。
4.发送时不能进入阻塞态,但接收可以。
任务通知的结构体变量如下所示:
typedef struct tskTaskControlBlock
{
... ...
#if ( configUSE_TASK_NOTIFICATIONS == 1 )
volatile uint32_t ulNotifiedValue [ configTASK_NOTIFICATION_ARRAY_ENTRIES ];
volatile uint8_t ucNotifyState [ configTASK_NOTIFICATION_ARRAY_ENTRIES ];
#endif
... ...
} tskTCB;
#define configTASK_NOTIFICATION_ARRAY_ENTRIES 1 /* 定义任务通知数组的大小 ,
一个uint32_t类型,用来标表示通知值,另一个是uint8_t类型,表示当前通知状态。
通知状态主要有三种:
#define taskNOT_WAITING_NOTIFICATION ( ( uint8_t ) 0 ) /* 任务未等待通知 */
#define taskWAITING_NOTIFICATION ( ( uint8_t ) 1 ) /* 任务在等待通知 */
#define taskNOTIFICATION_RECEIVED ( ( uint8_t ) 2 ) /* 任务在等待接收*/
第一个是默认的初始化状态;第二个表示接收方准备就绪,等待发送方发送;第三个表示发送方已经发送,等待接收方接收。
二、函数介绍
任务通知函数主要分为两类:1.发送通知;2.接收通知。
详细函数说明请参考官网:RTOS 任务通知 - FreeRTOS™
1.发送通知相关函数
xTaskNotify()和xTaskNotifyAndQuery()多用于模拟队列和事件标志组。xTaskNotifyGive()多用于模拟信号量(二值和计数)。
2.接收通知相关函数
对应的,ulTaskNotifyTake()用于接收模拟信号量。
三、问题和总结
暂无~