STM32 FreeRTOS 信號量

信號量的簡介

reeRTOS中的信號量是一種用于任務間同步和資源管理的機制。信號量可以是二進制的(只能取0或1)也可以是計數型的(可以是任意正整數)。信號量的基本操作包括“獲取”和“釋放”。

比如動車上的衛生間,一個衛生間同時只能容納一個人,由指示燈來表示是否有人在使用。當我們想使用衛生間的時候,有如下過程:

1、判斷衛生間是否有人使用(判斷信號量是否有資源)

2、衛生間空閑(信號量有資源),那么就可以直接進入衛生間(獲取信號量成功)

3、衛生間使用中(信號量沒有資源),那么這個人可以選擇不上衛生間(獲取信號量失敗),也可以在門口等待(任務阻塞)

信號量與隊列的區別如下:

信號量

隊列

主要用于管理對共享資源的訪問,確保在同一時刻只有一個任務可以訪問共享資源

用于任務之間的數據通信,通過在任務之間傳遞消息,實現信息的傳遞和同步。

可以是二進制信號量(Binary Semaphore)或計數信號量(Counting Semaphore)

存儲和傳遞消息的數據結構,任務可以發送消息到隊列,也可以從隊列接收消息。

適用于對資源的互斥訪問,控制任務的執行順序,或者限制同時訪問某一資源的任務數量。

適用于在任務之間傳遞數據,實現解耦和通信。

二值信號量?

二值信號量(Binary Semaphore)是一種特殊類型的信號量,它只有兩個可能的值:0和1。這種信號量主要用于實現對共享資源的互斥訪問或者任務之間的同步。

  • 兩個狀態: 二值信號量只能處于兩個狀態之一,通常用0和1表示。當信號量的值為0時,表示資源不可用;當值為1時,表示資源可用。
  • 互斥訪問: 常用于控制對共享資源的互斥訪問,確保在同一時刻只有一個任務可以訪問共享資源。任務在訪問資源之前會嘗試獲取信號量,成功則繼續執行,失敗則等待。
  • 任務同步: 也可以用于任務之間的同步,例如一個任務等待另一個任務完成某個操作。

信號量 API 函數允許指定阻塞時間。 阻塞時間表示當一個任務試圖“獲取”信號量時, 如果信號不是立即可用,那么該任務進入阻塞狀態的最大 “tick” 數。 如果 多個任務在同一個信號量上阻塞,那么具有最高優先級的任務將在下次信號量可用時最先解除阻塞

可將二進制信號量視為僅能容納一個項目的隊列。 因此,隊列只能為空或滿(因此稱為二值)。 使用隊列的任務和中斷 不在乎隊列容納的是什么——它們只想知道隊列是空的還是滿的。 可以 利用該機制來同步任務和中斷。

二值信號量相關函數:

函數

描述

xSemaphoreCreateBinary()

使用動態方式創建二值信號量

xSemaphoreCreateBinaryStatic()

使用靜態方式創建二值信號量

xSemaphoreGive()

釋放信號量

xSemaphoreGiveFromISR()

在中斷中釋放信號量

xSemaphoreTake()

獲取信號量

xSemaphoreTakeFromISR()

在中斷中獲取信號量

?計數型信號量

正如二進制信號量可以被認為是長度為 1 的隊列那樣,計數信號量也可以被認為是長度大于 1 的隊列。 信號量的用戶對存儲在隊列中的數據不感興趣,他們只關心隊列是否為空。

計數信號量通常用于兩種情況:

1、事件計數:在此使用方案中,每次事件發生時,事件處理程序將“給出”一個信號量(信號量計數值遞增) ,并且 處理程序任務每次處理事件(信號量計數值遞減)時“獲取”一個信號量。因此,計數值是 已發生的事件數與已處理的事件數之間的差值。在這種情況下, 創建信號量時計數值可以為零。

2、資源管理:在此使用情景中,計數值表示可用資源的數量。要獲得對資源的控制權,任務必須首先獲取 一個信號量——同時遞減信號量計數值。當計數值達到零時,表示沒有空閑資源可用。當任務使用完資源時, “返還”一個信號量——同時遞增信號量計數值。在這種情況下, 創建信號量時計數值可以等于最大計數值。

計數型信號量相關函數:

函數

描述

xSemaphoreCreateCounting()

使用動態方法創建計數型信號量。

xSemaphoreCreateCountingStatic()

使用靜態方法創建計數型信號量

uxSemaphoreGetCount()

獲取信號量的計數值

優先級翻轉簡介?

優先級翻轉是一個在實時系統中可能出現的問題,特別是在多任務環境中。該問題指的是一個較低優先級的任務阻塞了一個較高優先級任務的執行,從而導致高優先級任務無法及時完成。

