任務(wù)通知簡介
任務(wù)通知在 FreeRTOS 中是一個可選的功能,要使用任務(wù)通知的話就需要將宏configUSE_TASK_NOTIFICATIONS 定義為 1。
FreeRTOS 的每個任務(wù)都有一個 32 位的通知值,任務(wù)控制塊中的成員變量 ulNotifiedValue 就是這個通知值。任務(wù)通知是一個事件,假如某個任務(wù)通知的接收任務(wù)因為等待任務(wù)通知而阻塞的話,向這個接收任務(wù)發(fā)送任務(wù)通知以后就會解除這個任務(wù)的阻塞狀態(tài)。也可以更新接收任務(wù)的任務(wù)通知值,任務(wù)通知可以通過如下方法更新接收任務(wù)的通知值:
● 不覆蓋接收任務(wù)的通知值(如果上次發(fā)送給接收任務(wù)的通知還沒被處理)。
● 覆蓋接收任務(wù)的通知值。
● 更新接收任務(wù)通知值的一個或多個 bit。
● 增加接收任務(wù)的通知值。
合理、靈活的使用上面這些更改任務(wù)通知值的方法可以在一些場合中替代隊列、二值信號量、計數(shù)型信號量和事件標(biāo)志組。使用任務(wù)通知來實現(xiàn)二值信號量功能的時候,解除任務(wù)阻塞的時間比直接使用二值信號量要快 45%(FreeRTOS 官方測試結(jié)果,使用 v8.1.2 版本中的二值信號量,GCC 編譯器,-O2 優(yōu)化的條件下測試的,沒有使能斷言函數(shù) configASSERT()),并且使用的 RAM 更少!
任務(wù)通知的發(fā)送使用函數(shù) xTaskNotify()或者 xTaskNotifyGive()(還有此函數(shù)的中斷版本)來 完 成 , 這個通知值會一直保持著 ,直到接受任務(wù)調(diào)用函數(shù)xTaskNotifyWait() 或 者ulTaskNotifyTake()來獲取這個通知值。假如接收任務(wù)因為等待任務(wù)通知而阻塞的話那么在接收到任務(wù)通知以后就會解除阻塞態(tài)。
任務(wù)通知雖然可以提高速度,并且減少 RAM 的使用,但是任務(wù)通知也是有使用限制的:
● FreeRTOS 的任務(wù)通知只能有一個接收任務(wù),其實大多數(shù)的應(yīng)用都是這種情況。
● 接收任務(wù)可以因為接收任務(wù)通知而進(jìn)入阻塞態(tài),但是發(fā)送任務(wù)不會因為任務(wù)通知發(fā)送失敗而阻塞。
-
嵌入式
+關(guān)注
關(guān)注
5092文章
19178瀏覽量
307691 -
FreeRTOS
+關(guān)注
關(guān)注
12文章
484瀏覽量
62398
發(fā)布評論請先 登錄
相關(guān)推薦
評論