1. 程式人生 > >UCOSIII訊號量和互斥訊號量

UCOSIII訊號量和互斥訊號量

在UCOSIII中可能會偶多個任務會訪問共享資源,因此訊號量最早用來控制任務存取共享資源,現在訊號量也被用來實現任務間的同步以及任務和ISP同步。在可剝奪的核心中,當任務獨佔式使用共享資源的時候,會低優的任務高於高階優先任務執行的現象,這個現象叫做優先順序反轉,未來了解決這個優先順序反轉的問題,UCOSIII引入可互斥訊號量這個概念。

訊號量
訊號量像是一種上鎖機制,程式碼必須獲得對應的鑰匙才能繼續執行,一旦獲得了鑰匙也就意味著該任務具有進入被鎖部分程式碼的許可權 。一旦執行至被鎖程式碼段,則任務一直等待到對應被鎖部分程式碼的鑰匙再次釋放才能繼續執行。
訊號量分為兩種:二進位制與計數型,二進位制訊號量只能取0和1兩個值,計數型訊號量不止可以取2個值,在共享資源中只要有任何可以使用訊號量,中斷服務程式則不能使用。
1.二進位制訊號量
某一資源對應的訊號量為1的時候,那麼就可以使用這一資源,如果對應訊號量為 0,那麼等待該訊號量的任務就會被放進表中。在等待訊號量的時候也可以設定超時,如果過設定的間任務沒有等到訊號量話那麼該就會進入緒態。任務以“發訊號”的方式操作訊號量。 可以看出如果一個訊號量為二進位制的話,一次只能一個任務使用共享資源。
2.計數型訊號量
有時候我們需要可以同時有多個任務訪問共享資源,這個時候二進位制訊號量就不能使用了,計數型訊號量就是用來解決這個問題的。比如某一個訊號量初始化值為10,那麼只有前10個請求該訊號的任務可以使用共享資源,以後的任務需要等待前10個任務釋放掉訊號量。每當有任務請求訊號量的時候,訊號量的值就會減1,知道減為0.當有任務釋放掉訊號量的時候訊號量就會加1.
![訊號量API函式](https://img-blog.csdn.net/20160808103057934)

建立互斥型訊號量
建立互斥型訊號量使用函式OSMutexCreate()
p_mutex : 指向互斥型訊號量控制塊。互斥型訊號量必須有使用者應程式進行實際分配,可以使用如下所示程式碼。
    OS_MUTEX MyMutex;
p_name: 互斥訊號量的名字
p_err: 呼叫此函式後返回的錯誤碼。

請求互斥型訊號量
當一個任務需要對資源進行獨佔式訪問的時候就可以使用函式OSMutexPend(),如果該互斥訊號量正在被其他的任務使用,那麼UCOSIII就會將強求這個互斥訊號量的任務放置在這個互斥訊號量的等待表中。任務會一直等待,知道這個互斥訊號被釋放掉,或者設定的超時時間到達位置。如果在設定的超時時間到達之前訊號量被釋放,UCOSIII將會恢復所有等待這個訊號量中的優先順序最高的任務。
注意!如果佔用該互斥訊號量的任務比當前申請互斥訊號量的任務優先順序低的話,OSMutexPend()函式將會佔用該互斥訊號量的任務優先順序提到和當前申請任務的優先順序一樣。當佔用互斥訊號量的任務釋放掉該互斥訊號後,恢復到之前的優先順序。
p_mutex : 指向互斥訊號量。
timeout : 指定等待互斥訊號量的超時間(鍾節拍數),如果在指定的時間內互斥訊號量沒有釋放,則允許任務恢復執行。該值設定為0的話,表示任務將會一直等,直到訊號量被釋放掉。
opt : 用於選擇是否使阻塞模式。
      OS_OPT_PEND_BLOCKING 指定互斥訊號量被佔用時,任務掛起等待該互斥訊號量。
      OS_OPT_PEND_NON_BLOCKING 指定當互斥訊號量被佔用時,直接返回任務。
      注意!當設定為 OS_OPT_PEND_NON_BLOCKING  ,是 timeout 引數就沒有意義了,應該設定為0。
p_ts : 指向一個時間戳,記錄傳送、終止或刪除互斥訊號量的時刻。
p_err: 用於儲存掉用此函式後返回的錯誤碼。

傳送互斥訊號量
我們可以通過呼叫函式OSMutexPost()來釋放互斥型訊號量,只有之前呼叫過函式OSMutexPend()獲取互斥訊號量,才需要呼叫OSMutexPost()函式來釋放這個互斥訊號量
p_mutex: 指向互斥訊號量。
opt: 用來指定是否進行任務排程操作
    OS_OPT_POST_NONE 不指定特的選項
    OS_OPT_POST_NO_SCHED 禁止在本函式內執行任務排程操作。
p_err: 用來儲存調此函式返回的錯誤碼。

相關推薦

UCOSIII訊號互斥訊號

在UCOSIII中可能會偶多個任務會訪問共享資源,因此訊號量最早用來控制任務存取共享資源,現在訊號量也被用來實現任務間的同步以及任務和ISP同步。在可剝奪的核心中,當任務獨佔式使用共享資源的時候,會低優的任務高於高階優先任務執行的現象,這個現象叫做優先順序反轉,

FreeRTOS 學習五:訊號互斥

1. 簡介: 此篇文章中涉及的函式除特殊說明,包含的標頭檔案都是 semphr.h 二值訊號量同linux中的原子量,我們可以看成像是一個鎖,在使用的時候,需要能拿到鎖才能執行程式,嘗

Linux核心同步機制之訊號互斥

訊號量:訊號量(semaphore)是程序間通訊處理同步互斥的機制。是在多執行緒環境下使用的一種措施,它負責協調各個程序,以保證他們能夠正確、合理的使用公共資源。 它和spin lock最大的不同之處就是:無法獲取訊號量的程序可以睡眠,因此會導致系統排程。原理訊號量一般可以用

ucosIII 共享資源(訊號互斥訊號

共享資源: 變數(靜態或全域性變數)、資料結構體、RAM表格、I/O裝置等。OS在使用一些資源時候,例如IO裝置印表機,當任務1在使用印表機時候必須保證資源獨享,避免其他任務修改列印內容導致出錯,因此需要有資源共享機制。 一般推薦使用互斥訊號量對共享資源實現

二值訊號互斥鎖到底有什麼區別?

原文連結:https://www.cnblogs.com/codescrew/p/8970514.html在說明之前我先丟擲結論:互斥鎖和二值訊號量在使用上非常相似,但是互斥鎖解決了優先順序翻轉的問題假定我們現在有三個任務,task1,task2,task3,任務優先順序ta

VxWorks 二進位制訊號互斥訊號計數訊號的區別

URL: http://blog.csdn.net/hxg130435477/article/details/5998006 VxWorks訊號量是提供任務間通訊、同步和互斥的最優選擇,提供任務間最快速的通訊。也是提供任務間同步和互斥的主要手段。VxWorks提供3種訊號

uc/os-iii學習筆記-資源管理(中斷、訊號訊號互斥訊號

資源管理 最常用的獨佔共享資源和建立臨界區的方法有以下幾種: 關、開中斷 獨佔共享資源最簡單也是最快捷的方法就是關中斷和開中斷,當訪問共享資源的速度很快,以至於訪問共享資源所花的時間小於中斷的關閉時間時,可以使用關、開中斷方法。但是不推薦此方法

UCOS2:對於訊號互斥訊號,事件標誌組

2.訊號量:    至於訊號量,和互斥訊號量是用區別的,簡單來說(個人理解,歡迎糾正)就是互斥訊號量再同一時刻,任務得到互斥訊號量量後是獨佔共享資源的,在他沒有釋放訊號量之前,任何其他任務都是不能訪問共享資源的。而訊號量的不同在於。訊號量可以設定一個值,允許最多又幾個任務同時去訪問共享資源。比如我給他設定一個

詳解線程的信號互斥

pthread.h 擁有 分享圖片 .html post 並發 並發執行 格式 引入   前言:有個問題感覺一直會被問道:進程和線程的區別?也許之前我會回答: 進程:資源分配最小單位 線程:輕量級的進程 是系統調度的最小單位 由進程創建 多個線程共享進程的資源   但是

二值信號互斥鎖到底有什麽區別?

post 改進 觸發 情況 等待 如果 str 長時間 PE 在說明之前我先拋出結論:互斥鎖和二值信號量在使用上非常相似,但是互斥鎖解決了優先級翻轉的問題 假定我們現在有三個任務,task1,task2,task3,任務優先級task1最高,然後依次降低。我們知道在系

Java中靜態變動態變

.com pan 1-1 一道 args ict print stat 類的加載 這是我面試遇到的一道題,題目如下: 1 public class StaticTest { 2 private static int b = 1; 3 priv

面向對象,局部變成員變

對象 pri 計算 影響 多個 static 初始化 ret false 面向對象的編程關註與類的設計設計類實際上是設計類的成員基本的類的成員,屬性(成員變量)&方法1、設計類,並設計類的成員(成員變量&成員方法)2、通過類,來創建類 的對象(累的實例化用n

shell中的位置變特殊變

shell 變量$$Shell本身的PID(ProcessID)$!Shell最後運行的後臺Process的PID$?最後運行的命令的結束代碼(返回值)$-使用Set命令設定的Flag一覽$*所有參數列表。如"$*"用「"」括起來的情況、以"$1 $2 … $n"的形式輸出所有參數。$@所有參數列表。如"$

全局變環境變的區別

trace pri 腳本 nbsp 都是 全局 區別 oba 啟動 全局變量:啟動腳本了.在各線程,以及主程序中.可以互相傳遞值.每次啟動腳本,初始值都一樣.環境變量:啟動腳本了.在各線程,以及主程序中.可以互相傳遞值.每次啟動腳本,初始值是上次停止腳本時的值. 例子:Gl

Python的類變成員變

示例代碼 遇到 method bsp erro 數據 func err 成員變量 先說明幾個相關的術語:attribute、function、method。 attribute:類對象的數據成員。我們經常會在Python代碼出錯時遇到:“AttributeError: ‘

SQL查看數據庫中每張表的數據總數據

body object sys pre bject desc isp 數據 one 查看所有表對應的數據量 SELECT a.name AS 表名, MAX(b.rows) AS 記錄條數 FROM sys.sysobjects AS a INNER JOI

局部變成員變的區別

family style gpo body mil 內存 默認值 局部變量 成員變量 1、從定義上來講:  局部變量定義在函數中。  成員變量定義在類中。 2、從內存存儲上來講:  局部變量隨著函數的運行會在棧內存中出現,局部變量存儲在棧內存中。  成員變量會隨著對象的出現

靜態變成員變的區別 && 成員變和局部變的區別

存在 通過 == 賦值 log 聲明 class 類的加載 範圍 ============================================================================= 1)靜態變量和成員變量的區別:   (1):所屬不

Java中靜態變(類變)、實例變、局部變成員變

Java導讀 學習Java的過程中,一開始很容易被這些各種變量繞暈,這篇博客主要介紹了這幾種變量之間的關系和區別。 例程 package com.cunyu.demo public class Demo { private String name; //成員變量、實例變量 private

Sublime text3 012 SublimeTmpl 自定義變 模板變

=== AC 定義 action save 沒有 bin 定義變量 packages Sublime text3 012 SublimeTmpl 自定義變量 和 模板變量 ---------------------------------------------------