任务通知可以替代二进制信号量、计数信号量、事件组,可以替代长度为1的队列(可以保存一个32位整数或指针值),并且任务通知速度更快、使用的RAM更少。
先看一下任务TCB
/* 任务TCB */
typedef struct tskTaskControlBlock
{
volatile StackType_t *pxTopOfStack; /* 栈顶地址 */
ListItem_t xStateListItem; /* 状态列表项:运行、就绪、挂起、阻塞 */
ListItem_t xEventListItem; /* 事件列表项 */
UBaseType_t uxPriority; /* 优先级 */
StackType_t *pxStack; /* 栈指针 */
char pcTaskName[configMAX_TASK_NAME_LEN]; /* 任务名 */
......
#if (configUSE_MUTEXES == 1)
UBaseType_t uxBasePriority; /* 任务基础优先级 */
UBaseType_t uxMutexesHeld; /* 互斥锁持有数量 */
#endif
......
#if (configUSE_TASK_NOTIFICATIONS == 1)
volatile uint32_t ulNotifiedValue; /* 任务通知值 */
volatile uint8_t ucNotifyState; /* 任务通知状态 */
#endif
......
}tskTCB;
typedef tskTCB TCB_t;
任务通知有三种状态:taskNOT_WAITING_NOTIFICATION&#x