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

相关文章
相关标签/搜索