【FreeRTOS】任務通知

從之前學習的過程中,任務間通信是需要創建隊列、二進制信號量、計數信號量或事件組,這些都需要消耗內核資源;
而任務通知就更爲的靈活,按照官方說法,使用任務通知比通過信號量等 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 );
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章