日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

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

發(fā)布時(shí)間:2025/4/16 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 freeRtos学习笔记 (8) 任务通知 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

freeRtos學(xué)習(xí)筆記

freeRtos任務(wù)通知

任務(wù)通知的優(yōu)缺點(diǎn)

  • freeRtos任務(wù)控制塊中包含兩個(gè)32位的變量,用于任務(wù)通知,在一些情況下,任務(wù)通知可以替代信號(hào)量和事件組,并且比信號(hào)量和事件組效率更高。
  • 如果不使用任務(wù)通知,則可以關(guān)閉configUSE_TASK_NOTIFICATIONS宏 在創(chuàng)建任務(wù)時(shí),每個(gè)任務(wù)就可以少8個(gè)字節(jié)的RAM。
  • 任務(wù)通知存放在任務(wù)控制塊中,因此在本任務(wù)中接收本任務(wù)控制塊中的任務(wù)通知。
  • 只有等待通知的任務(wù)才能被堵塞,發(fā)送通知的任務(wù)不會(huì)因?yàn)榘l(fā)送失敗進(jìn)入堵塞狀態(tài)。
  • 發(fā)送任務(wù)通知信號(hào)量函數(shù)

    BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify ); /* 任務(wù)句柄 */void vTaskNotifyGiveFromISR(TaskHandle_t xTaskToNotify, /* 任務(wù)句柄 */BaseType_t *pxHigherPriorityTaskWoken ); /* 高優(yōu)先級(jí)任務(wù)是否被喚醒的狀態(tài)保存 */

    發(fā)送信號(hào)量函數(shù) 任務(wù)通知信號(hào)量加一

    • 第一個(gè)參數(shù) 任務(wù)句柄
    • 第二個(gè)參數(shù) 對(duì)應(yīng)任務(wù)由于獲取不到信號(hào)量而進(jìn)入堵塞態(tài),在中斷中發(fā)送了該任務(wù)的任務(wù)通知信號(hào)量,則該任務(wù)由堵塞態(tài)轉(zhuǎn)變?yōu)榫途w態(tài),如果該任務(wù)優(yōu)先級(jí)比當(dāng)前運(yùn)行的任務(wù)優(yōu)先級(jí)高,則pxHigherPriorityTaskWoken會(huì)變?yōu)閜dTRUE 在中斷結(jié)束部分可以調(diào)用taskYELD()進(jìn)行任務(wù)調(diào)度
    • 返回值 只會(huì)發(fā)會(huì)pdTRUE
    • 注意 任務(wù)通知存放在任務(wù)控制塊內(nèi),所以只需要?jiǎng)?chuàng)建對(duì)應(yīng)任務(wù),并打開任務(wù)通知使能宏即可

    獲取任務(wù)通知信號(hào)量函數(shù)

    uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, /* 選擇是否清零用于任務(wù)通知的 ulNotifiedValue */ TickType_t xTicksToWait ); /* 等待信號(hào)量可用的最大等待時(shí)間 */

    獲取任務(wù)通知信號(hào)量函數(shù)

    • 第一個(gè)參數(shù) 如果為pdFALSE 則該函數(shù)返回前會(huì)將任務(wù)通知信號(hào)量減一,如果為pdTRUE 函數(shù)返回前會(huì)將任務(wù)通知信號(hào)量清零
    • 第二個(gè)參數(shù) 如果沒(méi)有任務(wù)信號(hào)量,最大等待時(shí)間,單位為系統(tǒng)節(jié)拍
    • 返回值 返回任務(wù)當(dāng)前通知值,即在其減一或者清零前的值

    修改任務(wù)通知變量函數(shù)

    BaseType_t xTaskNotify(TaskHandle_t xTaskNotify, /* 任務(wù)句柄 */uint32_t ulValue, /* 更新任務(wù)控制塊中的通知變量值 */eNotifyAction eAction); /* 任務(wù)通知更新模式 */BaseType_t xTaskNotifyFromISR(TaskHandle_t xTaskNotify, /* 任務(wù)句柄 */uint32_t ulValue, /* 更新任務(wù)控制塊中的通知變量值 */eNotifyAction eAction, /* 任務(wù)通知更新模式 */BaseType_t *pxHightPriorityTaskWoken) /* 高優(yōu)先級(jí)任務(wù)是否被喚醒的狀態(tài)保存 */

    修改任務(wù)通知變量函數(shù)

    • 第一個(gè)參數(shù) 任務(wù)句柄
    • 第二個(gè)參數(shù) 要更新的值
    • 第三個(gè)參數(shù) 更新模式
    支持參數(shù)參數(shù)描述
    eNoAction接收此消息的任務(wù), 其任務(wù)控制塊中的變量 ulNotifiedValue 沒(méi)有變化,即函數(shù) xTaskNotify 第 2 個(gè)參數(shù) ulValue 沒(méi)有用上。
    eSetBits接收此消息的任務(wù), 其任務(wù)控制塊中的變量 ulNotifiedValue 與函數(shù) xTaskNotify 第 2 個(gè)參數(shù) ulValue 實(shí)現(xiàn)或操作,比如ulValue=0x01, 那么變量的 ulNotifiedValue 的 bit0 = 1,ulValue=0x08, 那么變量的 ulNotifiedValue 的 bit3= 1, 通過(guò)這種方式就實(shí)現(xiàn)了任務(wù)事件標(biāo)志組。
    eIncrement接收此消息的任務(wù), 其任務(wù)控制塊中的變量 ulNotifiedValue 實(shí)現(xiàn)加一操作,此時(shí)函數(shù) xTaskNotify 實(shí)現(xiàn)的功能等效于函數(shù)xTaskNotifyGive, 函數(shù) xTaskNotify 的第二個(gè)參數(shù) ulValue 沒(méi)有用上。 這種方式用于信號(hào)量。
    eSetValueWithOverwrite接收此消息的任務(wù), 其任務(wù)控制塊中的變量 ulNotifiedValue 被設(shè)置為函數(shù) xTaskNotify 第 2 個(gè)參數(shù) ulValue 的數(shù)值,即使等待此消息的任務(wù)還沒(méi)有收到上一次的數(shù)值,即數(shù)值被覆蓋了。 這種方式用于消息郵箱,相當(dāng)于消息隊(duì)列覆蓋方式函數(shù)xQueueOverwrite()。
    eSetValueWithoutOverwrite如果接收此消息的任務(wù), 其任務(wù)控制塊中的變量ulNotifiedValue 已經(jīng)被更新,但由于接收此消息的任務(wù)還處于阻塞態(tài)等待此消息,那么變量 ulNotifiedValue 不可以被更新為函數(shù) xTaskNotify 第 2 個(gè)參數(shù) ulValue 的數(shù)值, , 此時(shí)函數(shù)xTaskNotify 會(huì)返回 pdFALSE。如果接收此消息的任務(wù), 其任務(wù)控制塊中的變量ulNotifiedValue 還沒(méi)有被更新, 那么變量 ulNotifiedValue 會(huì)被設(shè)置為 xTaskNotify 第 2 個(gè)參數(shù) ulValue 的數(shù)值。這種方式用于消息郵箱,相當(dāng)于消息隊(duì)列長(zhǎng)度為 1 時(shí)調(diào)用函數(shù)xQueueSend()。
    • 第四個(gè)參數(shù) 對(duì)應(yīng)任務(wù)由于獲取不到信號(hào)量而進(jìn)入堵塞態(tài),在中斷中發(fā)送了該任務(wù)的任務(wù)通知信號(hào)量,則該任務(wù)由堵塞態(tài)轉(zhuǎn)變?yōu)榫途w態(tài),如果該任務(wù)優(yōu)先級(jí)比當(dāng)前運(yùn)行的任務(wù)優(yōu)先級(jí)高,則pxHigherPriorityTaskWoken會(huì)變?yōu)閜dTRUE 在中斷結(jié)束部分可以調(diào)用taskYELD()進(jìn)行任務(wù)調(diào)度
    • 返回值 第三個(gè)參數(shù)為eSetValueWithoutOverwrite時(shí)有可能返回pdFALSE 其他的均返回pdPASS

    等待任務(wù)通知函數(shù)

    BaseType_t xTaskNotifyWait(uint32_t ulBitsToClearOnEntry,uint32_t ulBitsToClearOnExit,uint32_t *pulNotificationValue,TickType_t xTicksToWait);

    等待任務(wù)通知函數(shù)

    • 第一個(gè)參數(shù) 函數(shù)執(zhí)行前,任務(wù)通知變量那些位被清除
    • 第二個(gè)參數(shù) 函數(shù)退出前,任務(wù)通知變量那些位被清除
    • 第三個(gè)參數(shù) 保存任務(wù)控制塊中任務(wù)通知變量值
    • 第四個(gè)參數(shù) 沒(méi)有消息時(shí),最大等待時(shí)間
    • 返回值 如果沒(méi)有超時(shí)返回pdTRUE 超時(shí)則返回pdFALSE

    本文參考 freertos官方文檔 https://freertos.org/a00110.html
    《安富萊 STM32-V6 開發(fā)板 FreeRTOS 教程》

    總結(jié)

    以上是生活随笔為你收集整理的freeRtos学习笔记 (8) 任务通知的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。