rtx任務間通訊--互斥量
阿新 • • 發佈:2019-01-22
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
--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