典型的優先級翻轉場景如下:

  • 任務A(高優先級):擁有高優先級,需要訪問共享資源,比如一個關鍵數據結構。
  • 任務B(低優先級):擁有低優先級,目前正在訪問該共享資源。
  • 任務C(中優先級):位于任務A和任務B之間,具有介于兩者之間的優先級。

具體流程如下:

  1. 任務A開始執行,但由于任務B正在訪問共享資源,任務A被阻塞等待。
  2. 任務C獲得執行權,由于優先級高于任務B,它可以搶占任務B。
  3. 任務C執行完成后,任務B被解除阻塞,開始執行,完成后釋放了共享資源。
  4. 任務A重新獲取執行權,繼續執行。

這個過程中,任務A因為資源被占用而被阻塞,而任務B卻被中優先級的任務C搶占,導致任務B無法及時完成。這種情況稱為優先級翻轉,因為任務C的介入翻轉了高優先級任務A的執行順序。

互斥信號量?

互斥信號量是包含優先級繼承機制的二進制信號量。二進制信號量能更好實現實現同步(任務間或任務與中斷之間), 而互斥信號量有助于更好實現簡單互斥(即相互排斥)。

優先級繼承是一種解決實時系統中任務調度引起的優先級翻轉問題的機制。在具體的任務調度中,當一個高優先級任務等待一個低優先級任務所持有的資源時,系統會提升低優先級任務的優先級,以避免高優先級任務長時間等待的情況。

優先級繼承無法完全解決優先級翻轉,只是在某些情況下將影響降至最低。

不能在中斷中使用互斥信號量,原因如下:

  • 互斥信號量使用的優先級繼承機制要求從任務中(而不是從中斷中)獲取和釋放互斥信號量。
  • 中斷無法保持阻塞來等待一個被互斥信號量保護的資源。

互斥信號量相關函數:

函數

描述

xSemaphoreCreateMutex()

使用動態方法創建互斥信號量。

xSemaphoreCreateMutexStatic()

使用靜態方法創建互斥信號量。

互斥信號量的獲取和釋放函數與二值信號量的相應函數相似,但有一個重要的區別:互斥信號量不支持在中斷服務程序中直接調用。注意,當創建互斥信號量時,系統會自動進行一次信號量的釋放操作。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/66577.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66577.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66577.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android SystemUI——系統快捷設置面板(十三)

通過前面的內容我們了解了 SystemUI 的啟動流程以及相關組件的加載流程,同時也詳細介紹了導航欄的創建和加載流程,對于 SystemUI 的組件來說,除了導航欄之外,下拉快捷設置面板也是比較重要的一個組件。 一、快捷設置面板 快捷設置面板(Quick Settings, QS)是 Android 系…

C 語言雛啟:擘畫代碼乾坤,諦觀編程奧宇之初瞰

大家好啊,我是小象?(?ω?)? 我的博客:Xiao Xiangζ????? 很高興見到大家,希望能夠和大家一起交流學習,共同進步。* 這一課主要是讓大家初步了解C語言,了解我們的開發環境,main函數,庫…

VSCode下EIDE插件開發STM32

VSCode下STM32開發環境搭建 本STM32教程使用vscode的EIDE插件的開發環境,完全免費,有管理代碼文件的界面,不需要其它IDE。 視頻教程見本人的 VSCodeEIDE開發STM32 安裝EIDE插件 Embedded IDE 嵌入式IDE 這個插件可以幫我們管理代碼文件&am…

Linux內核編程(二十一)USB驅動開發

一、驅動類型 USB 驅動開發主要分為兩種:主機側的驅動程序和設備側的驅動程序。一般我們編寫的都是主機側的USB驅動程序。 主機側驅動程序用于控制插入到主機中的 USB 設備,而設備側驅動程序則負責控制 USB 設備如何與主機通信。由于設備側驅動程序通常與…

論文筆記-arXiv2025-A survey about Cold Start Recommendation

論文筆記-arXiv2025-Cold-Start Recommendation towards the Era of Large Language Models: A Comprehensive Survey and Roadmap 面向大語言模型(LLMs)時代的冷啟動推薦:全面調研與路線圖1.引言2.前言3.內容特征3.1數據不完整學習3.1.1魯棒…

C#使用WMI獲取控制面板中安裝的所有程序列表

C#使用WMI獲取控制面板中安裝的所有程序列表 WMI 全稱Windows Management Instrumentation,Windows Management Instrumentation是Windows中用于提供共同的界面和對象模式以便訪問有關操作系統、設備、應用程序和服務的管理信息。如果此服務被終止,多數基于 Windo…

風光并網對電網電能質量影響的matlab/simulink仿真建模

這個課題早在一幾年的時候比較熱門,之前作電科院配電網的一個項目中也有所涉及,我把其中一部分經典仿真模型思路分享給大家,電能質量影響這部分,我在模型中主要體現的就是不同容量的光伏、風電接入,對并網點的電壓影響…

