最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

FreeRTOS的事件標志組

2023-07-10 20:40 作者:自閉選手的Z23  | 我要投稿

????事件標志組是實現(xiàn)多任務(wù)同步的有效機制之一。也許有不理解的初學(xué)者會問采用事件標志組多麻煩, 搞個全局變量不是更簡單?其實不然,在裸機編程時,使用全局變量的確比較方便,但是在加上 RTOS 后 就是另一種情況了。使用全局變量相比事件標志組主要有如下三個問題:

◆ 使用事件標志組可以讓 RTOS 內(nèi)核有效地管理任務(wù),而全局變量是無法做到的,任務(wù)的超時等機制需要用戶自己去實現(xiàn)。

◆ 使用了全局變量就要防止多任務(wù)的訪問沖突,而使用事件標志組則處理好了這個問題,用戶無需擔(dān)心。?

◆ 使用事件標志組可以有效地解決中斷服務(wù)程序和任務(wù)之間的同步問題


FreeRTOS 任務(wù)間事件標志組的實現(xiàn)

任務(wù)間事件標志組的實現(xiàn)是指各個任務(wù)之間使用事件標志組實現(xiàn)任務(wù)的通信或者同步機制。 ?FreeRTOS 中事件標志的實現(xiàn),根據(jù)用戶在 FreeRTOSConfig.h 文件中的配置:

◆ #define configUSE_16_BIT_TICKS ????1?

配置宏定義 configUSE_16_BIT_TICKS 為 1 時,每創(chuàng)建一個事件標志組,用戶可以使用的事件標志是 8 個。

◆ #define configUSE_16_BIT_TICKS ????0

配置宏定義 configUSE_16_BIT_TICKS 為 0 時,每創(chuàng)建一個事件標志組,用戶可以使用的事件標志是 24 個

8 個和 24 個事件標志應(yīng)該怎么理解呢?其實就是定義了一個 16 位變量,僅使用了低 8bit?

或者定義了一個 32 位變量,僅使用了低 24bit。每一個 bit 用 0 和 1 兩種狀態(tài)來代表事件標志。FreeRTOS 上就是將事件標志存儲到了 EventBits_t 類型的變量中:


下面通過如下的框圖來說明一下 FreeRTOS 事件標志的實現(xiàn),

?2 個任務(wù):Task1 和 Task2

運行過程描述如下:?

◆ 任務(wù) Task1 運行過程中調(diào)用函數(shù) xEventGroupWaitBits,等待事件標志位被設(shè)置,任務(wù) Task1 由運行態(tài)進入到阻塞態(tài)。

◆ 任務(wù) Task2 設(shè)置 Task1 等待的事件標志,任務(wù) Task1 由阻塞態(tài)進入到就緒態(tài),在調(diào)度器的作用下由就緒態(tài)又進入到運行態(tài)。


FreeRTOS 中斷方式事件標志組的實現(xiàn)

FreeRTOS 中斷方式事件標志組的實現(xiàn)是指中斷函數(shù)和 FreeRTOS 任務(wù)之間使用事件標志。下圖來說明一下 FreeRTOS 事件標志的實現(xiàn):

創(chuàng)建一個任務(wù)和一個串口接收中斷

◆ 任務(wù) Task1 運行過程中調(diào)用函數(shù) xEventGroupWaitBits,等待事件標志位被設(shè)置,任務(wù) Task1 由運行態(tài)進入到阻塞態(tài)。

◆ Task1 阻塞的情況下,串口接收到數(shù)據(jù)進入到了串口中斷服務(wù)程序,在串口中斷服務(wù)程序中設(shè)置 Task1 等待的事件標志,任務(wù) Task1 由阻塞態(tài)進入到就緒態(tài),在調(diào)度器的作用下由就緒態(tài)又進入到運行態(tài)。?

上面就是一個簡單的 FreeRTOS 中斷方式事件標志通信過程。

實際應(yīng)用中,中斷方式的消息機制要注意以下四個問題:

◆ 中斷函數(shù)的執(zhí)行時間越短越好,防止其它低于這個中斷優(yōu)先級的異常不能得到及時響應(yīng)。

◆ 實際應(yīng)用中,建議不要在中斷中實現(xiàn)消息處理,用戶可以在中斷服務(wù)程序里面發(fā)送消息通知任務(wù),在任務(wù)中實現(xiàn)消息處理,這樣可以有效地保證中斷服務(wù)程序的實時響應(yīng)。同時此任務(wù)也需要設(shè)置為高優(yōu)先級,以便退出中斷函數(shù)后任務(wù)可以得到及時執(zhí)行。

