vxworks訊號量分析
wind
核心中有二進位制訊號量、計數訊號量和互斥訊號量三種型別,為了使應用程式具有可移植性,還提供了
posix
(可移植作業系統介面)訊號量。在
vxorks
作業系統中,訊號量是實現任務同步的主要手段,也是解決任務同步問題的最佳選擇。
關於互斥的實現:
使用二進位制訊號量可以很方便的實現互斥,互斥是指多工在訪問臨界資源時具有排他性。為使多個任務互斥訪問臨界資源,只需要為該資源設定乙個訊號量,相當於乙個令牌,哪個任務拿到這個令牌即有權使用該資源。把訊號量設為可用,然後將需要資源的任務的臨界**置於
semtake()
和semgive
()之間即可。
註明:
1.互斥中的訊號量與任務優先順序的關係:任務的排程還是按照任務優先順序進行,但是在使用臨界資源的時候只有乙個任務獲得訊號量,也就是說還是按照任務優先順序來獲得訊號量從而訪問資源。只有當前使用資源的任務釋放訊號量
semgive
(),其他任務按照優先順序獲得訊號量。 2.
訊號量屬性中的引數為:
sem_q_priority
。而且在建立訊號量的時候必須把訊號量置為滿的
sem_full
。即訊號量可用。
基本實現互斥模型:
sem_id semmutex;
semmutex = sembcreate(sem_q_priority, sem_full);
task(void)
關於任務同步的實現:
同步即任務按照一定順序先後執行
,為了實現任務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)
taskb(void)
使用訊號量注意事項: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)
void t_imajud(void)
void t_imapro(void)
void t_imaexc(void)
void start(void)
以上例子雖然定了各個任務的優先順序,但加上訊號量可以實現同步,而且防止優先順序反轉出現。
vxworks訊號量分析
vxworks的訊號量機制分析 vxworks訊號量是提供任務間通訊 同步和互斥的最優選擇,提供任務間最快速的通訊。也是提供任務間同步和互斥的主要手段。vxworks提供3種訊號量來解決不同的問題。二進位制訊號量 最快的最常用的訊號量,可用於同步或互斥。互斥訊號量 為了解決內在的互斥問題如優先順序繼...
VxWorks訊號量分析 轉貼
wind核心中有二進位制訊號量 計數訊號量和互斥訊號量三種型別,為了是運用程式具有可移植性,還提供了posix 可移植作業系統介面 訊號量 在vxworks中,訊號量是實現任務同步的主要手段,也是解決任務同步的最佳選擇。關於互斥的實現 使用二進位制訊號量可以很方便的實現互斥,互斥是指多工在訪問臨界資...
VxWorks學習筆記 訊號量
是實現任務互斥 同步操作的主要機制。vxworks 提供的訊號量經過了高度優化,在所有任務間通訊機制中,速度最快。二 訊號量的分類 binary semaphores 二進位制 完成互斥 同步操作的最佳方式 速度最快,最常用。mutual exclusion semaphores 互斥 一種特殊的二...