0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

FreeRTOS四種信號量詳細介紹

麥辣雞腿堡 ? 來源:嵌入式Linux系統(tǒng)開發(fā) ? 作者:嵌入式Linux系統(tǒng)開 ? 2023-07-06 17:14 ? 次閱讀

1、二值信號

二值信號量通常用于互斥訪問或同步,二值信號量和互斥信號量非常類似,但是還是有一些細微的差別,互斥信號量擁有優(yōu)先級繼承機制,二值信號量沒有優(yōu)先級繼承。因此二值信號量更適合用于同步(任務與任務或任務與中斷的同步),而互斥信號量適合用于簡單的互斥訪問。

和隊列一樣,信號量 API 函數(shù)允許設置一個阻塞時間,阻塞時間是當任務獲取信號量的時候由于信號量無效從而導致任務進入阻塞態(tài)的最大時鐘節(jié)拍數(shù)。如果多個任務同時阻塞在同一個信號量上的話那么優(yōu)先級最高的哪個任務優(yōu)先獲得信號量,這樣當信號量有效的時候高優(yōu)先級的任務就會解除阻塞狀態(tài)。

二值信號量其實就是一個只有一個隊列項的隊列,這個特殊的隊列要么是滿的,要么是空的,這不正好就是二值的嗎?任務和中斷使用這個特殊隊列不用在乎隊列中存的是什么消息,只需要知道這個隊列是滿的還是空的。可以利用這個機制來完成任務與中斷之間的同步。

在實際應用中通常會使用一個任務來處理 MCU 的某個外設,比如網(wǎng)絡應用中,一般最簡單的方法就是使用一個任務去輪詢的查詢 MCU 的 ETH 外設是否有數(shù)據(jù),當有數(shù)據(jù)的時候就處理這個網(wǎng)絡數(shù)據(jù)。這樣使用輪詢的方式是很浪費CPU 資源的,而且也阻止了其他任務的運行。最理想的方法就是當沒有網(wǎng)絡數(shù)據(jù)的時候網(wǎng)絡任務就進入阻塞態(tài),把 CPU 讓給其他的任務,當有數(shù)據(jù)的時候網(wǎng)絡任務才去執(zhí)行。現(xiàn)在使用二值信號量就可以實現(xiàn)這樣的功能,任務通過獲取信號量來判斷是否有網(wǎng)絡數(shù)據(jù),沒有的話就進入阻塞態(tài),而網(wǎng)絡中斷服務函數(shù)通過釋放信號量來通知任務以太網(wǎng)外設接收到了網(wǎng)絡數(shù)據(jù),網(wǎng)絡任務可以去提取處理了。網(wǎng)絡任務只是在一直的獲取二值信號量,它不會釋放信號量,而中斷服務函數(shù)是一直在釋放信號量,它不會獲取信號量。在中斷服務函數(shù)中發(fā)送信號量可以使用函數(shù) xSemaphoreGiveFromISR()。

2、計數(shù)型信號量

有些資料中也將計數(shù)型信號量叫做數(shù)值信號量,二值信號量相當于長度為 1 的隊列,那么計數(shù)型信號量就是長度大于 1 的隊列。同二值信號量一樣,用戶不需要關心隊列中存儲了什么數(shù)據(jù),只需要關心隊列是否為空即可。計數(shù)型信號量通常用于如下兩個場合:

事件計數(shù)

在這個場合中,每次事件發(fā)生的時候就在事件處理函數(shù)中釋放信號量(增加信號量的計數(shù)值),其他任務會獲取信號量(信號量計數(shù)值減一,信號量值就是隊列結(jié)構(gòu)體成員變量uxMessagesWaiting)來處理事件。在這種場合中創(chuàng)建的計數(shù)型信號量初始計數(shù)值為 0。

資源管理

在這個場合中,信號量值代表當前資源的可用數(shù)量,比如停車場當前剩余的停車位數(shù)量。一個任務要想獲得資源的使用權,首先必須獲取信號量,信號量獲取成功以后信號量值就會減一。當信號量值為 0 的時候說明沒有資源了。當一個任務使用完資源以后一定要釋放信號量,釋放信號量以后信號量值會加一。在這個場合中創(chuàng)建的計數(shù)型信號量初始值應該是資源的數(shù)量,比如停車場一共有 100 個停車位,那么創(chuàng)建信號量的時候信號量值就應該初始化為 100。

3、互斥信號量

