五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

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

FreeRTOS 筆記_互斥信號量

2023-07-13 14:18 作者:自閉選手的Z23  | 我要投稿

????互斥信號量(Mutex,即 Mutual Exclusion )是FreeRTOS 重要的資源共享機(jī)制。

1 互斥信號量的概念及其作用

????互斥信號量的主要作用是對資源實(shí)現(xiàn)互斥訪問,使用二值信號量也可以實(shí)現(xiàn)互斥訪問的功能,不過互斥信號量與二值信號量有區(qū)別。

下面我們先舉一個(gè)通過二值信號量實(shí)現(xiàn)資源獨(dú)享,即互斥訪問的例子:

運(yùn)行條件:?

◆ 讓兩個(gè)任務(wù) Task1 和 Task2 都運(yùn)行串口打印函數(shù) printf,這里我們就通過二值信號量實(shí)現(xiàn)對函數(shù) printf 的互斥訪問。如果不對函數(shù) printf 進(jìn)行互斥訪問,串口打印容易出現(xiàn)亂碼。

◆ 用計(jì)數(shù)信號量實(shí)現(xiàn)二值信號量只需將計(jì)數(shù)信號量的初始值設(shè)置為 1 即可。

◆ 通過二值信號量實(shí)現(xiàn)對 printf 函數(shù)互斥訪問的兩個(gè)任務(wù)

任務(wù)一:

任務(wù)二:

???

2 優(yōu)先級翻轉(zhuǎn)問題

?有了上面二值信號量的認(rèn)識之后,互斥信號量與二值信號量又有什么區(qū)別呢?

????互斥信號量可以防止優(yōu)先級翻轉(zhuǎn),而二值信號量不支持,下面了解一下優(yōu)先級翻轉(zhuǎn)問題:

運(yùn)行條件:

◆ 創(chuàng)建 3 個(gè)任務(wù) Task1,Task2 和 Task3,優(yōu)先級分別為 3,2,1。?Task1 的優(yōu)先級最高。?

◆ 任務(wù) Task1 和 Task3 互斥訪問串口打印 printf,采用二值信號實(shí)現(xiàn)互斥訪問。

◆ 起初 Task3 通過二值信號量正在調(diào)用 printf,被任務(wù) Task1 搶占,開始執(zhí)行任務(wù) Task1,也就是上圖的起始位置。

運(yùn)行過程描述如下:

◆ 任務(wù) Task1 運(yùn)行的過程需要調(diào)用函數(shù) printf,發(fā)現(xiàn)任務(wù) Task3 正在調(diào)用,任務(wù) Task1 會(huì)被掛起,等待 Task3 釋放函數(shù) printf。?

◆ 在調(diào)度器的作用下,任務(wù) Task3 得到運(yùn)行,Task3 運(yùn)行的過程中,由于任務(wù) Task2 就緒,搶占了 Task3 的運(yùn)行。優(yōu)先級翻轉(zhuǎn)問題就出在這里了,從任務(wù)執(zhí)行的現(xiàn)象上看,任務(wù) Task1 需要等待 Task2 執(zhí)行完畢才有機(jī)會(huì)得到執(zhí)行,這個(gè)與搶占式調(diào)度正好反了,正常情況下應(yīng)該是高優(yōu)先級任務(wù)搶占低優(yōu)先級任務(wù)的執(zhí)行,這里成了高優(yōu)先級任務(wù) Task1 等待低優(yōu)先級任務(wù) Task2 完成。所以這種情況被稱之為優(yōu)先級翻轉(zhuǎn)問題

◆ 任務(wù) Task2 執(zhí)行完畢后,任務(wù) Task3 恢復(fù)執(zhí)行,Task3 釋放互斥資源后,任務(wù) Task1 得到互斥資源, 從而可以繼續(xù)執(zhí)行。 上面就是一個(gè)產(chǎn)生優(yōu)先級翻轉(zhuǎn)問題的現(xiàn)象。


3 FreeRTOS 互斥信號量的實(shí)現(xiàn)

????相對于二值信號量,互斥信號量就是解決了一下優(yōu)先級翻轉(zhuǎn)的問題。

????下圖來說明一下 FreeRTOS 互斥信號量的實(shí)現(xiàn):

運(yùn)行條件:?

◆ 創(chuàng)建 2 個(gè)任務(wù) Task1 和 Task2,優(yōu)先級分別為 1 和 3,任務(wù) Task2 的優(yōu)先級最高。

◆ 任務(wù) Task1 和 Task2 互斥訪問串口打印 printf。?

◆ 使用 FreeRTOS 的互斥信號量實(shí)現(xiàn)串口打印 printf 的互斥訪問。

運(yùn)行過程描述如下:

