1、事件控制块(ECB)
任务管理需要任务控制块(TCB),同样,若是管理事件,也需要事件控制块(ECB),其定义于ucos_ii.h中
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
用绿色突出两个重点。
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一下)。
事件等待组和事件等待表的关系与任务管理中就绪组和就绪表的关系是一样的,只不过事件等待组和事件等待表用于管理等待事件发生的的任务,而且这两者都在事件控制块中,不像就绪表和就绪组就独立的。
2、ECB表
于ucosii.h中定义
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同名(还有很多结构中也有与此同名的声明,但是类型不同)。
3、事件控制块和空闲链表
在事件管理中,将空闲的时间块连接成为一个单项的链表——事件控制块空间链表。这个链表的形式和TCB空间链表的形式是完全相同的。
介绍得很潦草,半年没有学ucos了。
还好上次放下之前画了一张map,不然都不知道怎么开始。
lucky