Vxworks中不同信號量的作用
1.semCCreate創(chuàng)建并初始化一個計數(shù)信號量
函數(shù)原型:
SEM_ID?semCCreate
( ????int?options,???????/*?semaphore?option?modes?*/ ????int?initialCount???/*?initial?count?*/ )
options選項:
SEM_Q_PRIORITY?基于優(yōu)先級的,即優(yōu)先級高的優(yōu)先執(zhí)行;
SEM_Q_FIFO?基于隊列形式的,先進(jìn)先執(zhí)行;
initialCount???初始化一般設(shè)置為SEM_EMPTY(0)或者SEM_FULL(1);如果設(shè)置為0則代表在不SemGive()的情況下不可用,設(shè)置為1表示在不SemGive()的情況可以使用一次。
該信號量適用于任務(wù)間通信或者通知使用,倆個任務(wù)處于依賴關(guān)系執(zhí)行的情況。比如網(wǎng)絡(luò)接受任務(wù)和我數(shù)據(jù)處理任務(wù),每接收一包數(shù)據(jù)通知處理該數(shù)據(jù)的任務(wù)去處理數(shù)據(jù)。如果處理任務(wù)比較慢,那么該信號量會記住接收到的數(shù)據(jù)包,直到處理完成才會清空計數(shù)。一次可以連續(xù)SemGive出多個信號。
2.semMCreate創(chuàng)建并初始化一個互斥鎖信號量
函數(shù)原型:
SEM_ID?semMCreate ( ????int?options???/*?mutex?semaphore?options?*/ )
options選項:
SEM_Q_PRIORITY?(0x1)基于優(yōu)先級的,即優(yōu)先級高的優(yōu)先執(zhí)行
SEM_Q_FIFO?基于隊列形式的,先進(jìn)先執(zhí)行;
SEM_DELETE_SAFE?(0x4)
SEM_INVERSION_SAFE?(0x8)
SEM_EVENTSEND_ERR_NOTIFY?(0x10)
SEM_INTERRUPTIBLE?(0x20)
該信號量適用于同一個函數(shù)被多個任務(wù)調(diào)用,但是如果同時調(diào)用的過程中可能發(fā)生沖突,使用該互斥信號量進(jìn)行保護(hù),例如出啊口或者網(wǎng)絡(luò)發(fā)送數(shù)據(jù)函數(shù)等。
3.semBCreate創(chuàng)建并初始化一個二進(jìn)制信號量
函數(shù)原型:
SEM_ID?semBCreate ( ????int?????????options,???????/*?semaphore?options?*/ ????SEM_B_STATE?initialState???/*?initial?semaphore?state?*/ )
options選項:
SEM_Q_PRIORITY?基于優(yōu)先級的,即優(yōu)先級高的優(yōu)先執(zhí)行;
SEM_Q_FIFO?基于隊列形式的,先進(jìn)先執(zhí)行;
initialCount???初始化一般設(shè)置為SEM_EMPTY(0)或者SEM_FULL(1);如果設(shè)置為0則代表在不SemGive()的情況下不可用,設(shè)置為1表示在不SemGive()的情況可以使用一次。
適用于實時性同步的倆個任務(wù)之間通信,A任務(wù)做某個動作,此時B任務(wù)也需要做某個動作,但在B沒有及時做該動作不要求之后再繼續(xù)做的情況下,使用該信號量。一次只能SemGive一個信號。