ucos 事件控制塊 及 處理函式

2021-06-08 19:47:52 字數 1833 閱讀 4708

.oseventtype

ecb型別 有以下幾種:

#define os_event_type_unused

0#define os_event_type_mbox

1#define os_event_type_q

2#define os_event_type_sem

3#define os_event_type_mutex

4#define os_event_type_flag

5.oseventcnt

訊號量計數 表示最大空共享的數目

.*oseventptr 用於訊息和佇列

.oseventtbl 和 .oseventgrp

分別與管理任務的osrdytbl 和 osrdygrp 類似,oseventtbl用於放置該事件的所有等待任務。原理圖如下:

二、將任務置於等待事件的任務列表

三、從等待任務列表中刪除乙個任務

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

四、在等待任務列表中查詢最高優先順序的任務

y = osunmaptbl[pevent->oseventgrp];

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

prio = (y << 3) + x;

五、空餘事件控制塊鍊錶

在呼叫osinit()時,所有事件控制塊被鏈結成乙個單向鍊錶——空閒事件控制塊鍊錶。每當建立乙個訊號量、郵箱或者訊息佇列時,就從該鍊錶中取出乙個空閒事件控制塊,並對它進行初始化。刪除時,可將事件控制塊放回到空餘事件控制塊鍊錶中。

六、初始化乙個事件控制塊,os_eventwaitlistinit()

就是將該ecb中的.oseventtbl 和 .oseventgrp 全部清0 

七、使乙個任務進入就緒態,os_eventtaskrdy()

先從等待任務列表中刪除這個任務:

再將這個任務置於任務就緒表:

if (ptcb->ostcbstat == os_stat_rdy)

八、使乙個任務進入等待某事件發生狀態,os_eventtaskwait()

將任務移出就緒表

if ((osrdytbl[ostcbcur->ostcby] &= ~ostcbcur->ostcbbitx) == 0x00)

將任務進入該事件的等待列表

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

pevent->oseventgrp

|= ostcbcur->ostcbbity;

有了這些基本知識,後面的事件處理就簡單多了

ucos任務控制塊詳解

ucos實現多工的基礎包括幾個方面 任務控制塊,任務堆疊,中斷,任務優先順序,一一說起 首先,任務控制塊的結構如下 系統在執行乙個任務的時候,按照任務的優先順序獲取任務控制塊,再在任務堆疊中獲得任務 指標 typedef struct os tcb os tcb 該結構體中有比較多的靠巨集定義開啟的...

ucos 任務控制塊及任務鍊錶

1 任務控制塊 首先看看ucos中任務控制塊的資料結構為 typedef struct os tcb os tcb 任務控制塊記錄了 任務的堆疊指標,任務當前的執行狀態,任務的優先順序等屬性。其中上面結構中任務狀態 int8u ostcbstat task status 的可取值範圍如下 2 任務控...

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

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