cosii中訊號量的理解

2021-07-03 18:36:44 字數 3327 閱讀 8973

1.

訊號量的理解

1)uc/os-ii的訊號量是由兩個部分組成:一部分是

16位的無符號整型訊號量的計數值

(0~65535);另一部分是等待該訊號量的任務組成的等待任務表。(另外參考事件控制塊

ecb) (

2)訊號量可以是

2值的變數(稱為二值訊號量),也可以是計數式的。根據訊號量的值,核心跟蹤那些等待訊號量的任務。 (

3)建立訊號量的工作必須在任務級**中或者多工啟動之前完成。 (

4)任務要得到訊號量的問題。

想得到訊號量的任務,必須執行等待操作(

pend)。如果訊號量有效

(非0),則訊號量減

1,任務得以繼續執行。如果訊號量無效,則等待訊號量的任務就被列入等待訊號量的任務表中。多少核心允許定義等待超時,當等待時間超過了設定值,該訊號量還是無效,則等待該訊號量的任務進入就緒態,準備執行,並返回出錯**

(等待超時錯誤

)。 (

5)任務對訊號量的釋放問題。

任務執行發訊號(

post)操作來釋放訊號量。如果沒有任務等待訊號量,那麼訊號量的值僅是簡單的加

1(則訊號量大於

0,有效);如果有任務等待該訊號量,那麼就會有另乙個任務進入就緒態,訊號量的值就不加

1。之後,這個釋放的訊號量給那個等待中的任務,要看核心如何排程的。收到訊號量的任務可能是如下兩者之一:

◆等待任務中,優先順序最高的;(

uc/os-ii僅支援這種方式)。

◆最早開始等待訊號量的任務(如果是按先進先出fifo原則)。

2.

訊號量的有效與無效問題

訊號量有效:訊號量的計算器非

0(.oseventcnt!

=0)。訊號量有效表示任務對資源可用。

訊號量無效:訊號量的計算器為

0。訊號量無效表示任務對目前資源不可用,需要等待其他另乙個任務(或者中斷服務子程式)發出該訊號量(

ossempost)。

3.

訊號量的值(.oseventcnt)大小表示什麼?

二值訊號量,表示任務可以獨佔共享資源。

計數式訊號量,用於某資源可同時為

n個任務所用。

4.

訊號量是如何實現任務之間的通訊的?

參見第1點的

(4)(5)概述。

5.

訊號量有關的三個重要函式分析

◆ossemcreate() 建立乙個訊號量   (注:由任務或啟動**操作)

建立工作必須在任務級**中或者多工啟動之前完成。功能只要是先獲取乙個事件控制塊

ecb,寫入一些引數。其中呼叫了

os_eeventwaitlistint()函式,對事件控制塊的等待任務列表進行初始化。完成初始化工作後,返回乙個該訊號量的控制代碼

(handle)。

◆ossempend() 等待乙個訊號量 (注:只能由任務操作)

本函式應用於任務試圖獲得共享資源的使用權、任務需要與其他任務或中斷同步及任務需要等待特定事件發生的場合。

如果任務task_a呼叫ossempend(),且訊號量的值有效(非0),那麼ossempend()遞減訊號量計數器(

.oseventcnt),並返回該值。換句話說,task_a獲取到共享資源的使用權了,之後就執行該資源。

如果如果任務task_a呼叫ossempend(),訊號量無效(為0),那麼ossempend()呼叫os_eventtaskwait()函式,把task_a放入等待列表中。(等待到什麼時候呢?要看ossempost()(或者等待超時情況),由它釋放訊號量並檢查任務執行權,見下資料)

◆ossempost() 發出(釋放)乙個訊號量 (注:由任務或中斷操作)

本函式其中呼叫

os_eventtaskrdy()函式,把優先順序最高的任務

task_a(在這假如是

task_a,另外假設當前呼叫

ossempost()的任務是

task_b)從等待任務列表中去除,並使它進入就緒態。然後呼叫

ossched()進行任務排程。如果

task_a是當前就緒態中優先順序最高的任務,則核心執行

task_a;否則,

ossched()直接返回,

task_b繼續執行.

互斥型訊號量

1.互斥型訊號量(mutex)

互斥型訊號量具備

uc/os-ii訊號量的所有機制,但還具有其他一些特性。

任務可利用互斥型訊號量來實現對共享資源的獨佔處理。

mutex是二值訊號量,

1表示資源是可以使用的。

2.關於優先順序反轉

下面概述優先順序反轉原理:

假設有三個任務,分別命名為

a,b,c;

a的優先順序最高,

c的優先順序最低。任務

a和任務

b處於掛起狀態

(請注意這條件

),等待某一事件的發生,任務

c正在執行。當任務

c等待到共享資源(命名為

s1)並使用後,如果任務

a等待得事件到來之後,由於

a的優先順序最高,所以就會剝奪任務

c的cpu使用權。執行過程中,任務

a也要使用資源

s1,但

s1的訊號量還被任務

c占用著,所有任務

a只能進入掛起狀態,等待任務

c對s1的訊號量的釋放。此時任務

c得以繼續執行。

同理,任務

b的事件到來後,會剝奪任務

c的cpu使用權。任務

b把事情搞定以後,把

cpu使用權歸還給任務

b(呵呵,優先順序低就是給人欺負啊,所以做人還真的要爭口氣!)。任務

b又得以繼續執行,任務

b認真處理完畢資源

s1後,終於可以釋放

s1的訊號量。而處於等待該訊號量的任務

a馬上得到訊號量並開始處理共享資源

s1。綜述上面情況,任務

c和任務

a的優先順序發生了反轉。

而互斥型訊號量就是具有解決優先順序反轉問題的特性。

3.uc/os-ii的互斥型訊號量由三個部分組成:

◆乙個標誌,指示mutex是否可以使用(0或1)

◆乙個優先順序,準備一旦高優先順序的任務需要這個mutex,賦予給占有mutex的任務。

◆乙個等待該mutex的任務列表。

訊號量的理解

什麼是semaphore 訊號量 訊號量 semaphore 是在多執行緒環境下使用的一種設施,它負責協調各個執行緒,以保證它們能夠正確 合理的使用公共資源。舉例 我們來看看乙個停車場是怎樣運作的。為了簡單起見,假設停車場只有三個車位,一開始三個車位都是空的。這是如果同時來了五輛車,看門人允許其中三...

linux 中訊號量 和 互斥量的 說明

include include include includetypedef struct ct sum ct sum void add1 void cnt pthread mutex unlock ct sum cnt lock pthread exit null return 0 void ad...

通俗理解訊號量

大家都知道,計算機有了作業系統後效能大幅度提公升,其根本原因就在於實現了程序的併發執行。多個併發的程序彼此之間圍繞著緊俏的資源產生了兩種關係,同步或互斥。而訊號量正式解決資源競爭的最有效途徑。比如記錄資源的數量,等待資源的程序數,等待資源的程序阻塞佇列在哪,當然最重要的是訊號量還代表這個資源是互斥的...