一、事件控制块(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