VxWorks主要提供以下API進行信號量的建立、獲取和釋放:
參數1:SEM_Q_PRIORITY,SEM_Q_FIFO
SEM_Q_PRIORITY(值爲0x1):須要獲取該信號量的任務基於優先級順序排列。
SEM_Q_FIFO(值爲0x0):須要獲取該信號量的任務基於等待任務隊列的先進先出順序排列。
參數2: SEM_FULL,SEM_EMPTY
SEM_FULL: 初始化信號量爲滿(可用),
SEM_EMPTY: 後者初始化信號量爲空(不可用)。
(1)semBCreate( ):分配並初始化一個二進制信號量,函數原型爲:
SEM_ID semBCreate
(
int options, /*信號量選項*/
SEM_B_STATE initialState /*信號量初始化狀態值*/
) ;
(2)semMCreate( ):分配並初始化一個互斥信號量,函數原型爲:
SEM_ID semBCreate
(
int options, /*信號量選項*/
SEM_B_STATE initialState /*信號量初始化狀態值*/
);
(3)semCCreate( ):分配並初始化一個計數信號量,函數原型爲:
SEM_ID semCCreate
(
int options, /*信號量選項*/
int initialCount /*信號量初始計數值*/
) ;
當一個信號量被建立時,它的隊列(queue)類型須要被肯定。等待信號量的任務隊列能夠以優先級順序 (SEM_Q_PRIORITY)或者先到先得方式(SEM_Q_FIFO)排列。
(4)semDelete( ):刪除一個自由的信號量,函數原型爲:
STATUS semDelete
(
SEM_ID semId /*要刪除的信號量ID號*/
);
(5)semTake( ):佔有一個信號量,函數原型爲:
STATUS semTake
(
SEM_ID semId /*所要獲得的信號量ID號*/
int timeout /*等待時間*/
);
(6)semGive( ):釋放一個信號量,函數原型爲:
STATUS semGive
(
SEM_ID semId /*所給出的信號量ID號*/
);
(7)semFlush( ):解鎖全部等待信號量的任務,函數原型爲:
STATUS semFlush
(
SEM_ID semId /*要解鎖的信號量ID號*/
);
二進制信號量:
要建立一個發揮互斥做用的二進制信號量通常使用semBCreat(xxx, SEM_FULL)調用,其中的SEM_FULL暗示該信號量用於任務間的互斥(最開始二進制信號量可得到)。對臨界區域(critical region)的訪問需以semTake和semGive加以保護:
semTake (semMutex, WAIT_FOREVER);
. . /*critical region, only accessible by a single task at a time*/
semGive (semMutex);
要建立一個發揮同步做用的二進制信號量通常使用semBCreat(xxx, SEM_EMPTY) 調用,其中的SEM_EMPTY 暗示該信號量用於任務間的同步(即最開始二進制信號量不可得到)。
二進制信號量使用最普遍的一種狀況是中斷與任務間通訊。中斷服務程序通常以二進制信號量「通知」對應的任務進行中斷後的處理工做,例如:
SEM_ID syncSem;/* ID of sync semaphore */
myTask(void)
{
semTake(syncSem, WAIT_FOREVER); /* wait for event to occur */
printf("my Task got the semaphore/n");
... /* process event */
}
eventInterruptSvcRout(void)
{
semGive(syncSem); /* let my Task process event */
...
}
互斥信號量
互斥信號量能夠看做一種特殊的二進制信號量,其支持普通二進制信號量不支持的一些特性,提供優先級繼承、安全刪除和迴歸能力。互斥信號量的使用方法和二進制信號量基本相似,但有以下區別:
(1)僅僅被用作互斥,不能提供同步機制;
(2)只能被使用它的任務釋放;
(3)中斷服務程序(ISR)不能釋放它;
(4)不能使用函數semFlush( );
(5)支持使用二進制信號量進行互斥時所不支持的優先級「翻轉」。
任務的優先級翻轉是指高優先級任務因等待低優先級任務佔用的互斥資源而被較低優先級(高於低優先級但低於高優先級)的任務不斷搶佔的狀況。VxWorks操做系統提供優先級繼承機制對優先級翻轉進行預防。佔用互斥資源但優先級較低的任務被暫時地提升到等待該資源的最高優先級任務的優先級。這樣,中等優先級的任務將沒法搶佔本來低優先級的任務,使得低優先級任務能儘快執行,釋放出優先級較高的任務所須要的資源。
爲了使互斥信號量支持優先級繼承支持,咱們在調用semMCreate時應使用SEM_Q_PRIORITY和SEM_INVERSION_SAFE選項。互斥信號量提供互斥也須要對臨界區域進行保護:
semTake (semMutex, WAIT_FOREVER);
. . //critical region, only accessible by a single task at a time .
semGive (semMutex);
計數信號量
計數信號量是任務同步和互斥的另外一種實現方式.計數信號量除了保留信號量被釋放的次數之外和二進制信號量是同樣的。每次信號量被釋放(gaven)一次,計數增長;每次信號量被佔用(taken)一次,計數減小;當計數減小爲0時,要求獲得信號量的任務被阻塞(blocked)。二進制信號量是若是一個信號量被釋放,有一個任務阻塞等待,則這個任務就被unblock.而計數信號量若是一個信號量被釋放,沒有任務阻塞等待,則計數增長。這說明一個被釋放兩次的計數信號量能夠被佔用(taken)兩次,沒有阻塞
互斥型信號量必須是同一個任務申請,同一個任務釋放,其餘任務釋放無效。同一個任務能遞歸申請。安全
二進制信號量,一個任務申請成功後,能由另外一個任務釋放。可用於任務同步,也可用於互斥函數
計數信號量可用於隊列數據的存儲操作系統