Ubuntu 24.04 LTS linux 文件權限

Ubuntu 24.04 LTS 文件權限 讀權限 :允許查看文件的內容。寫權限 (w):允許修改文件的內容。執行權限 (x):允許執行文件(對于目錄來說,是進入目錄的權限)。 文件權限通常與三類用戶相關聯: 文…

第13章:Python TDD完善貨幣加法運算(二)

寫在前面 這本書是我們老板推薦過的,我在《價值心法》的推薦書單里也看到了它。用了一段時間 Cursor 軟件后,我突然思考,對于測試開發工程師來說,什么才更有價值呢?如何讓 AI 工具更好地輔助自己寫代碼,或許…

.Net Core微服務入門全紀錄(六)——EventBus-事件總線

系列文章目錄 1、.Net Core微服務入門系列(一)——項目搭建 2、.Net Core微服務入門全紀錄(二)——Consul-服務注冊與發現(上) 3、.Net Core微服務入門全紀錄(三)——Consul-服務注…

C#防止重復提交

C#防止重復提交 文章目錄 C#防止重復提交前言防止重復提交的思路Web API 防止重復提交代碼實現代碼講解使用方法 MVC防止重復提交總結 前言 當用戶在前端進行提交數據時,如果網絡出現卡頓和前端沒有給出響應的話顧客通常都會狂點提交按鈕,這樣就很容易導…

python學opencv|讀取圖像(三十九 )閾值處理Otsu方法

【1】引言 前序學習了5種閾值處理方法,包括(反)閾值處理、(反)零值處理和截斷處理,還學習了一種自適應處理方法,相關文章鏈接為: python學opencv|讀取圖像(三十三)閾值處理-灰度圖像-CSDN博客 python學o…

嵌入式硬件篇---PID控制

文章目錄 前言第一部分:連續PID1.比例(Proportional,P)控制2.積分(Integral,I)控制3.微分(Derivative,D)控制4.PID的工作原理5..實質6.分析7.各種PID控制器P控…

日志收集Day001

1.ElasticSearch 作用:日志存儲和檢索 2.單點部署Elasticsearch與基礎配置 rpm -ivh elasticsearch-7.17.5-x86_64.rpm 查看配置文件yy /etc/elasticsearch/elasticsearch.yml(這里yy做了別名,過濾掉空行和注釋行) yy /etc/el…

集合帖:前綴和及差分模板題 ← 一維及二維

【一維前綴和及一維差分知識點】 ● 一維“前綴和數組”預處理過程:cin>>a[i], sum[i]sum[i-1]a[i] 或者 cin>>sum[i], sum[i]sum[i-1] (1≤i≤n) ● 一維“區間和”計算過程:sum[y]-sum[x-1] (y…

《offer 來了:Java 面試核心知識點精講 -- 框架篇》(附資源)

繼上篇文章介紹了《offer 來了:Java 面試核心知識點精講 -- 原理篇》書后,本文章再給大家推薦兄弟篇 《offer來了:Java面試核心知識點精講--框架篇》, 簡直就是為Java開發者量身定制的面試神器。 本書是對Java程序員面試中常見的…

Low-Level 大一統:如何使用Diffusion Models完成視頻超分、去雨、去霧、降噪等所有Low-Level 任務?

Diffusion Models專欄文章匯總:入門與實戰 前言:視頻在傳輸過程中常常因為各種因素(如惡劣天氣、噪聲、壓縮和傳感器分辨率限制)而出現質量下降,這會嚴重影響計算機視覺任務(如目標檢測和視頻監控)的性能。現有的視頻修復方法雖然取得了一些進展,但通常只能針對特定的退…

Video-RAG:一種將視頻RAG新框架

1. 摘要及主要貢獻點 摘要: 檢索增強生成(RAG)是一種強大的策略,通過檢索與查詢相關的外部知識并將其整合到生成過程中,以解決基礎模型生成事實性錯誤輸出的問題。然而,現有的RAG方法主要集中于文本信息&…

Docker Load后存儲的鏡像及更改鏡像存儲目錄的方法

Docker Load后存儲的鏡像及更改鏡像存儲目錄的方法 Docker Load后存儲的鏡像更改鏡像存儲目錄的方法腳本說明注意事項Docker作為一種開源的應用容器引擎,已經廣泛應用于軟件開發、測試和生產環境中。通過Docker,開發者可以將應用打包成鏡像,輕松地進行分發和運行。而在某些場…

【零基礎入門unity游戲開發——unity通用篇37】鼠標指針(光標)修改隱藏鎖定(基于unity6開發介紹)

考慮到每個人基礎可能不一樣,且并不是所有人都有同時做2D、3D開發的需求,所以我把 【零基礎入門unity游戲開發】 分為成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要講解C#的基礎語法,包括變量、數據類型、運算符、流程控制、面向對象等,適合沒有編程基礎的…