◆ 中斷服務(wù)程序中一定要調(diào)用專用于中斷的事件標志設(shè)置函數(shù),即以 FromISR 結(jié)尾的函數(shù)。 ◆ 如果 FreeRTOS 工程的中斷函數(shù)中沒有調(diào)用 FreeRTOS 的事件標志組 API 函數(shù),與裸機編程是 一樣的;如果調(diào)用了,退出的時候要檢測是否有高優(yōu)先級任務(wù)就緒,如果有就緒的,需要在退出中斷后進行任務(wù)切換。



重點的了解以下 4 個函數(shù):?

◆ xEventGroupCreate()?

◆ xEventGroupWaitBits()?

◆ xEventGroupSetBits()?

◆ xEventGroupSetBitsFromISR()


函數(shù) xEventGroupCreate 用于創(chuàng)建事件標志組。

◆ 返回值,如果創(chuàng)建成功,此函數(shù)返回事件標志組的句柄,

如果 FreeRTOSConfig.h 文件中定義的 heap 空間不足會返回 NULL?

#define configTOTAL_HEAP_SIZE???????????? ( ( size_t ) ( 17 * 1024 ) )


函數(shù) xEventGroupSetBits 用于設(shè)置指定的事件標志位為 1。?

◆ 第 1 個參數(shù)是事件標志組句柄。?

◆ 第 2 個參數(shù)表示 24 個可設(shè)置的事件標志位,EventBits_t 是定義的 32 位變量,低 24 位用于事件標志設(shè)置。變量 uxBitsToSet 的低 24 位的某個位設(shè)置為 1,那么被設(shè)置的事件標志組的相應(yīng)位就設(shè)置為 1。變量 uxBitsToSet 設(shè)置為 0 的位對事件標志相應(yīng)位沒有影響。比如設(shè)置變量 uxBitsToSet = 0x0003 就表示將事件標志的位 0 和位 1 設(shè)置為 1,其余位沒有變化。

返回當(dāng)前的事件標志組數(shù)值。

使用這個函數(shù)要注意以下問題:

1. 使用前一定要保證事件標志組已經(jīng)通過函數(shù) xEventGroupCreate 創(chuàng)建了。

2. 此函數(shù)是用于任務(wù)代碼中調(diào)用的,故不可以在中斷服務(wù)程序中調(diào)用此函數(shù),中斷服務(wù)程序中使用的是 xEventGroupSetBitsFromISR

3. 用戶通過參數(shù) uxBitsToSet 設(shè)置的標志位并不一定會保留到此函數(shù)的返回值中,下面舉兩種情況:?

????a. 調(diào)用此函數(shù)的過程中,其它高優(yōu)先級的任務(wù)就緒了,并且也修改了事件標志,此函數(shù)返回的事件標志位會發(fā)生變化。

????b. 調(diào)用此函數(shù)的任務(wù)是一個低優(yōu)先級任務(wù),通過此函數(shù)設(shè)置了事件標志后,讓一個等待此事件標志 的高優(yōu)先級任務(wù)就緒了,會立即切換到高優(yōu)先級任務(wù)去執(zhí)行,相應(yīng)的事件標志位會被函數(shù) xEventGroupWaitBits 清除掉,等從高優(yōu)先級任務(wù)返回到低優(yōu)先級任務(wù)后,函數(shù) xEventGroupSetBits 的返回值已經(jīng)被修改。


函數(shù)描述: 函數(shù) xEventGroupSetBits 用于設(shè)置指定的事件標志位為 1。

前兩個參數(shù)和xEventGroupSetBits 一樣

◆ 第 3 個參數(shù)用于保存是否有高優(yōu)先級任務(wù)準備就緒。如果函數(shù)執(zhí)行完畢后,此參數(shù)的數(shù)值是 pdTRUE, 說明有高優(yōu)先級任務(wù)要執(zhí)行,否則沒有。

◆ 返回值,如果消息成功發(fā)送給 daemon 任務(wù)(就是 FreeRTOS 的定時器任務(wù))返回 pdPASS,否則返回 pdFAIL,另外 daemon 任務(wù)中的消息隊列滿了也會返回 pdFAIL。

使用這個函數(shù)要注意以下問題:

1. 使用前一定要保證事件標志已經(jīng)通過函數(shù) xEventGroupCreate 創(chuàng)建了。

同時要在 FreeRTOSConfig.h 文件中使能如下三個宏定義:

#define INCLUDE_xEventGroupSetBitFromISR ????1?

#define configUSE_TIMERS ????1?

#define INCLUDE_xTimerPendFunctionCall ????1?

2. 函數(shù)是用于中斷服務(wù)程序中調(diào)用的,故不可以在任務(wù)代碼中調(diào)用此函數(shù),任務(wù)代碼中使用的是 xEventGroupSetBits。?

3. 函數(shù) xEventGroupSetBitsFromISR 對事件標志組的操作是不確定性操作,因為不知道當(dāng)前有多少個任務(wù)在等待此事件標志。

