VxWorks訊號量分析 轉貼

2021-04-03 00:03:14 字數 2468 閱讀 6411

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 互斥 一種特殊的二...