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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

FreeRTOS四種信號(hào)量詳細(xì)介紹

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

1、二值信號(hào)

二值信號(hào)量通常用于互斥訪問(wèn)或同步,二值信號(hào)量和互斥信號(hào)量非常類似,但是還是有一些細(xì)微的差別,互斥信號(hào)量擁有優(yōu)先級(jí)繼承機(jī)制,二值信號(hào)量沒(méi)有優(yōu)先級(jí)繼承。因此二值信號(hào)量更適合用于同步(任務(wù)與任務(wù)或任務(wù)與中斷的同步),而互斥信號(hào)量適合用于簡(jiǎn)單的互斥訪問(wèn)。

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

二值信號(hào)量其實(shí)就是一個(gè)只有一個(gè)隊(duì)列項(xiàng)的隊(duì)列,這個(gè)特殊的隊(duì)列要么是滿的,要么是空的,這不正好就是二值的嗎?任務(wù)和中斷使用這個(gè)特殊隊(duì)列不用在乎隊(duì)列中存的是什么消息,只需要知道這個(gè)隊(duì)列是滿的還是空的??梢岳眠@個(gè)機(jī)制來(lái)完成任務(wù)與中斷之間的同步。

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

2、計(jì)數(shù)型信號(hào)量

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

事件計(jì)數(shù)

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

資源管理

在這個(gè)場(chǎng)合中,信號(hào)量值代表當(dāng)前資源的可用數(shù)量,比如停車場(chǎng)當(dāng)前剩余的停車位數(shù)量。一個(gè)任務(wù)要想獲得資源的使用權(quán),首先必須獲取信號(hào)量,信號(hào)量獲取成功以后信號(hào)量值就會(huì)減一。當(dāng)信號(hào)量值為 0 的時(shí)候說(shuō)明沒(méi)有資源了。當(dāng)一個(gè)任務(wù)使用完資源以后一定要釋放信號(hào)量,釋放信號(hào)量以后信號(hào)量值會(huì)加一。在這個(gè)場(chǎng)合中創(chuàng)建的計(jì)數(shù)型信號(hào)量初始值應(yīng)該是資源的數(shù)量,比如停車場(chǎng)一共有 100 個(gè)停車位,那么創(chuàng)建信號(hào)量的時(shí)候信號(hào)量值就應(yīng)該初始化為 100。

3、互斥信號(hào)量

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

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

優(yōu)先級(jí)繼承并不能完全的消除優(yōu)先級(jí)翻轉(zhuǎn),它只是盡可能的降低優(yōu)先級(jí)翻轉(zhuǎn)帶來(lái)的影響。硬實(shí)時(shí)應(yīng)用應(yīng)該在設(shè)計(jì)之初就要避免優(yōu)先級(jí)翻轉(zhuǎn)的發(fā)生?;コ庑盘?hào)量不能用于中斷服務(wù)函數(shù)中,原因如下:

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

● 中斷服務(wù)函數(shù)中不能因?yàn)橐却コ庑盘?hào)量而設(shè)置阻塞時(shí)間進(jìn)入阻塞態(tài)。

4、遞歸互斥信號(hào)量

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

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

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

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

要使用遞歸互斥信號(hào)量的話宏 configUSE_RECURSIVE_MUTEXES 必須為 1!

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

    關(guān)注

    5052

    文章

    18909

    瀏覽量

    300715
  • 信號(hào)
    +關(guān)注

    關(guān)注

    11

    文章

    2767

    瀏覽量

    76450
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    483

    瀏覽量

    61849
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    FreeRTOS信號(hào)量使用教程

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

    FreeRTOS信號(hào)量的使用與實(shí)例

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

    轉(zhuǎn):freeRTOS信號(hào)量學(xué)習(xí)

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

    FreeRTOS信號(hào)量介紹

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

    uCOS信號(hào)量源碼的詳細(xì)資料分析

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

    Linux信號(hào)量(2):POSIX 信號(hào)量

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

    FreeRTOS信號(hào)量 & ESP32實(shí)戰(zhàn)

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

    FreeRTOS 隊(duì)列 信號(hào)量 互斥

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

    FreeRTOS高級(jí)篇6---FreeRTOS信號(hào)量分析

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

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

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

    在Arduino IDE中使用FreeRTOS信號(hào)量

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

    freeRTOS中最常用到的信號(hào)量有哪些

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

    FreeRTOS的二值信號(hào)量

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

    FreeRTOS信號(hào)量介紹

    1、信號(hào)量用于控制對(duì)共享資源的訪問(wèn) 舉一個(gè)很常見(jiàn)的例子,某個(gè)停車場(chǎng)有100個(gè)停車位,這 100 個(gè)停車位大家都可以用,對(duì)于大家來(lái)說(shuō)這 100 個(gè)停車位就是共享資源。假設(shè)現(xiàn)在這個(gè)停車場(chǎng)正常運(yùn)行,你要把
    的頭像 發(fā)表于 07-06 17:09 ?592次閱讀