4.0 事件管理數據結構

一、事件控制塊(ECB)spa

任務管理須要任務控制塊(TCB),一樣,如果管理事件,也須要事件控制塊(ECB),其定義於ucos_ii.h中code

 1 #if (OS_EVENT_EN) && (OS_MAX_EVENTS > 0)
 2 typedef struct os_event {
 3     INT8U    OSEventType;                    /* Type of event control block (see OS_EVENT_TYPE_xxxx)    */
 4     void    *OSEventPtr;                     /* Pointer to message or queue structure                   */
 5     INT16U   OSEventCnt;                     /* Semaphore Count (not used if other EVENT type)          */
 6 #if OS_LOWEST_PRIO <= 63
 7     INT8U    OSEventGrp;                     /* Group corresponding to tasks waiting for event to occur */
 8     INT8U    OSEventTbl[OS_EVENT_TBL_SIZE];  /* List of tasks waiting for event to occur                */
 9 #else
10     INT16U   OSEventGrp;                     /* Group corresponding to tasks waiting for event to occur */
11     INT16U   OSEventTbl[OS_EVENT_TBL_SIZE];  /* List of tasks waiting for event to occur                */
12 #endif
13 
14 #if OS_EVENT_NAME_SIZE > 1
15     INT8U    OSEventName[OS_EVENT_NAME_SIZE];
16 #endif
17 } OS_EVENT;
18 #endif

用綠色突出兩個重點。blog

1.1  OSEventType 取值範圍隊列

 1 /*
 2 *********************************************************************************************************
 3 *                                        OS_EVENT types
 4 *********************************************************************************************************
 5 */
 6 #define  OS_EVENT_TYPE_UNUSED         0u  //未使用
 7 #define  OS_EVENT_TYPE_MBOX           1u  //消息郵箱
 8 #define  OS_EVENT_TYPE_Q              2u  //消息隊列
 9 #define  OS_EVENT_TYPE_SEM            3u  //信號量
10 #define  OS_EVENT_TYPE_MUTEX          4u  //互斥信號量
11 #define  OS_EVENT_TYPE_FLAG           5u  //事件標誌組

用宏代替,頗有可讀性。事件

 

1.2  OS_EVENT_TBL_SIZE宏定義消息隊列

1 #define  OS_EVENT_TBL_SIZE ((OS_LOWEST_PRIO) / 8 + 1)   /* Size of event table                         */

事件等表明的大小與任務數是密切相關的。OS_EVENT_TBL_SIZE是最低優先級的任務優先級,也就是空閒任務的優先級(書上說和就緒表大小同樣,若是空閒任務優先級是63的話,但是我已經忘了什麼是就緒表了,Mark一下)it

 

事件等待組和事件等待表的關係與任務管理中就緒組和就緒表的關係是同樣的,只不過事件等待組和事件等待表用於管理等待事件發生的的任務,並且這二者都在事件控制塊中,不像就緒表和就緒組就獨立的。io

 

二、ECB表event

於ucosii.h中定義table

1 #if (OS_EVENT_EN) && (OS_MAX_EVENTS > 0)
2 OS_EXT  OS_EVENT         *OSEventFreeList;          /* Pointer to list of free EVENT control blocks    */
3 OS_EXT  OS_EVENT          OSEventTbl[OS_MAX_EVENTS];/* Table of EVENT control blocks                   */
4 #endif

要注意的一點是,此表爲全局變量,儘可能表名與ECB中OSEventTbl同名(還有不少結構中也有與此同名的聲明,可是類型不一樣)。

 

三、事件控制塊和空閒鏈表

在事件管理中,將空閒的時間塊鏈接成爲一個單項的鏈表——事件控制塊空間鏈表。這個鏈表的形式和TCB空間鏈表的形式是徹底相同的。

 

介紹得很潦草,半年沒有學ucos了。

還好上次放下以前畫了一張map,否則都不知道怎麼開始。

lucky

相關文章
相關標籤/搜索