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

2021-07-09 08:08:51 字數 3777 閱讀 1561

1.等待任務列表

為了將描述事件的資料結構統一起來,uc/os-ii使用事件控制塊ecb的資料結構來描述如訊號量,訊號佇列和郵箱這些事件。事件控制塊的資料結構如下所示:

typedef struct os_event  os_event;

#endif

應用程式中的任務通過指標pevent來訪問事件控制塊,事件控制塊結構示意圖如下圖所示

成員oseventtype為事件的型別如下表所示

成員oseventptr主要用來存放訊息郵箱或者訊息佇列的指標。

成員oseventcnt為訊號量的計數器。

成員oseventtbl[os_event_tbl_size]表示等待任務表。

3.對事件控制塊的操作

uc/os-ii有四個對事件控制塊進行基本操作的函式(定義在os_core.c)

3.1事件控制塊的初始化

呼叫函式os_eventwaitlistinit()可以對事件控制塊進行初始化。函式原型如下

#if os_event_en

void os_eventwaitlistinit (os_event *pevent)

}

這個函式的作用就是把oseventgrp及任務等待表中每一位都請0,即令事件的任務等待表中不含任何等待任務

事件控制塊被初始化後的情況如下所示

3.2使乙個任務進入等待狀態的函式

把乙個任務至於等待狀態要呼叫函式os_eventtaskwait()函式原型如下

void

os_eventtaskwait (os_event *pevent)

pevent->oseventtbl[ostcbcur->ostcby] |= ostcbcur->ostcbbitx; /* put task in waiting list */

pevent->oseventgrp |= ostcbcur->ostcbbity;

}

3.3使乙個任務進入就緒狀態的函式把乙個任務至於等待狀態要呼叫函式os_eventtaskrdy()函式原型如下

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

else

bity = (int16u)(1

<< y);

ptbl = &pevent->oseventtbl[y];

if ((*ptbl & 0xff) != 0) else

bitx = (int16u)(1

<< x);

prio = (int8u)((y << 4) + x); /* find priority of task getting the msg */

#endif

pevent->oseventtbl[y] &= ~bitx; /* remove this task from the waiting list */

if (pevent->oseventtbl[y] == 0)

ptcb = ostcbpriotbl[prio]; /* point to this task's os_tcb */

ptcb->ostcbdly = 0; /* prevent ostimetick() from readying task */

ptcb->ostcbeventptr = (os_event *)0; /* unlink ecb from this task */

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

ptcb->ostcbmsg = msg; /* send message directly to waiting task */

#else

msg = msg; /* prevent compiler warning if not used */

#endif

ptcb->ostcbpendto = os_false; /* cancel 'any' timeout because of post */

ptcb->ostcbstat &= ~msk; /* clear bit associated with event type */

if (ptcb->ostcbstat == os_stat_rdy)

return (prio);

}#endif

該函式的作用就是把呼叫這個函式的任務在任務等待列表中的位置清0,再把任務就緒表中對應的位置1,然後引發一次中斷。

3.4使乙個等待超時的任務進入就緒狀態的函式

如果乙個正在等待事件的任務已經超過了等待事件,卻任然沒有獲得事件等原因而未具備執行的條件,卻又要使他進入就緒狀態,這時需要呼叫os_eventto()函式

void

os_eventto (os_event *pevent)

ostcbcur->ostcbpendto = os_false; /* clear the pend

timeout flag */

ostcbcur->ostcbstat = os_stat_rdy; /* set status to ready */

ostcbcur->ostcbeventptr = (os_event *)0; /* no longer waiting for event */

}

3.5空事件控制塊鍊錶uc/os-ii在初始化時,系統會在初始化函式osinit()中按應用程式使用事件os_max_event(在os_cfg.h定義)建立os_max_event個空事件控制塊。每當建立乙個事件時,系統會從時間控制塊鍊錶中取出乙個空事件控制塊,並對他進行初始化以描述該事件,當應用程式刪除乙個事件時,系統會將該事件的控制塊歸還給空事件控制塊鍊錶。空事件控制塊鍊錶如下所示

uCOS II 之事件控制塊學習

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

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 使乙個任務進入等待某事件發生時,需要此演算法,從而將任務插入到等待事件的任務列表...