而 FreeRTOS 不允許在中斷服務(wù)程序和臨界段中執(zhí)行不確定性操作。為了不在中斷服務(wù)程序中執(zhí)行,就通過此函數(shù)給 FreeRTOS 的 daemon 任務(wù)(就是 FreeRTOS 的定時器任務(wù))發(fā)送消息,在 daemon 任務(wù)中執(zhí)行事件標志的置位操作。同時也為了不在臨界段中執(zhí)行此不確定 操作,將臨界段改成由調(diào)度鎖來完成。這樣不確定性操作在中斷服務(wù)程序和臨界段中執(zhí)行的問題就都得到解決了。

4. 由于函數(shù) xEventGroupSetBitsFromISR 對事件標志的置位操作是在 daemon 任務(wù)里面執(zhí)行的,如果想讓置位操作立即生效,即讓等此事件標志的任務(wù)能夠得到及時執(zhí)行,需要設(shè)置 daemon 任務(wù)的優(yōu)先級高于使用此事件標志組的所有其它任務(wù)。

5. 通過下面的使用舉例重點一下函數(shù) xEventGroupSetBitsFromISR 第三個參數(shù)的規(guī)范用法

函數(shù) xEventGroupWaitBits 等待事件標志被設(shè)置。?

◆ 第 1 個參數(shù)是事件標志組句柄。?

◆ 第 2 個參數(shù)表示等待 24 個事件標志位中的指定標志,此參數(shù)切不可設(shè)置為 0。?

◆ 第 3 個參數(shù)選擇是否清除已經(jīng)被置位的事件標志

????如果這個參數(shù)設(shè)置為 pdTRUE,且函數(shù) xEventGroupWaitBits 在參數(shù) xTicksToWait 設(shè)置的溢出時間內(nèi)返回,那么相應(yīng)被設(shè)置的事件標志位會被清零。如果這個參數(shù)設(shè)置為 pdFALSE,對已經(jīng)被設(shè)置的事件標志位沒有影響。

◆ 第 4 個參數(shù)選擇是否等待所有的標志位都被設(shè)置

????如果這個參數(shù)設(shè)置為 pdTRUE,要等待第 2 個參 數(shù) uxBitsToWaitFor 所指定的標志位全部被置 1,函數(shù)才可以返回。當(dāng)然,超出了在參數(shù) xTicksToWait 設(shè)置的溢出時間也是會返回的。

????如果這個參數(shù)設(shè)置為 pdFALSE,第 2 個參數(shù) uxBitsToWaitFor 所指定的任何標志位被置 1,函數(shù)都會返回,超出溢出時間也會返回。

◆ 第 5 個參數(shù)設(shè)置等待時間,單位時鐘節(jié)拍周期。如果設(shè)置為 portMAX_DELAY,表示永久等待。?

◆ 返回值,由于設(shè)置的時間超時或者指定的事件標志位被置 1,導(dǎo)致函數(shù)退出時返回的事件標志組數(shù)值。

使用這個函數(shù)要注意以下問題:

1. 此函數(shù)切不可在中斷服務(wù)程序中調(diào)用。

2. 通過函數(shù)的返回值,用戶可以檢測是哪個事件標志位被置 1 了

????◆ 如果由于設(shè)置的等待時間超時,函數(shù)的返回值可會有部分事件標志位被置 1。?

????◆ 如果由于指定的事件標志位被置1而返回,并且設(shè)置了這個函數(shù)的參數(shù)xClearOnExit為pdTRUE,那么此函數(shù)的返回值是清零前的事件標志組數(shù)值。?

????????另外,調(diào)用此函數(shù)的任務(wù)在離開阻塞狀態(tài)到退出函數(shù) xEventGroupWaitBits 之間這段時間,如果一個 高優(yōu)先級的任務(wù)搶占執(zhí)行了,并且修改了事件標志位,那么此函數(shù)的返回值會跟當(dāng)前的事件標志組數(shù)值不同

使用舉例:




FreeRTOS的事件標志組的評論 (共 條)

分享到微博請遵守國家法律
高唐县| 侯马市| 丹棱县| 阳朔县| 瑞安市| 枣强县| 利辛县| 仁寿县| 大理市| 宣城市| 潞西市| 苍山县| 长垣县| 石泉县| 连云港市| 当雄县| 将乐县| 台湾省| 大关县| 滨州市| 长武县| 镇平县| 青州市| 南充市| 城固县| 元江| 陆丰市| 本溪| 永和县| 湖口县| 桓台县| 巨野县| 镶黄旗| 鄂伦春自治旗| 甘谷县| 集贤县| 乌恰县| 许昌县| 昆明市| 绥阳县| 常山县|