1. 程式人生 > >rtx任務間通訊--互斥量

rtx任務間通訊--互斥量

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