freeRtos学习笔记 (8) 任务通知
生活随笔
收集整理的這篇文章主要介紹了
freeRtos学习笔记 (8) 任务通知
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
freeRtos學習筆記
freeRtos任務通知
任務通知的優缺點
發送任務通知信號量函數
BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify ); /* 任務句柄 */void vTaskNotifyGiveFromISR(TaskHandle_t xTaskToNotify, /* 任務句柄 */BaseType_t *pxHigherPriorityTaskWoken ); /* 高優先級任務是否被喚醒的狀態保存 */發送信號量函數 任務通知信號量加一
- 第一個參數 任務句柄
- 第二個參數 對應任務由于獲取不到信號量而進入堵塞態,在中斷中發送了該任務的任務通知信號量,則該任務由堵塞態轉變為就緒態,如果該任務優先級比當前運行的任務優先級高,則pxHigherPriorityTaskWoken會變為pdTRUE 在中斷結束部分可以調用taskYELD()進行任務調度
- 返回值 只會發會pdTRUE
- 注意 任務通知存放在任務控制塊內,所以只需要創建對應任務,并打開任務通知使能宏即可
獲取任務通知信號量函數
uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, /* 選擇是否清零用于任務通知的 ulNotifiedValue */ TickType_t xTicksToWait ); /* 等待信號量可用的最大等待時間 */獲取任務通知信號量函數
- 第一個參數 如果為pdFALSE 則該函數返回前會將任務通知信號量減一,如果為pdTRUE 函數返回前會將任務通知信號量清零
- 第二個參數 如果沒有任務信號量,最大等待時間,單位為系統節拍
- 返回值 返回任務當前通知值,即在其減一或者清零前的值
修改任務通知變量函數
BaseType_t xTaskNotify(TaskHandle_t xTaskNotify, /* 任務句柄 */uint32_t ulValue, /* 更新任務控制塊中的通知變量值 */eNotifyAction eAction); /* 任務通知更新模式 */BaseType_t xTaskNotifyFromISR(TaskHandle_t xTaskNotify, /* 任務句柄 */uint32_t ulValue, /* 更新任務控制塊中的通知變量值 */eNotifyAction eAction, /* 任務通知更新模式 */BaseType_t *pxHightPriorityTaskWoken) /* 高優先級任務是否被喚醒的狀態保存 */修改任務通知變量函數
- 第一個參數 任務句柄
- 第二個參數 要更新的值
- 第三個參數 更新模式
| eNoAction | 接收此消息的任務, 其任務控制塊中的變量 ulNotifiedValue 沒有變化,即函數 xTaskNotify 第 2 個參數 ulValue 沒有用上。 |
| eSetBits | 接收此消息的任務, 其任務控制塊中的變量 ulNotifiedValue 與函數 xTaskNotify 第 2 個參數 ulValue 實現或操作,比如ulValue=0x01, 那么變量的 ulNotifiedValue 的 bit0 = 1,ulValue=0x08, 那么變量的 ulNotifiedValue 的 bit3= 1, 通過這種方式就實現了任務事件標志組。 |
| eIncrement | 接收此消息的任務, 其任務控制塊中的變量 ulNotifiedValue 實現加一操作,此時函數 xTaskNotify 實現的功能等效于函數xTaskNotifyGive, 函數 xTaskNotify 的第二個參數 ulValue 沒有用上。 這種方式用于信號量。 |
| eSetValueWithOverwrite | 接收此消息的任務, 其任務控制塊中的變量 ulNotifiedValue 被設置為函數 xTaskNotify 第 2 個參數 ulValue 的數值,即使等待此消息的任務還沒有收到上一次的數值,即數值被覆蓋了。 這種方式用于消息郵箱,相當于消息隊列覆蓋方式函數xQueueOverwrite()。 |
| eSetValueWithoutOverwrite | 如果接收此消息的任務, 其任務控制塊中的變量ulNotifiedValue 已經被更新,但由于接收此消息的任務還處于阻塞態等待此消息,那么變量 ulNotifiedValue 不可以被更新為函數 xTaskNotify 第 2 個參數 ulValue 的數值, , 此時函數xTaskNotify 會返回 pdFALSE。如果接收此消息的任務, 其任務控制塊中的變量ulNotifiedValue 還沒有被更新, 那么變量 ulNotifiedValue 會被設置為 xTaskNotify 第 2 個參數 ulValue 的數值。這種方式用于消息郵箱,相當于消息隊列長度為 1 時調用函數xQueueSend()。 |
- 第四個參數 對應任務由于獲取不到信號量而進入堵塞態,在中斷中發送了該任務的任務通知信號量,則該任務由堵塞態轉變為就緒態,如果該任務優先級比當前運行的任務優先級高,則pxHigherPriorityTaskWoken會變為pdTRUE 在中斷結束部分可以調用taskYELD()進行任務調度
- 返回值 第三個參數為eSetValueWithoutOverwrite時有可能返回pdFALSE 其他的均返回pdPASS
等待任務通知函數
BaseType_t xTaskNotifyWait(uint32_t ulBitsToClearOnEntry,uint32_t ulBitsToClearOnExit,uint32_t *pulNotificationValue,TickType_t xTicksToWait);等待任務通知函數
- 第一個參數 函數執行前,任務通知變量那些位被清除
- 第二個參數 函數退出前,任務通知變量那些位被清除
- 第三個參數 保存任務控制塊中任務通知變量值
- 第四個參數 沒有消息時,最大等待時間
- 返回值 如果沒有超時返回pdTRUE 超時則返回pdFALSE
本文參考 freertos官方文檔 https://freertos.org/a00110.html
《安富萊 STM32-V6 開發板 FreeRTOS 教程》
總結
以上是生活随笔為你收集整理的freeRtos学习笔记 (8) 任务通知的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: freeRtos学习笔记 (7)信号量
- 下一篇: c# 学习笔记 (1) 类型转换