在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

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

汽車電子技術 ? 來源:嵌入式之入坑筆記 ? 作者:嵌入式之入坑筆記 ? 2023-02-10 11:04 ? 次閱讀

操作系統系統中,信號量通常用于控制對共享資源的訪問和任務之間進行同步,信號量在操作系統中是很常用的,也是學習freeRTOS操作系統必須要掌握的。

freeRTOS中最常用到的信號量有:二值信號量、計數信號量、互斥信號量。

有關這幾個信號量分別如下:

1、二值信號量

1.1、二值信號量

二值信號量是指所創建的信號量只有兩個值(0 和 1),通常用于互斥訪問或者同步。

二值信號量在某處被占有使用之后,其他地方想要申請這個二值信號量是無法成功申請的,只有當這個被占有的二值信號量被使用完畢并釋放之后,才能被再次申請占有使用!

總而言之,二值信號量被使用之后會變為無效狀態,需要被重新釋放才能進入有效狀態。

在freeRTOS中,二值信號量的創建和使用的API管理函數分別如下:

1.2、創建二值信號量

函數原型:SemaphoreHandle_t xSemaphoreCreateBinary(void)

函數描述:

函數** xSemaphoreCreateBinary** 用于創建二值信號量。

返回值: 如果創建成功會返回二值信號量的句柄,創建失敗會返回 NULL。

1.3、等待二值信號量

在freeRTOS中,信號量的獲取是進行了區分的,在任務或者函數中獲取與在中斷中是不一樣的,freeRTOS中給出了不同API函數。

1)在任務代碼中等待信號量

函數原型:xSemaphoreTake( SemaphoreHandle_t xSemaphore,  /* 信號量句柄 */           TickType_t xTicksToWait );     /* 等待信號量可用的最大等待時間 */

函數描述:

函數 xSemaphoreTake 用于在任務代碼中獲取信號量。

第 1 個參數是信號量句柄。

第 2 個參數是沒有信號量可用時,等待信號量可用的最大等待時間,單位系統時鐘節拍。

返回值:如果創建成功會獲取信號量返回 pdTRUE,否則返回 pdFALSE。

使用這個函數要注意以下問題:

此函數是用于任務代碼中調用的,不可以在中斷服務程序中調用此函數,中斷服務程序使用的是xSemaphoreTakeFromISR。

2)在中斷中等待信號量

xSemaphoreTakeFromISR( xSemaphore, pxHigherPriorityTaskWoken )

函數描述:

函數xSemaphoreTakeFromISR用于在中斷中獲取信號量。

第 1 個參數是要獲取的信號量的句柄。這是創建信號量時返回的句柄。

第 2 個參數是如果采用信號量導致任務取消阻止,并且未阻止的任務的優先級高于當前運行的任務,則xSemaphoreTakeFromISR()會將pxHigherPriorityTaskWoken設置為pdTRUE。

如果xSemaphoreTakeFromISR()將此值設置為pdTRUE,則應在退出中斷之前請求上下文切換。

返回值:如果創建成功會獲取信號量返回 pdTRUE,否則返回 pdFALSE。

1.4、釋放二值信號量

1)用于在任務代碼中釋放二值信號量

函數原型:

xSemaphoreGive( SemaphoreHandle_t xSemaphore ); /* 信號量句柄 */

函數描述:釋放信號量

函數 xSemaphoreGive 用于在任務代碼中釋放信號量。

第 1 個參數是信號量句柄。

返回值,如果信號量釋放成功返回 pdTRUE,否則返回 pdFALSE,因為信號量的實現是基于消息隊列,返回失敗的主要原因是消息隊列已經滿了。

注意:此函數是用于任務代碼中調用的,不可以在中斷服務程序中調用此函數。

2)用于在中斷中釋放二值信號量

函數原型:

xSemaphoreGiveFromISR(SemaphoreHandle_t xSemaphore, signed BaseType_t *pxHigherPriorityTaskWoken)

函數描述:

函數 xSemaphoreGiveFromISR 用于中斷服務程序中釋放信號量。

第 1 個參數是信號量句柄。

第2個參數用于保存是否有高優先級任務準備就緒。如果函數執行完畢后,此參數的數值是pdTRUE,說明有高優先級任務要執行,否則沒有。

返回值:如果信號量釋放成功返回 pdTRUE,否則返回 errQUEUE_FULL。

2、計數信號量

計數信號量是一個相當于長度大于1的隊列,用于任務之間的同步和共享資源的保護。

計數信號量與二值信號量的不同在于,二值信號量只能被一個地方申請使用,只有在這個申請使用的地方了釋放了才能被其他處申請使用。而計數信號量是可以創建一定數量的信號量的,多個地方可以同時申請使用,直到達到最大的計數信號量的閾值。

計數信號量相關的API函數:

2.1、創建計數信號量

