ucos 事件控制块 及 处理函数

来源:互联网 发布:js下拉菜单显示选项 编辑:程序博客网 时间:2024/06/04 19:30

一.时间控制块ECB的数据结构
typedef struct {
INT8U OSEventType;
INT8U OSEventGrp;
INT16U OSEventCnt;
void *OSEventPtr;
INT8U OSEventTbl[OS_EVENT_TBL_SIZE];
} OS_EVENT;

.OSEventType ECB类型 有以下几种:
#define OS_EVENT_TYPE_UNUSED 0
#define OS_EVENT_TYPE_MBOX 1
#define OS_EVENT_TYPE_Q 2
#define OS_EVENT_TYPE_SEM 3
#define OS_EVENT_TYPE_MUTEX 4
#define OS_EVENT_TYPE_FLAG 5


.OSEventCnt 信号量计数 表示最大空共享的数目


.*OSEventPtr 用于消息和队列


.OSEventTbl[] 和 .OSEventGrp
分别与管理任务的OSRdyTbl[] 和 OSRdyGrp 类似,OSEventTbl[]用于放置该事件的所有等待任务。原理图如下:

ucos <wbr>事件控制块 <wbr>及 <wbr>处理函数
二、将任务置于等待事件的任务列表
pevent->OSEventGrp |= OSMapTbl[prio >> 3];
pevent->OSEventTbl[prio >> 3] |= OSMapTbl[prio & 0x07];

ucos <wbr>事件控制块 <wbr>及 <wbr>处理函数

三、从等待任务列表中删除一个任务
if ((pevent->OSEventTbl[prio >> 3] &= ~OSMapTbl[prio & 0x07]) == 0) {
pevent->OSEventGrp &= ~OSMapTbl[prio >> 3];
}

四、在等待任务列表中查找最高优先级的任务
y = OSUnMapTbl[pevent->OSEventGrp];
x = OSUnMapTbl[pevent->OSEventTbl[y]];
prio = (y << 3) + x;

五、空余事件控制块链表
在调用OSInit()时,所有事件控制块被链接成一个单向链表——空闲事件控制块链表。每当建立一个信号量、邮箱或者消息队列时,就从该链表中取出一个空闲事件控制块,并对它进行初始化。删除时,可将事件控制块放回到空余事件控制块链表中。

ucos <wbr>事件控制块 <wbr>及 <wbr>处理函数

六、初始化一个事件控制块,OS_EventWaitListInit()
就是将该ECB中的.OSEventTbl[] 和 .OSEventGrp 全部清0 

七、使一个任务进入就绪态,OS_EventTaskRdy()

先从等待任务列表中删除这个任务:
if ((pevent->OSEventTbl[y] &= ~bitx) == 0x00) {
pevent->OSEventGrp &= ~bity;
}

ucos <wbr>事件控制块 <wbr>及 <wbr>处理函数

再将这个任务置于任务就绪表:
if (ptcb->OSTCBStat == OS_STAT_RDY) {
OSRdyGrp |=bity;
OSRdyTbl[y] |= bitx;
}


八、使一个任务进入等待某事件发生状态,OS_EventTaskWait()

将任务移出就绪表

if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0x00) {
OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
}

将任务进入该事件的等待列表
pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX;
pevent->OSEventGrp |= OSTCBCur->OSTCBBitY;

有了这些基本知识,后面的事件处理就简单多了

原创粉丝点击