◆ 低優(yōu)先級任務(wù)Task1 執(zhí)行過程中先獲得互斥資源 printf 的執(zhí)行。此時(shí)任務(wù)Task2 搶占了任務(wù) Task1 的執(zhí)行,任務(wù) Task1 被掛起。任務(wù)Task2 得到執(zhí)行。?

◆ 任務(wù) Task2 執(zhí)行過程中也需要調(diào)用互斥資源,但是發(fā)現(xiàn)任務(wù) Task1 正在訪問,此時(shí)任務(wù) Task1 的優(yōu)先級會(huì)被提升到與Task2 同一個(gè)優(yōu)先級,也就是優(yōu)先級 3,這個(gè)就是所謂的優(yōu)先級繼承(Priority ?inheritance),這樣就有效地防止了優(yōu)先級翻轉(zhuǎn)問題。任務(wù) Task2 被掛起,任務(wù) Task1 有新的優(yōu)先級繼續(xù)執(zhí)行。?

◆ 任務(wù) Task1 執(zhí)行完畢并釋放互斥資源后,優(yōu)先級恢復(fù)到原來的水平。由于互斥資源可以使用,任務(wù) Task2 獲得互斥資源后開始執(zhí)行。

上面就是一個(gè)簡單的 FreeRTOS 互斥信號量的實(shí)現(xiàn)過程。


4 FreeRTOS 中斷方式互斥信號量的實(shí)現(xiàn)

重點(diǎn)的說以下 3 個(gè)函數(shù):

◆ xSemaphoreCreateMutex ()?

◆ xSemaphoreGive ()?

◆ xSemaphoreTake ()

函數(shù) xSemaphoreCreateMutex 用于創(chuàng)建互斥信號量

◆ 返回值,如果創(chuàng)建成功會(huì)返回互斥信號量的句柄,如果由于 FreeRTOSConfig.h 文件中 heap 大小不 足,無法為此互斥信號量提供所需的空間會(huì)返回 NULL。

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

1. 此函數(shù)是基于函數(shù) xQueueCreateMutex 實(shí)現(xiàn)的:

?函數(shù) xQueueCreateMutex 的實(shí)現(xiàn)是基于消息隊(duì)列函數(shù) xQueueGenericCreate 實(shí)現(xiàn)的。

2. 使用此函數(shù)要在 FreeRTOSConfig.h 文件中使能宏定義:

#define configUSE_MUTEXES ????1

舉例:



函數(shù) xSemaphoreGive 用于在任務(wù)代碼中釋放信號量

◆ 第 1 個(gè)參數(shù)是信號量句柄。

◆ 返回值,如果信號量釋放成功返回 pdTRUE,否則返回 pdFALSE,因?yàn)樾盘柫康膶?shí)現(xiàn)是基于消息隊(duì)列,返回失敗的主要原因是消息隊(duì)列已經(jīng)滿了。

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

1. 此函數(shù)是基于消息隊(duì)列函數(shù) xQueueGenericSend 實(shí)現(xiàn)的:

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

3. 使用此函數(shù)前,一定要保證用函數(shù) xSemaphoreCreateBinary(), xSemaphoreCreateMutex() 或者 xSemaphoreCreateCounting()創(chuàng)建了信號量。

4. 此函數(shù)不支持使用 xSemaphoreCreateRecursiveMutex()創(chuàng)建的信號量。

舉例:



函數(shù) xSemaphoreTake 用于在任務(wù)代碼中獲取信號量。

◆ 第 1 個(gè)參數(shù)是信號量句柄。?

◆ 第 2 個(gè)參數(shù)是沒有信號量可用時(shí),等待信號量可用的最大等待時(shí)間,單位系統(tǒng)時(shí)鐘節(jié)拍。

◆ 返回值,如果創(chuàng)建成功會(huì)獲取信號量返回 pdTRUE,否則返回 pdFALSE。

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

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

2. 如果消息隊(duì)列為空且第 2 個(gè)參數(shù)為 0,那么此函數(shù)會(huì)立即返回。

3. 如果用戶將 FreeRTOSConfig.h 文件中的宏定義 INCLUDE_vTaskSuspend 配置為 1 且第 2 個(gè)參數(shù)配 置為 portMAX_DELAY,那么此函數(shù)會(huì)永久等待直到信號量可用。



FreeRTOS 筆記_互斥信號量的評論 (共 條)

分享到微博請遵守國家法律
遂川县| 洛扎县| 湖南省| 怀安县| 河曲县| 都匀市| 交城县| 内黄县| 安吉县| 安多县| 翼城县| 博白县| 乐昌市| 资兴市| 罗平县| 怀集县| 建瓯市| 壤塘县| 嘉荫县| 龙山县| 德保县| 如东县| 丰原市| 新竹市| 连江县| 聂拉木县| 革吉县| 营山县| 民乐县| 保定市| 古田县| 彩票| 吉安市| 安远县| 蚌埠市| 山西省| 镇巴县| 浠水县| 道真| 钟祥市| 曲阳县|