SemaphoreHandle_t xSemaphoreCreateCounting( UBaseType_t uxMaxCount,   /* 支持的最大計數值 */               UBaseType_t uxInitialCount);    /* 初始計數值 */

第 1 個參數:設置此計數信號量支持的 最大計數值

第 2 個參數:設置計數信號量的 初始值 。(為0則不起作用)

返回值:如果創建成功會返回消息隊列的句柄,創建失敗會返回 NULL。

2.2、獲取信號量

1)在任務代碼中獲取信號量

xSemaphoreTake( SemaphoreHandle_t xSemaphore, /* 信號量句柄 */           TickType_t xTicksToWait ); /* 等待信號量可用的最大等待時間 */

函數 xSemaphoreTake 用于在任務代碼中獲取信號量。

第 1 個參數是信號量句柄。

第 2 個參數是沒有信號量可用時,等待信號量可用的最大等待時間,單位系統時鐘節拍。

返回值:如果信號量獲取成功會返回 pdTRUE,否則返回 pdFALSE。

2)在中斷中獲取信號量

xSemaphoreTakeFromISR( xSemaphore, pxHigherPriorityTaskWoken )

函數描述:

函數 **xSemaphoreTakeFromISR **用于在中斷中獲取信號量。

第 1 個參數是要獲取的信號量的句柄。這是創建信號量時返回的句柄。

第 2 個參數是如果采用信號量導致任務取消阻止,并且未阻止的任務的優先級高于當前運行的任務,則xSemaphoreTakeFromISR()會將pxHigherPriorityTaskWoken設置為pdTRUE。如果xSemaphoreTakeFromISR()將此值設置為pdTRUE,則應在退出中斷之前請求上下文切換。

返回值,如果創建成功會獲取信號量返回 pdTRUE,否則返回 pdFALSE。

2.3、釋放信號量

1)在任務代碼中釋放信號量

xSemaphoreGive( SemaphoreHandle_t xSemaphore ); /* 信號量句柄 */

函數 xSemaphoreGive 用于在任務代碼中釋放信號量。

第 1 個參數是信號量句柄。

返回值,如果信號量釋放成功返回 pdTRUE,否則返回 pdFALSE,因為計數信號量的實現是基于消息隊列,返回失敗的主要原因是消息隊列已經滿了。

2)在中斷中釋放信號量

xSemaphoreGiveFromISR(          SemaphoreHandle_t xSemaphore, /* 信號量句柄 */          signed BaseType_t *pxHigherPriorityTaskWoken /* 高優先級任務是否被喚醒的狀態保存 */          )

第 1 個參數是信號量句柄。

第2個參數用于保存是否有高優先級任務準備就緒。如果函數執行完畢后,此參數的數值是pdTRUE,說明有高優先級任務要執行,否則沒有。

返回值:如果信號量釋放成功返回 pdTRUE,否則返回 errQUEUE_FULL。

3、優先級反轉 & 互斥信號量

在實時操作系統中,優先級反轉的問題是不容忽視的,程序設計的過程中,也是要充分考慮這個問題的。

那優先級反轉到底是什么呢?

優先反轉是指:假如一個系統中有高(H)、中(M)、低(L)三個優先級的任務,并有一個二值信號量。在某一個時刻二值信號量被低(L)優先級的任務使用了,并在運行過程中,高優先級任務(H)搶占了低優先級(L)的CPU使用權,但是也想要獲取二值信號量被低優先(L)的任務占有著,高優先級任務(H)由此被掛起等待了,中優先級任務(M)因為不需要二值信號量,會搶占低優先級(L)任務的執行而得到運行,而高優先級任務(H)依然只能等到低優先級任務(L)釋放二值信號量才能得到執行。

由此造成了高優先級任務得不到及時的執行,而低優先級任務卻能比高優先級任務更多的得到執行。

優先級互斥的示意圖如下:

圖片

解決優先級反轉的問題最好的辦法是使用互斥信號量。

互斥信號量和二值信號量比較相似,不同之處在于互斥信號量具有優先級繼承的特性,如果一個互斥信號量正在被一個低優先級的任務使用,而此時這個高優先級的任務也希望獲取這個互斥信號量的話就會被阻塞。

使用互斥信號量時,高優先級的任務會把低優先級的任務的優先級先提高到和自己相同的優先級,保證低優先級的任務能夠繼續運行至結束這樣極大減少了因為高優先級獲取不到信號量被阻塞過長時間的問題。

互斥信號量的API函數:

1)創建互斥信號量

函數原型:

SemaphoreHandle_t xSemaphoreCreateMutex(void)

函數描述:

函數 xSemaphoreCreateMutex 用于創建互斥信號量。

返回值:如果創建成功會返回互斥信號量的句柄,失敗會返回 NULL。

2)獲取互斥信號量

函數原型:

