uTenux實驗 事件標誌

2021-09-08 00:28:04 字數 4307 閱讀 1515

事件標誌是乙個用來實現同步的物件,由多個位組成,用作指示對應事件存在的標誌。事件標誌由用來指示對應事件存在的位模式(bitpattern)和乙個等待事件標誌的任務佇列組成。

utenux提供了一組api用於處理事件標誌:建立、刪除、設定、等待、清除。

1、建立事件標誌:tk_cre_***

為建立的事件標誌分配乙個控制塊

事件結構體:

typedef    struct

t_c*** t_c***;

其中事件屬性***atr,可設定為以下的乙個或多個值:

ta_tfifo   任務按fifo的順序排隊

ta_tpri     任務按優先順序順序排隊

ta_wsgl    不允許等待多個任務(等待乙個任務)

ta_wmul    允許等待多個任務(等待多個任務)

ta_dsnme   設定ds物件名

os根據事件標誌的屬性對使用這個事件標誌的任務進行排程。

等待:等待任意乙個條件滿足,與等待:等待所有條件滿足

我的理解,事件標誌就是乙個二進位制數。因為事件標誌本身就是個uint型別的數字。設定事件標誌就是將這個數的某一位置位,清除事件標誌就是將這個數的某一位清零。同乙個事件標誌有多個位,多個任務可以同時使用乙個事件標誌。

建立事件標誌,os會建立乙個事件標誌的控制塊,用於排程。建立事件標誌的時候,會為這個時間標誌設定個初始值:i***tn。與任務和訊號量相同,***id只是這個事件標誌的代表,並不是事件標誌的值。

事件標誌的屬性中如果ta_wmul設定為1,那麼就允許多個任務同時等待乙個事件標誌。當乙個事件標誌被設定時,如果多個任務都滿足條件,此時這些任務都會被釋放。進入等待狀態,有系統排程決定哪個先執行哪個後執行。

2、設定和清除時間標誌

er ercd=tk_set_***(id ***id,uint setptn) ;

er ercd= tk_clr_***(id ***id,uint clrptn);

給出事件標誌的id,和要設定的位,即可設定或清除事件標誌。

如果乙個呼叫tk_wai_***的任務的等待狀態釋放條件滿足,則該任務的等待狀態被清除。即此時os的事件分派器工作了。

3、等待事件標誌:

erercd= tk_wai_***(id ***id,uint waiptn,uint wfmode,uint* p_***ptn,tmo tmout);

等待***id的某些位被置位。如果條件不滿足,則進入等待狀態。

關於api的詳細描述,utenux核心規範有詳細介紹。

【實驗描述】

1、建立乙個事件標誌:***id,***id事件標誌的初始值設定為1. 如果初始值i***tn被設定為0x02,那麼taskb將先執行一遍迴圈,然後進入等待後taska開始執行。

2、建立兩個優先順序相同的任務:eventflagsampletaska(taska)eventflagsampletaskb(taskb)

3、建立任務後啟動taskb,在taskb中啟動taska。此時由於taskb的優先權較大,taskb繼續執行,遇到等待事件標誌時候停止執行。此時taska開始執行。

4、taska首先為taskb設定事件標誌(0x02),然後申請事件標誌flag的0x01。條件滿足,繼續執行清除這個事件標誌(0x01)。迴圈執行,重新等待事件標誌,此時事件標誌沒有被設定,所以taska進入休眠狀態。taskb繼續執行。

5、taskb獲得優先權開始執行,完成flagid(0x02)的清除,之後繼續等待資格事件。當然,同樣沒等到進入休眠,任務a繼續。

6、如此往復。。。

【實驗**】

#include "

eventflagsample.h

"void

eventflagsampletaska(w stacd,vp exinf);

void

eventflagsampletaskb(w stacd,vp exinf);

void eventflagsampleput***(void

);static

id taskid_a;

static

id taskid_b;

static

id ***id;

export er eventflagsample(

void)

else

ctsk.bufptr =(vp)null;

ctsk.exinf =(vp) null;

ctsk.task =eventflagsampletaska;

ctsk.stksz = 512

; ctsk.itskpri = 24

; ctsk.tskatr = ta_hlng |ta_rng0;

taskid_a = tk_cre_tsk(&ctsk);

if(taskid_a else

ctsk.task =eventflagsampletaskb;

ctsk.itskpri = 24

; taskid_b = tk_cre_tsk(&ctsk);

if(taskid_b else

tm_putstring(

"啟動任務b\n");

tk_sta_tsk(taskid_b,5);

return

e_ok;

}void

eventflagsampletaska(w stacd,vp exinf)}

void

eventflagsampletaskb(w stacd,vp exinf)

while(1);}

void eventflagsampleput***(void

)

【實驗輸出】

成功建立事件標誌

成功建立任務a

成功建立任務b

啟動任務b

任務b啟動任務a

任務b迴圈開始

任務a迴圈開始

now flag pattern is 0x00000003

now flag pattern is 0x00000001

taskaend

任務a迴圈開始

now flag pattern is 0x00000003

now flag pattern is 0x00000001

taskaend

任務a迴圈開始

now flag pattern is 0x00000003

now flag pattern is 0x00000001

taskaend

任務a迴圈開始

now flag pattern is 0x00000003

now flag pattern is 0x00000001

taskaend

任務a迴圈開始

now flag pattern is 0x00000003

now flag pattern is 0x00000001

taskaend

任務a迴圈開始

now flag pattern is 0x00000003

now flag pattern is 0x00000001

taskaend

任務a迴圈開始

now flag pattern is 0x00000003

now flag pattern is 0x00000001

taskaend

任務a迴圈開始

now flag pattern is 0x00000003

now flag pattern is 0x00000001

taskaend

任務a迴圈開始

now flag pattern is 0x00000003

now flag pattern is 0x00000001

taskaend

任務a迴圈開始

now flag pattern is 0x00000003

now flag pattern is 0x00000001

taskaend

任務a迴圈開始

now flag pattern is 0x00000003

now flag pattern is 0x00000001

【總結】

事件標誌應該是為了等待兩個任務同步而設立的。每個任務完成一定的工作之後,通過事件標誌通知另乙個任務可以執行了。從而使得兩個任務之間協調完成一項工作。

uTenux實驗 訊號量

訊號量 semaphore 是乙個用來指示可用的資源並將可用資源的數量以數值的形式表示出來的物件。當使用一組資源時,訊號量用來實現互斥控制和同步。utenux 提供了訊號量出來的 api,可以很方便地使用訊號量。utenux 中,訊號量包含乙個資源計數 用來指示是否存在相應的資源以及資源的數量 和乙...

FreeRTOS 事件標誌組

訊號量同步只能與單個的事件或任務進行同步。事件標誌組與多個事件或任務進行同步 事件位用來表明某個事件是否發生,事件組是一組事件位 動態方法建立事件標誌組 eventgrouphandle t xeventgroupcreate void 設定事件位 eventbits t xeventgroupse...

ucos iii 事件標誌組

建立事件標誌組 osflagcreate os cfg flag en os flag grp enginestatus os err err osflagcreate enginestatus,engine status os flags 0,err 刪除事件標誌組 osflagdel os cf...