那曲檬骨新材料有限公司

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

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

3天內不再提示

Semaphore信號量概念及其介紹

冬至子 ? 來源:ITRelief ? 作者:Sachefgh Xu ? 2023-07-25 15:40 ? 次閱讀

信號量即Semaphore。信號量主要用于控制和保護任務對特定資源的訪問。FreeRTOS的信號量分為二值信號量、計數型信號量和互斥信號量。其中互斥信號量即Mutex在CMSIS API中被獨立;本文主要講解二值信號量和計數型信號量。

在FreeRTOS中,二值信號量和計數信號量在創建方式和功能上沒有差異,兩者區別僅為二值信號量token數為1;而計數信號量token>1。

圖示為CMSIS-RTOS的信號量抽象原理圖。系統創建信號量,一并指定信號量內token(object)數量。線程(任務)可進行拿取/放入token的操作。

①放入token:線程可以向信號量中放入token。調用一次相應函數即放入一個。若當前信號量已滿則報錯。

②拿取token:   線程向信號量中拿取token。和消息隊列一樣,取操作可以設置阻塞超時時間。當消息量中無token時,線程進入**BLOCK**狀態等待消息量被放入token。**在此期間當任務檢測到消息量放入token時,將自動由****BLOCK**態轉移為**READY**態。當等待的時間超過了指定的阻塞時間,即使隊列中尚無數據,任務也會自動從阻塞態轉移為**READY**態。此時程序會返回**osErrorTimeout**錯誤。若沒有設置**阻塞超時**參數正確,返回**osErrorResource**錯誤**。**
  • Semaphore APIs

①創建信號量

可以通過函數 **osSemaphoreNew() **創建信號量。在創建時,可以選擇信號量可容納token的數量、初始token數; 并且可以傳入配置結構體。當創建失敗時返回NULL。

當max_count為1時,將創建二值信號量。

osSemaphoreId_t osSemaphoreNew (uint32_t max_count, uint32_t initial_count, const osSemaphoreAttr_t *attr);/*
@param:   max_count        -信號量可容納token的數量
          initial_count    -信號量初始時刻含有的token數量;initial_count<=max_count
          *attr            -配置結構體
@retval    -信號量ID(句柄);若創建失敗返回NULL
*/

②獲取信號量中token 【可在中斷中使用】

※當在中斷中使用該函數時,阻塞延時時間timeout應設置為0U,否則報Parameter錯誤。

線程調用該函數時,當消息量中無token時,線程進入BLOCK狀態等待消息量被放入token。在此期間當任務檢測到消息量放入token時,將自動由****BLOCK態轉移為READY態。當等待的時間超過了指定的阻塞時間,即使隊列中尚無數據,任務也會自動從阻塞態轉移為READY態。此時程序會返回osErrorTimeout錯誤。若沒有設置阻塞超時且參數正確,返回osErrorResource錯誤**。**

osStatus_t osSemaphoreAcquire (osSemaphoreId_t semaphore_id, uint32_t timeout);/*  獲取一個token
@param:     semaphore_id    -傳入信號量ID(句柄)
            timeout         -阻塞延時時間
@retval:
         osOK: 操作成功
         osErrorTimeout: the token could not be obtained in the given time.
         osErrorResource: the token could not be obtained when no timeout was specified.
         osErrorParameter: the parameter semaphore_id is NULL or invalid.*/

timeout參數:

==  0U     //不設置阻塞超時時間
 ==  osWaitForever  //任務將一直阻塞直到空隊列被寫入/滿隊列被取出數據
 ==  Ticks   //設置具體等待時間,單位為RTOS心跳數(Ticks)

③ 向信號量放入一個token 【可在中斷中使用】

當信號量溢出時,函數返回**osErrorResource **。

osStatus_t osSemaphoreRelease (osSemaphoreId_t semaphore_id);/*放入一個token
@param:     semaphore_id    -傳入信號量ID(句柄)
@retval:
    osOK: the token has been released and the count incremented.
    osErrorResource: the token could not be released (maximum token count has been reached).
    osErrorParameter: the parameter semaphore_id is NULL or invalid.
*/

④獲取狀態

uint32_t osSemaphoreGetCount (osSemaphoreId_t semaphore_id);/*獲取信號量中token數
*/

⑤清理(刪除)信號量

osStatus_t osSemaphoreDelete (osSemaphoreId_t semaphore_id);/*
@retval:  
    osOK: the semaphore object has been deleted.
    osErrorParameter: the parameter semaphore_id is NULL or invalid.
    osErrorResource: the semaphore is in an invalid state.
    osErrorISR: osSemaphoreDelete cannot be called from interrupt service routines.
*/
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • CMSIS
    +關注

    關注

    0

    文章

    40

    瀏覽量

    11943
  • FreeRTOS
    +關注

    關注

    12

    文章

    484

    瀏覽量

    62399
  • 延時器
    +關注

    關注

    1

    文章

    36

    瀏覽量

    15158
  • 串口中斷
    +關注

    關注

    0

    文章

    67

    瀏覽量

    14010
