版权声明:玛雅实时操作系统(MY-RTOS)软件及其说明文档由 欣欣学习网 版主 Stoneway QI 创作,作者保留其版权。任何人可以免费在其产品设计或著作中使用或引用该软件及其说明文档,但要求保留原作品当中的版权声明,并注明引用段落的出处。 -- Stoneway QI 主页: http://www.xxworks.com 邮箱: Stonewayqi@hotmail.com 与同时等待多个信号量类似,任务有时需要同时等待多个事件。在玛雅系统中,这一要求是通过“事件组”的机制实现的。事件组中可以包含有多个事件,当其中任何一个事件被投送消息后都可以触发等待该事件组的任务。
使用事件组之前,首先要定义一系列的事件、一个事件指针数组、一个消息序号数组,以及事件组,并对它们赋初值。事件指针数组的初值为各个事件的地址,而事件组的初值则为事件指针数组的起始地址、0和所包含的事件的数量。以包含有3个事件的事件组为例,示例代码如下:
|
...
OS_EVENT Event1 = {0, 0, 0}; //将事件定义成全局变量并赋初值
OS_EVENT Event2 = {0, 0, 0}; //将事件定义成全局变量并赋初值
OS_EVENT Event3 = {0, 0, 0}; //将事件定义成全局变量并赋初值
OS_EVENT * pEvent[3] = {&Event1, &Event2, Event3}; //定义事件指针数组
U8 Num[3]; //定义一个U8型数组,用于存放消息序号
OS_EVENT_LIST EventList = {&pEvent, 0, 3}; //定义事件组
...
void main(void)
{
BSP(); // 硬件初化
OSInit(72000); //玛雅系统初始化
...
while(1)
{
...
}
} (1) |
|
任务通过调用系统函数OSWaitEventList()来等待事件组。该函数有4个入口参数,第1个入口参数是事件组指针,指向所等待的事件组,第2个参数是U32型指针,指向一个用于存放事件消息的U32型变量,第3个参数是U8型的指针,指向用于存放消息序号的U8型数组的起始地址,第4个入口参数是S16型变量,用来传递超时限定时间,单位为系统节拍,当取值 -1 时表示无限期等待。当该函数的返回值为OS_STATUS_OK时,表示成功等到事件。此时,消息代码已存放在对应的变量中,而事件组的成员Id中存有提供该消息的事件在事件指针数中的序号,该值也是消息序号在消息序号数组中的序号。该函数返回其它值时,返回值分别代表各种错误。以上例中所定义的事件组为例,任务等待事件组的示例代码如下:
|
...
...
void main(void)
{
U32 Msg = 0;
...
...
while(1)
{
...
//等待事件组,并限定等待时间为1000个统节拍。当返回值为OS_STATUS_OK时
//有消息存放于Msg中,其来源为pEvent[EventList.Id]事件,消息的序号存
//放在Num[EventList.Id]中
if(OSWaitEventList(&EventList, &Msg, &Num, 1000) == OS_STATUS_OK)
{
switch(EventList.Id) //根据消息的来源进行处理
{
case 0: //消息来自第1个事件
...
break;
case 1: //消息来自第2个事件
...
break;
case 2: //消息来自第3个事件
...
break;
default: //错误的代码
...
break;
}
}
...
}
} (2) |
|
玛雅系统中,要求1个事件组在同一时间内只能有一个任务对其等待,而对事件组中所包含的事件,则不限制等待任务的数量。
|