當(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)
發(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ù) 更新模式
| 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)題。
- 上一篇: freeRtos学习笔记 (7)信号量
- 下一篇: STM32 RTC BKP备份数据区数据