日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

freeRtos学习笔记 (8) 任务通知

發布時間:2025/4/16 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 freeRtos学习笔记 (8) 任务通知 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

freeRtos學習筆記

freeRtos任務通知

任務通知的優缺點

  • freeRtos任務控制塊中包含兩個32位的變量,用于任務通知,在一些情況下,任務通知可以替代信號量和事件組,并且比信號量和事件組效率更高。
  • 如果不使用任務通知,則可以關閉configUSE_TASK_NOTIFICATIONS宏 在創建任務時,每個任務就可以少8個字節的RAM。
  • 任務通知存放在任務控制塊中,因此在本任務中接收本任務控制塊中的任務通知。
  • 只有等待通知的任務才能被堵塞,發送通知的任務不會因為發送失敗進入堵塞狀態。
  • 發送任務通知信號量函數

    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) 任务通知的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。