请选择 进入手机版 | 继续访问电脑版
快捷导航
本帖最后由 袁绪蝶 于 2017-12-21 20:22 编辑

一、事件控制块
1 事件控制块的使用方法
一个任务或者中断服务子程序可以通过事件控制块 ECB(Event Control Blocks)来向另外的任务发信号。这里,所有的信号都被看成是事件(Event)。把用于通讯的数据结构叫做事件控制块。

任务间通信、任务和ISR间通信方法有:信号量、邮箱、消息队列——都称之为“事件”
——信号量像一把钥匙,任务要运行下去,需先拿到这把钥匙。
——消息邮箱是一个指针型变量。可以向一个任务或一个中断服务子程序发送一则消息(一个指针),同样,一个或多个任务通过内核服务,可以接收这则消息。消息邮箱也可以当作只取2个值的信号量来用。
——消息队列实际上是邮箱阵列。

使用事件控制块的主体
发出信号的主体:
——任务
——中断服务子程序ISR
等待信号的主体:
——任务


因为信号量、邮箱和消息队列一旦建立就不能删除,所以事件控制块也不能放回到空闲事件控制块链表中。
2 事件控制块的数据结构
——μC/OS-II通过OS_EVENT数据结构来维护一个事件控制块的所有信息;
——OS_EVENT数据结构包含:
1.事件本身的定义:如用于信号量的计数器,用于指向邮箱的指针,以及指向消息队列的指针数组等
2.等待该事件的所有任务的列表。


3 事件的等待任务列表

——等待任务列表包括OSEventGrp和OSEventTbl[]两个域;
——每个等待事件发生的任务都被加入到该事件事件控制块中的等待任务列表中。



4 空余事件控制块链表

#define OS_MAX_EVENTS            10
OS_EVENT  OSEventTbl[OS_MAX_EVENTS];
——在调用 OSInit()时 ,所有事件控制块被链接成一个单向链表——空闲事件控制块链表OSEventFreeList。
——使用的事件控制块的总数由用户所需要的信号量、邮箱和消息队列的总数决定,最大值为OS_MAX_EVENTS。

**************************************************************************************************************************************
二、事件控制块的通用操作
1 初始化一个事件控制块
OS_EventWaitListInit()
——当建立一个信号量、邮箱或者消息队列时,相应的建立函数 OSSemCreate(),OSMboxCreate(),或者 OSQCreate()通过调用OSEventWaitListInit()对事件控制块中的等待任务列表进行初始化。
——该函数初始化一个空的等待任务列表,其中没有任何任务。该函数的调用参数只有一个,就是指向需要初始化的事件控制块的指针 pevent。

2 使一个任务进入就绪态

OS_EventTaskRdy()
——OSSemPost(),OSMboxPost(),OSQPost(),和OSQPostFront()函数调用 OSEventTaskRdy()函数。
——该函数从等待任务队列中删除 HPT任务(Highest Priority Task),并把该任务置于就绪态。


3 使一个任务进入等待某事件发生状态

OS_EventTaskWait()
——当某个任务要等待一个事件的发生时,相应事件的 OSSemPend(),OSMboxPend()或者 OSQPend()函数会调用该函数将当前任务从就绪任务表中删除,并放到相应事件的事件控制块的等待任务表中。


4 由于等待超时而将任务置为就绪态

OS_EventTo()
——当在预先指定的时间内任务等待的事件没有发生时,OSTimeTick()函数会因为等待超时而将任务的状态置为就绪。在这种情况下,事件的 OSSemPend(),OSMboxPend()或者 OSQPend()函数会调用OSEventTO()来完成这项工作。
——该函数负责从事件控制块中的等待任务列表里将任务删除,并把它置成就绪状态。最后,从任务控制块中将指向事件控制块的指针删除。用户应当注意,调用 OSEventTO()也应当先关中断。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Connecting & Messaging from Any.

共 0 个关于本帖的回复 最后回复于 2017-12-21 16:10

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

推荐板块

精彩推荐

热门排行

明星用户

手机版|小黑屋|AnyMSG ( ©AnyMSG 2009 - 2017 · ICP备16009991号 )

GMT+8, 2019-2-16 18:58