xSemaphoreTake( SemaphoreHandle_t xSemaphore, /* 信號量句柄 */           TickType_t xTicksToWait ); /* 等待信號量可用的最大等待時間 */

函數描述:

函數 xSemaphoreTake 用于在任務代碼中獲取信號量。

第 1 個參數是信號量句柄。

第 2 個參數是沒有信號量可用時,等待信號量可用的最大等待時間,單位系統時鐘節拍。

返回值:如果創建成功會獲取信號量返回 pdTRUE,否則返回 pdFALSE。

(2)釋放互斥信號量

函數原型:

xSemaphoreGive( SemaphoreHandle_t xSemaphore ); /* 信號量句柄 */

函數描述:

函數 xSemaphoreGive 用于在任務代碼中釋放信號量。

第 1 個參數是信號量句柄。

返回值:如果信號量釋放成功返回 pdTRUE,否則返回 pdFALSE,因為信號量的實現是基于消息隊列,返回失敗的主要原因是消息隊列已經滿了。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 操作系統
    +關注

    關注

    37

    文章

    6822

    瀏覽量

    123331
  • FreeRTOS
    +關注

    關注

    12

    文章

    484

    瀏覽量

    62172
  • 信號量
    +關注

    關注

    0

    文章

    53

    瀏覽量

    8340
收藏 人收藏

    評論

    相關推薦

    實時操作系統FreeRTOS信號量應用

    二值信號量常用于互斥訪問或同步,二值信號量和互斥信號量非常相似,但還是細微差別,互斥信號量
    的頭像 發表于 06-08 09:24 ?3709次閱讀
    實時操作系統<b class='flag-5'>FreeRTOS</b><b class='flag-5'>信號量</b>應用

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

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

    FreeRTOS信號量使用教程

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

    FreeRTOS信號量的使用與實例

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

    轉:freeRTOS信號量學習

    信號量同樣是RTOS學習中很重要的一節,信號量可以用在共享資源或者同步任務中,對執行權的控制,誰擁有信號量誰擁有執行權,在freeRTOS信號量
    發表于 08-12 18:29

    freertos信號量同步的時候多任務運行老是崩潰的原因?

    freertos信號量同步的時候,多任務運行,老是崩潰,各位沒遇到過目前移植了,freertos 系統,所以需要用到,線程同步,然后使
    發表于 06-18 09:00

    FreeRTOS信號量介紹

    FreeRTOS信號量 & ESP32實戰閱讀建議:一定操作系統基礎知識。FreeRTOS信號量1. 二值
    發表于 01-27 07:28

    FreeRTOS信號量 & ESP32實戰

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

    FreeRTOS 隊列 信號量 互斥

    文章目錄前言Queue 隊列semaphore 信號量Mutex 互斥微信公眾號前言FreeRTOS STM32CubeMX配置 內存管理 任務管理上節介紹了用STM32CubeMX生成帶
    發表于 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信號量包括二進制信號量、計數信號量、互斥信號量(以后簡稱互斥)和遞歸互斥
    發表于 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函數

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

    在Arduino IDE中使用FreeRTOS信號量

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

    FreeRTOS的二值信號量

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

    使用Linux信號量實現互斥點燈

    信號量常用于控制對共享資源的訪問,計數型信號量和二值信號量之分。初始化時信號量值大于1的,就是
    的頭像 發表于 04-13 15:12 ?806次閱讀
    使用Linux<b class='flag-5'>信號量</b>實現互斥點燈

    FreeRTOS四種信號量詳細介紹

    1、二值信號量 二值信號量常用于互斥訪問或同步,二值信號量和互斥信號量非常類似,但是還是一些
    的頭像 發表于 07-06 17:14 ?2633次閱讀
    主站蜘蛛池模板: 国产一卡二卡≡卡四卡无人| 国产成人精品高清在线| 日本在线一区二区| 五月天激情综合网| 久久精品1| 人人做人人干| 日本成人a视频| 欧美色图888| 国产一区二区高清在线| 欧美极品bbbbⅹxxxx| 蝌蚪自拍网二区| 免费国产一区| 女人又色又爽又黄| 国产精品久久久久久久久免费观看| 欧美亚洲三级| 日操| 国产成人精品高清免费| 久久精品高清视频| 国模娜娜扒开嫩木耳| 亚洲аv电影天堂网| 成人欧美精品久久久久影院 | 午夜影视在线免费观看| 中文字幕xxx| 免费观看理论片毛片| 久久福利国产| 性色综合| 午夜影院毛片| 久久99国产精品免费观看| 老色皮| 性xxxx奶大欧美高清| 色天使美国| 日韩特黄| 性大特级毛片视频| 午夜精品视频在线| 中文天堂最新版在线中文| 操你啦网站| 日本级毛片免费观看| 国产嫩草影院在线观看| sesese在线播放| 天堂-bt种子| 我要色综合网|