從之前學習的過程中,任務間通信是需要創建隊列、二進制信號量、計數信號量或事件組,這些都需要消耗內核資源;
而任務通知就更爲的靈活,按照官方說法,使用任務通知比通過信號量等 ICP 通信方式解除阻塞的任務要快 45%,並且更加省 RAM 內存空間(使用 GCC 編譯器,-o2 優化級別),任務通知的使用無需創建隊列。
configUSE_TASK_NOTIFICATIONS 1
幾種方式
- (eSetValueWithoutOverwrite)發送通知給任務, 如果有通知未讀,不覆蓋通知值。
- (eSetValueWithOverwrite)發送通知給任務,直接覆蓋通知值。
- (eSetBits)發送通知給任務,設置通知值的一個或者多個位 ,可以當做事件組來使用。
- (eIncrement)發送通知給任務,遞增通知值,可以當做計數信號量使用。
- (eNoAction)對象任務接收任務通知,但是任務自身的任務通知值不更新,
限制
- 只能有一個任務接收通知消息,因爲必須指定接收通知的任務。。
- 只有等待通知的任務可以被阻塞,發送通知的任務,在任何情況下都不會因爲發
送失敗而進入阻塞態。
函數
發送任務通知函數
xTaskNotifyGive( xTaskToNotify );/* 信號量*/
void vTaskNotifyGiveFromISR(TaskHandle_t xTaskToNotify,
BaseType_t *pxHigherPriorityTaskWoken);
BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify,
uint32_t ulValue,/* 隊列,最大四個字節*/
eNotifyAction eAction );/* 覆蓋方式*/
BaseType_t xTaskNotifyFromISR( TaskHandle_t xTaskToNotify,
uint32_t ulValue,
eNotifyAction eAction,
BaseType_t *pxHigherPriorityTaskWoken );
BaseType_t xTaskNotifyAndQuery( TaskHandle_t xTaskToNotify,
uint32_t ulValue,
eNotifyAction eAction,
uint32_t *pulPreviousNotifyValue );/*eSetValueWithoutOverwrite,回傳上一個通知值*/
BaseType_t xTaskNotifyAndQueryFromISR(TaskHandle_t xTaskToNotify,
uint32_t ulValue,
eNotifyAction eAction,
uint32_t *pulPreviousNotifyValue,
BaseType_t *pxHigherPriorityTaskWoken );
獲取任務通知函數
uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit,/*pdFALSE,減一;pdTURE,清零*/
TickType_t xTicksToWait );
BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry,/*在使用前,根據值進行對應位清零*/
uint32_t ulBitsToClearOnExit,/*在退出前,根據值進行對應位清零*/
uint32_t *pulNotificationValue,/*保存接收到的通知值*/
TickType_t xTicksToWait );