uCOS II 之事件控制塊學習

2021-05-22 02:01:29 字數 2599 閱讀 8319

1940 

一.   事件控制塊ecb資料結構:

typedef struct

os_event; 

二.關鍵演算法:

1、將乙個任務插入到等待事件的任務列表中:

當呼叫函式os_eventtaskwait( )使乙個任務進入等待某事件發生時,需要此演算法,從而將任務插入到等待事件的任務列表中。

pevent -> oseventgrp         |= osmaptbl[prio >> 3];

pevent -> oseventtbl[prio>>3]  = osmaptbl[prio & 0x07];

2、從等待事件的任務列表中使任務脫離等待狀態:

當呼叫函式os_eventtaskrdy( )使乙個任務進入就緒態時,需要呼叫此演算法,從而使等待的任務脫離等待狀態進入就緒。

if ((pevent -> oseventtbl[prio >>3] &= ~osmaptbl[prio & 0x07]) == 0)

3、在等待事件的任務列表中查詢優先順序最高的任務:

當呼叫函式os_eventtaskrdy( )使乙個任務進入就緒態時,需要呼叫此演算法,從而首先找出在等待事件任務列表中最高優先順序的任務進入就緒狀態。

y = osunmaptbl[pevent -> oseventgrp];

x = osunmaptbl[pevent -> oseventtbl[y];

prio = (y << 3) + x;

三.對事件控制塊ecb的基本操作

1、初始化乙個事件控制塊:

函式ossemcreate( ),osmutexcreate( ),osmboxcreate( ),osqcreate( )建立時,必須呼叫此函式進行初始化,初始化乙個空的等待列表,表中沒有任何等待事件的任務。

os_eventwaitlistinit( );

2、使乙個任務進入就緒態:

當某個事件發生了時,要將事件等待任務列表中最高優先順序的任務進入就緒態,函式ossempost,osmutexpost( ),osmboxpost( ),osqpost( )必將呼叫此函式從而使乙個任務進入就緒態。

os_eventtaskrdy( );

3、使乙個任務進入等待某事件發生:

當某個任務須等待乙個事件的發生時,訊號量、互斥型訊號量、郵箱、訊息佇列會通過相應的pend函式來呼叫這個函式。

os_eventtaskwait( );

4、由於等待超時而將任務置為就緒態:

如果在預先指定的等待時間內任務等待的事件沒有發生,那麼pned型別函式將會呼叫此函式從而將等待超時的任務進入就緒態。

os_eventto( );

四.事件控制塊ecb基本操作**的分析。

1、os_eventwaitlistinit( );

void os_eventwaitlistinit(os_event *pevent)

2、os_eventtaskrdy( );

int8u os_eventtaskrdy(os_event *pevent, void *msg,int8u msk)

ptcb  = ostcbpriotbl[prio]; //知道了任務優先順序,從而找到任務控制塊的指標

ptcb -> ostcbdly     = 0;  //由於此任務已經不再等待事件的發生,因此直接清0

ptcb -> ostcbeventptr = (os_event *)0;//由於不再等待事件的發生,使指向事件控制塊的指標指向null

#if ((os_q_en > 0) && (os_max_qs > 0)) || (os_mbox_en > 0)

ptcb -> ostcbmsg = msg;//如果此函式是郵箱或佇列post函式呼叫的,則需要將傳遞來的引數放到它的任務控制塊中

#else

msg = msg;

#endif

ptcb -> ostcbstat &= ~msk;

if (ptcb -> ostcbstat == os_stat_rdy)]

return (prio);

}3、os_eventtaskwait( );

void os_eventtaskwait(os_event *pevent)

//如果在pend函式中沒有收到有效的訊號量,

//那麼將呼叫此函式進入睡眠態,在這裡將任務在任務就緒列表中刪除    

pevent -> oseventtbl[ostcbcur -> ostcby] |= ostcbcur -> ostcbbitx;

pevent -> oseventgrp |= ostcbcur -> ostcbbity;//把此任務放到ecb的等待事件的任務列表中去

}4、os_eventto( );

void os_eventto (os_event *pevent)

//將超時的任務在等待任務列表中刪除

ostcbcur -> ostcbstat = os_stat_rdy; //任務置為就緒態

ostcbcur -> ostcbeventptr = (os_event *)0;

}

uCOS II 之事件控制塊學習

一。事件控制塊ecb資料結構 typedef struct os event 二 關鍵演算法 1 將乙個任務插入到等待事件的任務列表中 當呼叫函式os eventtaskwait 使乙個任務進入等待某事件發生時,需要此演算法,從而將任務插入到等待事件的任務列表中。pevent oseventgrp ...

uC OS II 之事件控制塊學習筆記

uc os ii 之事件控制塊學習筆記 一.事件控制塊ecb資料結構 typedef struct os event 二 關鍵演算法 1,將乙個任務插入到等待事件的任務列表中 當呼叫函式os eventtaskwait 使乙個任務進入等待某事件發生時,需要此演算法,從而將任務插入到等待事件的任務列表...

UC OS II基礎知識之事件控制塊及事件處理函式

1.等待任務列表 為了將描述事件的資料結構統一起來,uc os ii使用事件控制塊ecb的資料結構來描述如訊號量,訊號佇列和郵箱這些事件。事件控制塊的資料結構如下所示 typedef struct os event os event endif 應用程式中的任務通過指標pevent來訪問事件控制塊,...