收藏 人收藏

    評論

    相關推薦

    FreeRTOS信號量使用教程

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

    轉:freeRTOS信號量學習

    kv46上移植的demo有官方提供的信號量的例程,推薦大家下載最新版的v9.0.0源碼學習,新更新的特性和內容在源碼包里都有提及,研究例程是最好的學習方法。這里只是給大家簡單介紹使用方法,更加詳細的內容還需自己仔細閱讀源碼和官方參考資料。
    發表于 08-12 18:29

    第14章 信號量

    。14.1 信號量14.2 信號量API函數14.3 實驗例程說明(任務間通信)14.4 實驗例程說明(中斷方式通信)14.5總結14.1 信號量14.1.1信號量
    發表于 10-05 09:26

    第15章 互斥信號量

    15.1 互斥信號量15.1.1互斥信號量概念及其作用 互斥信號量就是信號量的一種特殊形式,也就是信號
    發表于 10-06 16:40

    信號量–使用許可的概念

    永磁同步電機 除了基于每個Java對象具有的鎖定位的通用同步外,您還可以使用Java中更復雜的同步器,例如: 信號量–使用許可的概念表示一個位置中允許的最大線程數。 當使用值1時,其行為類似于同步
    發表于 08-27 06:04

    信號量semphere概述

    APItx_semaphore_createtx_semaphore_deletetx_semaphore_gettx_semaphore_puttx_semaphore_put_notifysemaphore_demo概述ThreadX提供32位計數信號量,范圍在0到4
    發表于 02-22 07:29

    新手請教信號量概念問題

    請教信號量概念問題. 我準備用信號量來編寫一個ARM程序,但我沒有完全理解信號量概念.例如:現在有 4 個任務:TASK1,TASK2,
    發表于 02-27 11:15

    信號量機制怎么理解

    信號量Semaphore),有時被稱為信號燈,是在多線程環境下使用的一種設施,是可以用來保證兩個或多個關鍵代碼段不被并發調用。在進入一個關鍵代碼段之前,線程必須獲取一個信號量;一旦該
    發表于 11-14 09:23 ?2.6w次閱讀
    <b class='flag-5'>信號量</b>機制怎么理解

    你了解Linux 各類信號量

    內核信號量與用戶信號量,用戶信號量分為POXIS信號量和SYSTEMV信號量,POXIS信號量
    發表于 05-04 17:19 ?2541次閱讀
    你了解Linux 各類<b class='flag-5'>信號量</b>?

    Linux IPC System V 信號量

    () //創建/獲取信號量集 semctl() //初始化信號量集 semop() //操作信號量
    發表于 04-02 14:46 ?348次閱讀

    詳解互斥信號量概念和運行

    1 、互 斥 信 號 1.1 互斥信號量概念及其作用 互斥信號量的主要作用是對資源實現互斥訪問,使用二值信號量也可以實現互斥訪問的功能
    的頭像 發表于 10-22 11:57 ?1.2w次閱讀
    詳解互斥<b class='flag-5'>信號量</b>的<b class='flag-5'>概念</b>和運行

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

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

    淺談鴻蒙內核源碼的信號量運作原理

    基本概念 信號量Semaphore) 是一種實現任務間通信的機制,可以實現任務間同步或共享資源的互斥訪問。 一個信號量的數據結構中,通常有一個計數值,用于對有效資源數的計數,表示剩下
    的頭像 發表于 04-24 10:44 ?1575次閱讀

    FreeRTOS 隊列 信號量 互斥

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

    ThreadX(六)------信號量semaphore

    APItx_semaphore_createtx_semaphore_deletetx_semaphore_gettx_semaphore_puttx_semaphore_put_notifysemaphore_demo概述ThreadX提供32位計數信號量,范圍在0到4
    發表于 12-28 19:26 ?7次下載
    ThreadX(六)------<b class='flag-5'>信號量</b><b class='flag-5'>semaphore</b>
    富二代百家乐官网的玩法技巧和规则| 个人百家乐官网策略| 百家乐上分器定位器| 太阳城百家乐官网公司| qq德州扑克官网| 永利百家乐娱乐场| 索雷尔百家乐官网的玩法技巧和规则| 唐河县| 大发888客服咨询电话| 澳门百家乐心德| 百家乐官网游戏教程| 怀化市| 大发888是怎么吃钱不| 秦皇岛市| 大地娱乐城| 德州扑克高手| 威尼斯人娱乐网网上百家乐| 海立方百家乐官网的玩法技巧和规则| 半圆百家乐官网桌子| 皇冠足球网址| 星空棋牌舟山| 永利百家乐开户| 爱婴百家乐官网的玩法技巧和规则 | 15人百家乐官网桌| 百家乐官网扎金花斗地主| 百家乐技巧微笑心法| 百家乐官网打鱼秘| 长春百家乐官网的玩法技巧和规则| 百家乐官网投注五揽式| 百家乐官网在线小游戏| 绥中县| k7娱乐城开户| 皇冠网投| 皇冠博彩有限公司| bet365体育投注| 百家乐推荐| 大发888娱乐城充值| 百家乐博彩平| 百家乐玩法与规则| 游戏房百家乐赌博图片| 百家乐出千的方法|