rtx任務間通訊 互斥量

2021-06-19 01:41:53 字數 1420 閱讀 7488

2013-11-06 

--luoqindong

void os_mut_init (

os_id mutex );    /* the mutex to initialize */

初始化乙個互斥量,互斥量內部計數計為0, mutex型別必須為os_mut.在呼叫互斥量相關函式之前,必須用該函式先初始化互斥量.

os_result os_mut_wait (

os_id mutex,        /* the mutex to acquire */

u16   timeout );    /* length of time to wait */

返回值:

os_r_ok

獲取到互斥量,給互斥量上鎖後返回

os_r_mut  任務掛起,在超時之前獲取到互斥量,給互斥量上鎖後返回

os_r_tmo    等待互斥量超時返回.

該函式用於獲取乙個互斥量,

1. 如果互斥量沒有上鎖(計數計為0),將互斥量計數計加1後返回os_r_ok,

2. 如果互斥量已上鎖,呼叫該函式的任務會掛起(timeout !=0 的情況),

3. 在超時前獲取到互斥量,該函式返回os_r_mut,超時後返回os_r_tmo.

互斥量使用優先順序繼承機制解決優先順序反轉的問題,如一全域性變數g受到互斥量的保護,任務a優先順序為1,需要訪問該全域性變數,所以先占有了互斥量,

在任務a還在訪問完全域性變數時,切換到了優先順序為2的任務b執行,b也想訪問全域性變數g,於是呼叫os_mut_wait獲取互斥量,但是任務a現在占有互

斥量且優先順序比任務b低,這時os_mut_wait將任務a的優先順序改為2(任務b的優先順序),讓任務a先執行,任務a訪問完全域性變數g,呼叫os_mut_release

釋放互斥量時,會將任務a優先順序恢復為1.

引數mutex型別必須為os_mut, timeout為超時時間,單位為系統tick, 0和0xffff為特殊值:

timeout=0時,獲取不到互斥量會立即返回os_r_tmo

timeout=0xffff表示無限等待

os_result os_mut_release (

os_id mutex );    /* the mutex to release */

返回值:

os_r_ok   互斥量解鎖成功

os_r_nok  解鎖出錯: 1. 互斥量內部計數計為0  2. 呼叫該函式的任務不是互斥量的擁有者(如任務a上鎖互斥量,但是任務b去解鎖) 

如果任務a占有互斥量m,任務a可以繼續呼叫os_mut_wait獲取互斥量m,這時os_mut_wait只是簡單的將互斥量計數計加1,然後返回。

呼叫os_mut_release解鎖互斥量時,

1.如果互斥量內部計數計》=1,將計數計減1,返回os_r_ok.

2.互斥量內部計數計為0, 返回os_r_nok

RTX 互斥量 和 訊號量

互斥量 如果乙個任務獲得資源以後沒有釋放,下次執行時候這個任務本身不必再等待,直接擁有這個資源的使用權,但別的任務要使用只能等待。訊號量 假設初始化時只有1個資源可以使用,那麼乙個任務獲得資源以後沒有釋放,下次想再呼叫 就算是之前呼叫的這個任務也 必須等待。這是訊號量和互斥量的區別之一,之二是互斥量...

任務間通訊

另請參閱 阻止多個rtos物件 佇列是任務間通訊的主要形式。它們可以用來在任務之間以及中斷和任務之間傳送訊息。在大多數情況下,它們被用作執行緒安全fifo 先入先出 緩衝區,新資料被傳送到佇列的後面,儘管資料也可以傳送到前端。寫入和讀取佇列。在這個例子中,佇列被建立為儲存5個專案,並且佇列永遠不會變...

Linux講解 程序間通訊 訊號量的互斥

這是實現訊號量互斥操作的程式 include include include include include include include define ipc key 0x12345678 union sem void sem p int id void sem v int id int mai...