FreeRTOS 筆記_任務(wù)計(jì)數(shù)信號(hào)量
????基于任務(wù)通知(Task Notifications) 的計(jì)數(shù)信號(hào)量是FreeRTOS 計(jì)數(shù)信號(hào)量的另一種實(shí)現(xiàn)方式,這種方式實(shí)現(xiàn)的計(jì)數(shù)信號(hào)量稱之為任務(wù)計(jì)數(shù)信號(hào)量。任務(wù)計(jì)數(shù)信號(hào)量效率更高, 需要的 RAM 空間更小。
1?任務(wù)通知介紹
????FreeRTOS 每個(gè)已經(jīng)創(chuàng)建的任務(wù)都有一個(gè)任務(wù)控制塊(task control block),任務(wù)控制塊就是一個(gè)結(jié)構(gòu)體變量,用于記錄任務(wù)的相關(guān)信息。
????結(jié)構(gòu)體變量中有一個(gè) 32 位的變量成員 ulNotifiedValue 是專門用于任務(wù)通知的。
????通過任務(wù)通知方式可以實(shí)現(xiàn)計(jì)數(shù)信號(hào)量,二值信號(hào)量,事件標(biāo)志組和消息郵箱(消息郵箱就是消息隊(duì)列長(zhǎng)度為 1 的情況)。使用方法與事件標(biāo)志組和信號(hào)量基本相同,只是換了不同的函數(shù)來實(shí)現(xiàn)。任務(wù)通知方式實(shí)現(xiàn)的計(jì)數(shù)信號(hào)量,二值信號(hào)量,事件標(biāo)志組和消息郵箱是通過修改變量ulNotifiedValue 實(shí)現(xiàn)的:
????◆ 設(shè)置接收任務(wù)控制塊中的變量 ulNotifiedValue 可以實(shí)現(xiàn)消息郵箱。
???? ◆ 如果接收任務(wù)控制塊中的變量 ulNotifiedValue 還沒有被其接收到,也可以用新數(shù)據(jù)覆蓋原有數(shù)據(jù) ,這就是覆蓋方式的消息郵箱。
???? ◆ 設(shè)置接收任務(wù)控制塊中的變量 ulNotifiedValue 的 bit0-bit31 數(shù)值可以實(shí)現(xiàn)事件標(biāo)志組。?
????◆ 設(shè)置接收任務(wù)控制塊中的變量 ulNotifiedValue 數(shù)值進(jìn)行加一或者減一操作可以實(shí)現(xiàn)計(jì)數(shù)信號(hào)量和二值信號(hào)量。
2?任務(wù)計(jì)數(shù)信號(hào)量
????計(jì)數(shù)信號(hào)量就是對(duì)一個(gè)變量進(jìn)行計(jì)數(shù),變量的范圍是 從 0 到用戶創(chuàng)建計(jì)數(shù)信號(hào)量時(shí)所設(shè)置的大小。當(dāng)計(jì)數(shù)變量大于 0 的時(shí)候計(jì)數(shù)信號(hào)量管理的資源才可以使用, 計(jì)數(shù)變量的具體數(shù)值就是可用的資源大小。
????任務(wù)計(jì)數(shù)信號(hào)量與計(jì)數(shù)信號(hào)量要實(shí)現(xiàn)的功能是一樣的,不同的是調(diào)用的函數(shù)和使用的計(jì)數(shù)變量:
◆ 任務(wù)計(jì)數(shù)信號(hào)量的計(jì)數(shù)變量是通過任務(wù)控制塊中的一個(gè) 32 位變量 ulNotifiedValue 實(shí)現(xiàn)計(jì)數(shù)。計(jì)數(shù)信號(hào)量創(chuàng)建后會(huì)有自己的計(jì)數(shù)變量。?
◆ 任務(wù)計(jì)數(shù)信號(hào)量是通過函數(shù) ulTaskNotifyTake()替代函數(shù) xSemaphoreTake()實(shí)現(xiàn)資源獲取,即對(duì)計(jì)數(shù)信號(hào)量數(shù)值進(jìn)行減一操作。
◆ 任務(wù)計(jì)數(shù)信號(hào)量是通過函數(shù) xTaskNotifyGive() 和 vTaskNotifyGiveFromISR()替代函數(shù) xSemaphoreGive() 和 xSemaphoreGiveFromISR()實(shí)現(xiàn)資源釋放,即對(duì)計(jì)數(shù)信號(hào)量的數(shù)值進(jìn) 行加一操作。
3?任務(wù)計(jì)數(shù)信號(hào)量 API?函數(shù)
◆ xTaskNotifyGive?
◆ vTaskNotifyGiveFromISR?
◆ ulTaskNotifyTake
函數(shù) xTaskNotifyGive 用于釋放信號(hào)量(含任務(wù)二值信號(hào)量,任務(wù)計(jì)數(shù)信號(hào)量)。
◆ 第 1 個(gè)參數(shù)是任務(wù)句柄。?
◆ 返回值,僅有一個(gè)返回值 pdPASS。
????使用這個(gè)函數(shù)要注意以下問題:
1. 任務(wù)信號(hào)量的初始計(jì)數(shù)值是 0。任務(wù)信號(hào)量不像前面章節(jié)講解的信號(hào)量,無需單獨(dú)創(chuàng)建即可使用。?
2. 默認(rèn)配置此函數(shù)可以使用的的宏定義已經(jīng)在 FreeRTOS.h 文件中使能:?
#define configUSE_TASK_NOTIFICATIONS ????1?
當(dāng)然,如果用戶不需要使用任務(wù)通知功能相關(guān)的函數(shù),可以在 FreeRTOSConfig.h 文件中配置此宏定義為 0 來禁止,這樣創(chuàng)建的每個(gè)任務(wù)可以節(jié)省 8 個(gè)字節(jié)的需求。?
3. 此函數(shù)是用于任務(wù)代碼中調(diào)用的,故不可以在中斷服務(wù)程序中調(diào)用此函數(shù),中斷服務(wù)程序中使用的是 vTaskNotifyGiveFromISR。
函數(shù) vTaskNotifyGiveFromISR 用于釋放信號(hào)量(含任務(wù)二值信號(hào)量,任務(wù)計(jì)數(shù)信號(hào)量)。
◆ 第 1 個(gè)參數(shù)是任務(wù)句柄。?
◆ 第2 個(gè)參數(shù)用于保存是否有高優(yōu)先級(jí)任務(wù)準(zhǔn)備就緒。如果函數(shù)執(zhí)行完畢后,此參數(shù)的數(shù)值是 pdTRUE, 說明有高優(yōu)先級(jí)任務(wù)要執(zhí)行,否則沒有
舉例:
函數(shù) xTaskNotifyGive 用于釋放信號(hào)量(含任務(wù)二值信號(hào)量,任務(wù)計(jì)數(shù)信號(hào)量)。
◆ 第 1 個(gè)參數(shù)配置為 pdFALSE 表示函數(shù)返回前用于任務(wù)信號(hào)量的內(nèi)部變量 ulNotifiedValue數(shù)值減一,這種方式用于任務(wù)計(jì)數(shù)信號(hào)量。
????參數(shù)配置為 pdTRUE 表示函數(shù)返回前用于任務(wù)信號(hào)量的內(nèi)部變量 ulNotifiedValue數(shù)值被清零,這種方式用于任務(wù)二值信號(hào)量。
◆ 第 2 個(gè)參數(shù)是沒有任務(wù)信號(hào)量可用時(shí),等待信號(hào)量可用的最大等待時(shí)間,單位系統(tǒng)時(shí)鐘節(jié)拍。
舉例: