wind核心中有二進位制訊號量、計數訊號量和互斥訊號量三種型別,為了是運用程式具有可移植性,還提供了posix(可移植作業系統介面)訊號量 。在vxworks中,訊號量是實現任務同步的主要手段,也是解決任務同步的最佳選擇。
關於互斥的實現:
使用二進位制訊號量可以很方便的實現互斥,互斥是指多工在訪問臨界資源時具有排他性。為了使多個任務互斥訪問臨界資源,只需要為該資源設定乙個訊號量,相當於乙個令牌,那個任務拿到令牌即有權使用該資源。把訊號量設定為可用,然後把需要的資源 的任務的臨界** 置於semtake()和semgive()之間即可。
註明:1、互斥中的訊號量與任務優先順序的關係:任務的排程還是按照任務優先順序進行,但是在使用臨界資源的時候只有乙個任務獲得訊號量,也就是說還是按照任務優先順序獲得訊號量從而訪問資源。只是當前使用資源的任務釋放訊號量semgive(),其它任務按照優先順序獲得訊號量。
2、訊號量屬性中的引數為:sem_q_priority。而且在建立訊號量的時候必須把訊號量置為滿sem_full。即訊號量可用。
基本實現互斥模型:
sem_id semmutex;
semmutex = sembcreate(sem_q_priority, sem_full);
task(void)
semtake(semmutex, wait_forever);//得到訊號量,即相當於得到使用資源的令牌
//臨界區,某乙個時刻只能由乙個任務 訪問
semgive(semmutex);
關於任務同步的實現
同步即任務按照一定的順序先後執行,為了實現任務a和b同步,只需要讓任務a和b共享乙個訊號量,並設定初始值為空,即不可用,將semgive()置於任務a之後,而在任務b之前插入semtake()即可。
說明:1、還是討論和優先順序的關係。由於訊號量初始化為空,不可用,所以可能使得優先順序反轉,即高優先順序任務b在等待低優先順序任務a釋放訊號量。只有執行了訊號量釋放語句semgive()後任務b得到訊號量才能執行。
2、屬性引數的設定為sem_q_fifo,sem_empty;
實現模型參考
sem_id semsync;
semsync = sembcreate(sem_q_fifo, sem_empty);
taska(void)
semgive(semsync); //訊號量釋放,有效
taskb(void)
semtake(semsync, wait_forever); //等待訊號量
使用訊號量注意事項:
1、用途不同,訊號量屬性和初始值不同
2、互斥訪問資源時,semtake()和semgive()必須成對出現,且先後順序不能顛倒。
3、避免刪除那些其它任務正在請求的訊號量。
應用:1、確保任務優先順序不反轉
sem_id semfs;
sem_id semfss;
sem_id semfex;
semfs = sembcreate(sem_q_fifo, sem_empty);
semfss = sembcreate(sem_q_fifo, sem_empty);
semfex = sembcreate(sem_q_fifo, sem_empty);
void t_imaget(void)
printf("a ");
semgive(semfs); //釋放訊號量
void t_imajud(void)
semtake(semfs, wait_forever); //確保優先順序不反轉
printf("jj ");
semgive(semfss);
void t_imapro(void)
semtake(semfss, wait_forever);
printf("rr");
semgive(semfex);
void t_imaexc(void)
semtake(semfex, wait_forever);
printf("y");
void start(void)
int tgetid, tjudid, tproid, texcid;
tgetid = taskspawn("tpget", 200, 0, 1000,(funcptr)t_imaget, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0);
tjudid = taskspawn("tpjud",201,0,1000,(funcptr)t_imajud,3,0,0,0,0,0,0,0,0,0);
tproid = taskspawn("tppro",202,0,1000,(funcptr)t_imapro,3,0,0,0,0,0,0,0,0,0);
texcid = taskspawn("tpexc",203,0,1000,(funcptr)t_imaexc,3,0,0,0,0,0,0,0,0,0);
以上例子雖然定了各個任務的優先順序,但是加上訊號量可以 實現同步,而且防止優先順序反轉的出現。
Vxworks訊號量分析
vxworks訊號量分析 wind 核心中有二進位制訊號量 計數訊號量和互斥訊號量三種型別,為了使應用程式具有可移植性,還提供了 posix 可移植作業系統介面 訊號量。在 vxorks 作業系統中,訊號量是實現任務同步的主要手段,也是解決任務同步問題的最佳選擇。關於互斥的實現 使用二進位制訊號量可...
vxworks訊號量分析
vxworks的訊號量機制分析 vxworks訊號量是提供任務間通訊 同步和互斥的最優選擇,提供任務間最快速的通訊。也是提供任務間同步和互斥的主要手段。vxworks提供3種訊號量來解決不同的問題。二進位制訊號量 最快的最常用的訊號量,可用於同步或互斥。互斥訊號量 為了解決內在的互斥問題如優先順序繼...
VxWorks學習筆記 訊號量
是實現任務互斥 同步操作的主要機制。vxworks 提供的訊號量經過了高度優化,在所有任務間通訊機制中,速度最快。二 訊號量的分類 binary semaphores 二進位制 完成互斥 同步操作的最佳方式 速度最快,最常用。mutual exclusion semaphores 互斥 一種特殊的二...