vxworks系統學習 二進位制訊號量

2021-07-15 20:28:56 字數 2223 閱讀 4867

在vxworks中使用訊號量工具對互斥與任務同步進行操作。在wind核心中存在二進位制訊號量、互斥訊號量及計

數訊號量。互斥:當共享位址空間進行簡單的資料交換時,為避免競爭需要對記憶體進行互鎖,即多個任務訪問共享記憶體時,體現出來的排它性。使用二進位制訊號量就可以很方便地實現互斥,當多個任務訪問共享資源時,對該資源設定乙個訊號量(相當於令牌),那麼拿到該令牌的任務就可以獨享該資源。

二進位制訊號量需要的系統開銷最小,因而特別適合於高效能的需求。

注意:(1)互斥中的訊號量與任務優先順序的關係:任務的排程還是按照任務優先順序進行,但是在使用記憶體的時候只有乙個任務獲得訊號量,也就是說還是按照任務優先順序獲得訊號量從而訪問資源。只有當前使用資源的任務使用semgive()釋放訊號量後,其它任務按照優先順序才可以獲得訊號量。

(2)訊號量屬性中的引數為:sem_q_priority。而且在建立訊號量的時候必須把訊號量置為滿sem_full,即訊號量可用,等待訊號的任務可以根據優先順序順序(sem_q_priority)或者先進先出(sem_q_fifo)進行排隊。

如圖1所示,使用sembcreate(),分配並初始化乙個二進位制訊號量,返回值為一訊號量id,為其他訊號量控制函式的應用提供控制代碼,並設定資源可用(full)還是不可用(empty)。

任務可以呼叫semtake()函式提取二進位制訊號量,如果訊號量可用(full)那麼將變得不可用(empty),同時任務繼續執行。如果訊號量不可用(empty),呼叫semtake()函式的任務將被放到乙個阻塞佇列中,處於等待訊號量可用的狀態(pending掛起)。

semgive()可用於釋放訊號量。若訊號量不可用(empty)並且沒有任務在等待它,那麼該訊號量將變得可用(full),若訊號量不可用(empty)並且有任務在等待它,那麼 阻塞佇列中的第乙個任務將得到該訊號量變得不阻塞, 同時 該訊號量仍舊不可用(empty),若訊號量可用(full),呼叫semgive()不產生任何影響。

互斥模型程式說明:

sem_id semmutex;

semmutex = sembcreate(sem_q_priority, sem_full);//優先順序順序排隊,訊號量可用

task(void)

任務同步:任務利用訊號量控制自己的執行進度,按照一定的先後順序執行。例如為了任務a與b同步,a與b可以共享乙個訊號量,初始值設定為不可用,在a之後呼叫semgive

在b之前呼叫semtakesem_id 即可。

sem_id  semsync;
semsync = sembcreate(sem_q_fifo, sem_empty);

taska(void)

taskb(void)

注意: 

(1)建立的新的訊號量初始值應當為不可用(empty),因而可能使得優先順序翻轉,即高優先順序任務在低優先順序任務之後執行;

(2)屬性引數設定:sem_q_fifo,sem_empty。在不同的task中分別單獨呼叫semtake()

,semgive()且先後順序不能顛倒。

(3)禁止刪除那些任務正在請求訊號量。

(4)semtake()不可以在中斷中呼叫,因為呼叫semtake()

的函式可能被掛起,而中斷不可以被掛起。semgive

()可以在中斷中呼叫

例子程式:

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)

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...

1 5 二進位制系統

1.5.1 二進位制記數法 無論哪個進製,每乙個位置的表示都與乙個量值有關。十進位制,最右邊位置的量值是1,向左一位量值是10,再次向左一位量值是100,每個位置的量值都是其右邊位置量值的10倍。例如 375 就等於 3 100 7 10 5 1 更技術性的表示法為 3 10 2 7 10 1 5 ...

學習二進位制有感

二進位制,乙個曾經只是聽說過沒見過的東西,現在已經漸漸地走入了我們日常的學習生活。二進位制的學習過程既簡單又繁瑣,簡單的0和1卻能產生出無數種組合,進行各種各樣的轉換,這給初次接觸的我們帶來了不少麻煩。慢慢的,老師通過耐心的講解和一些有意思的小遊戲讓我們加深了對這些枯燥的概念的理解,其中一款csic...