任务通知:用来通知任务的,任务控制块中的结构体成员变量 ulNotifiedValue就是这个通知值。
任务通知有速度快、内存小的优势,但是中断不能收数据,只能一对一,只有一个数据量,发送不支持阻塞。多用于一对一通知
任务都有一个结构体:任务控制块TCB,它里边有两个结构体成员变量:
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 /* 定义任务通知数组的大小, 默认: 1 */
ulNotifiedValue是 uint32_t 类型,用来表示通知值
ucNotifyState是 uint8_t 类型,用来表示通知状态
任务通知值的更新方式有多种类型
任务通知状态共有3种取值:
#define taskNOT_WAITING_NOTIFICATION ( ( uint8_t ) 0 ) /* 任务未等待通知 */
#define taskWAITING_NOTIFICATION ( ( uint8_t ) 1 ) /* 任务在等待通知 */
#define taskNOTIFICATION_RECEIVED ( ( uint8_t ) 2 ) /* 任务在等待接收 */
任务通知API函数主要有两类:①发送通知 ,②接收通知。
【注意】发送通知API函数可以用于任务和中断服务函数中;接收通知API函数只能用在任务中。
xTaskNotifyAndQuery()和xTaskNotify()常用于模拟写队列/设置标志位,ulTaskNotifyTake()常用于读队列/清除标志位
xTaskNotifyGive()常用于模拟信号量释放,ulTaskNotifyTake()常用于模拟信号量获取
下方的函数和上述的函数基本一致,只不过可以操作下表不为0的元素操作(不常用)
#define xTaskNotifyAndQuery(xTaskToNotify, ulValue , eAction , pulPreviousNotifyValue )
xTaskGenericNotify((xTaskToNotify), (tskDEFAULT_INDEX_TO_NOTIFY), (ulValue), (eAction), (pulPreviousNotifyValue ))
#define xTaskNotify(xTaskToNotify , ulValue , eAction )
xTaskGenericNotify((xTaskToNotify), (tskDEFAULT_INDEX_TO_NOTIFY), (ulValue), (eAction), NULL)
#define xTaskNotifyGive( xTaskToNotify )
xTaskGenericNotify((xTaskToNotify), (tskDEFAULT_INDEX_TO_NOTIFY), (0), eIncrement, NULL)
BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify,
UBaseType_t uxIndexToNotify,
uint32_t ulValue,
eNotifyAction eAction,
uint32_t * pulPreviousNotificationValue )
typedef enum
{
eNoAction = 0, /* 无操作 */
eSetBits /* 更新指定bit */
eIncrement /* 通知值加一 */
eSetValueWithOverwrite /* 覆写的方式更新通知值 */
eSetValueWithoutOverwrite /* 不覆写通知值 */
} eNotifyAction;
#define ulTaskNotifyTake( xClearCountOnExit , xTicksToWait )
ulTaskGenericNotifyTake ( ( tskDEFAULT_INDEX_TO_NOTIFY ),//任务的指定通知
( xClearCountOnExit ),
( xTicksToWait ) )
#define xTaskNotifyWait( ulBitsToClearOnEntry,
ulBitsToClearOnExit,
pulNotificationValue,
xTicksToWait)
xTaskGenericNotifyWait( tskDEFAULT_INDEX_TO_NOTIFY,
( ulBitsToClearOnEntry ),
( ulBitsToClearOnExit ),
( pulNotificationValue ),
( xTicksToWait ))
BaseType_t xTaskGenericNotifyWait( UBaseType_t uxIndexToWaitOn,
uint32_t ulBitsToClearOnEntry,
uint32_t ulBitsToClearOnExit,
uint32_t * pulNotificationValue,
TickType_t xTicksToWait);