互斥信號量其實就是一個擁有優(yōu)先級繼承的二值信號量,在同步的應用中(任務與任務或中斷與任務之間的同步)二值信號量最適合?;コ庑盘柫窟m合用于那些需要互斥訪問的應用中。在互斥訪問中互斥信號量相當于一個鑰匙,當任務想要使用資源的時候就必須先獲得這個鑰匙,當使用完資源以后就必須歸還這個鑰匙,這樣其他的任務就可以拿著這個鑰匙去使用資源。

互斥信號量使用和二值信號量相同的 API 操作函數(shù),所以互斥信號量也可以設置阻塞時間,不同于二值信號量的是互斥信號量具有優(yōu)先級繼承的特性。當一個互斥信號量正在被一個低優(yōu)先級的任務使用,而此時有個高優(yōu)先級的任務也嘗試獲取這個互斥信號量的話就會被阻塞。不過這個高優(yōu)先級的任務會將低優(yōu)先級任務的優(yōu)先級提升到與自己相同的優(yōu)先級,這個過程就是優(yōu)先級繼承。優(yōu)先級繼承盡可能的降低了高優(yōu)先級任務處于阻塞態(tài)的時間,并且將已經(jīng)出現(xiàn)的“優(yōu)先級翻轉(zhuǎn)”的影響降到最低。

優(yōu)先級繼承并不能完全的消除優(yōu)先級翻轉(zhuǎn),它只是盡可能的降低優(yōu)先級翻轉(zhuǎn)帶來的影響。硬實時應用應該在設計之初就要避免優(yōu)先級翻轉(zhuǎn)的發(fā)生?;コ庑盘柫坎荒苡糜谥袛喾蘸瘮?shù)中,原因如下:

● 互斥信號量有優(yōu)先級繼承的機制,所以只能用在任務中,不能用于中斷服務函數(shù)。

● 中斷服務函數(shù)中不能因為要等待互斥信號量而設置阻塞時間進入阻塞態(tài)。

4、遞歸互斥信號量

遞歸互斥信號量可以看作是一個特殊的互斥信號量,已經(jīng)獲取了互斥信號量的任務就不能再次獲取這個互斥信號量,但是遞歸互斥信號量不同,已經(jīng)獲取了遞歸互斥信號量的任務可以再次獲取這個遞歸互斥信號量,而且次數(shù)不限!一個任務使用函數(shù) xSemaphoreTakeRecursive()成功的獲取了多少次遞歸互斥信號量就得使用函數(shù) xSemaphoreGiveRecursive()釋放多少次!比如某個任務成功的獲取了 5 次遞歸信號量,那么這個任務也得同樣的釋放 5 次遞歸信號量。

遞歸互斥信號量也有優(yōu)先級繼承的機制,所以當任務使用完遞歸互斥信號量以后一定要記得釋放。同互斥信號量一樣,遞歸互斥信號量不能用在中斷服務函數(shù)中。

● 由于優(yōu)先級繼承的存在,就限定了遞歸互斥信號量只能用在任務中,不能用在中斷服務函數(shù)中!

● 中斷服務函數(shù)不能設置阻塞時間。

要使用遞歸互斥信號量的話宏 configUSE_RECURSIVE_MUTEXES 必須為 1!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5059

    文章

    18973

    瀏覽量

    302032
  • 信號
    +關注

    關注

    11

    文章

    2773

    瀏覽量

    76539
  • FreeRTOS
    +關注

    關注

    12

    文章

    483

    瀏覽量

    61915
