4.0 事件管理数据结构

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

posted on 2013-12-17 20:32 shivency 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/shivency/p/3479214.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值