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...