收藏 人收藏

    評論

    相關推薦

    FreeRTOS串口中斷接收不定長的數(shù)據(jù)與二值信號量的使用

    FreeRTOS例程,使用串口中斷接收不定長的數(shù)據(jù),以及二值信號量的使用
    的頭像 發(fā)表于 09-26 09:02 ?3917次閱讀
    <b class='flag-5'>FreeRTOS</b>串口中斷接收不定長的數(shù)據(jù)與二值<b class='flag-5'>信號量</b>的使用

    FreeRTOS信號量使用教程

    信號量是操作系統(tǒng)中重要的一部分,信號量一般用來進行資源管理和任務同步, FreeRTOS信號量又分為二值信號量、 計數(shù)型
    的頭像 發(fā)表于 12-19 09:22 ?3044次閱讀
    <b class='flag-5'>FreeRTOS</b><b class='flag-5'>信號量</b>使用教程

    FreeRTOS信號量的使用與實例

    在嵌入式系統(tǒng)中,任務管理是一個重要的部分,它涉及到任務之間的通信和同步,信號量,隊列,互斥鎖和事件標志組等概念。本文將以 FreeRTOS 為例,詳細講解這些內(nèi)容。
    的頭像 發(fā)表于 12-12 15:25 ?2256次閱讀

    轉(zhuǎn):freeRTOS信號量學習

    ,在編譯的時候靜態(tài)分配給信號量,前者則是動態(tài)分配,關于靜態(tài)分配和動態(tài)分配可以參閱freeRTOS官網(wǎng)詳細信息。我們看一下兩API創(chuàng)建信號量
    發(fā)表于 08-12 18:29

    FreeRTOS信號量介紹

    FreeRTOS信號量 & ESP32實戰(zhàn)閱讀建議:有一定操作系統(tǒng)基礎知識。FreeRTOS信號量1. 二值信號量??二值
    發(fā)表于 01-27 07:28

    uCOS信號量源碼的詳細資料分析

    本文檔的主要內(nèi)容詳細介紹的是uCOS信號量源碼的詳細資料分析。 信號量相關的函數(shù) 創(chuàng)建一個信號量
    發(fā)表于 06-17 17:38 ?7次下載
    uCOS<b class='flag-5'>信號量</b>源碼的<b class='flag-5'>詳細</b>資料分析

    Linux信號量(2):POSIX 信號量

    上一章,講述了 SYSTEM V 信號量,主要運行于進程之間,本章主要介紹 POSIX 信號量:有名信號量、無名信號量。 POSIX
    的頭像 發(fā)表于 10-29 17:34 ?678次閱讀

    FreeRTOS信號量 & ESP32實戰(zhàn)

    FreeRTOS信號量 & ESP32實戰(zhàn)閱讀建議:有一定操作系統(tǒng)基礎知識。FreeRTOS信號量1. 二值信號量??二值
    發(fā)表于 12-03 18:06 ?1次下載
    <b class='flag-5'>FreeRTOS</b><b class='flag-5'>信號量</b> & ESP32實戰(zhàn)

    FreeRTOS 隊列 信號量 互斥

    文章目錄前言Queue 隊列semaphore 信號量Mutex 互斥微信公眾號前言FreeRTOS STM32CubeMX配置 內(nèi)存管理 任務管理上節(jié)介紹了用STM32CubeMX
    發(fā)表于 12-09 09:51 ?0次下載
    <b class='flag-5'>FreeRTOS</b> 隊列 <b class='flag-5'>信號量</b> 互斥<b class='flag-5'>量</b>

    FreeRTOS高級篇6---FreeRTOS信號量分析

    FreeRTOS信號量包括二進制信號量、計數(shù)信號量、互斥信號量(以后簡稱互斥)和遞歸互斥
    發(fā)表于 01-26 17:39 ?7次下載
    <b class='flag-5'>FreeRTOS</b>高級篇6---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>信號量</b>分析

    FreeRTOS系列第20篇---FreeRTOS信號量API函數(shù)

    FreeRTOS信號量包括二進制信號量、計數(shù)信號量、互斥信號量(以后簡稱互斥)和遞歸互斥
    發(fā)表于 01-26 17:44 ?4次下載
    <b class='flag-5'>FreeRTOS</b>系列第20篇---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>信號量</b>API函數(shù)

    在Arduino IDE中使用FreeRTOS信號量

    電子發(fā)燒友網(wǎng)站提供《在Arduino IDE中使用FreeRTOS信號量.zip》資料免費下載
    發(fā)表于 01-04 10:18 ?0次下載
    在Arduino IDE中使用<b class='flag-5'>FreeRTOS</b><b class='flag-5'>信號量</b>

    freeRTOS中最常用到的信號量有哪些

    在操作系統(tǒng)系統(tǒng)中,信號量通常用于控制對共享資源的訪問和任務之間進行同步,信號量在操作系統(tǒng)中是很常用的,也是學習freeRTOS操作系統(tǒng)必須要掌握的。
    的頭像 發(fā)表于 02-10 11:04 ?1953次閱讀
    <b class='flag-5'>freeRTOS</b>中最常用到的<b class='flag-5'>信號量</b>有哪些

    FreeRTOS的二值信號量

    FreeRTOS中的信號量是一任務間通信的方式,信號量包括:二值信號量、互斥信號量、計數(shù)
    的頭像 發(fā)表于 02-10 15:07 ?1423次閱讀

    FreeRTOS信號量介紹

    1、信號量用于控制對共享資源的訪問 舉一個很常見的例子,某個停車場有100個停車位,這 100 個停車位大家都可以用,對于大家來說這 100 個停車位就是共享資源。假設現(xiàn)在這個停車場正常運行,你要把
    的頭像 發(fā)表于 07-06 17:09 ?605次閱讀