12.2.7 等待函数
在RTX-51的系统函数中,提供了多个等待函数,分别用于不同的应用场合。下面分别介绍各个等待函数的声明及用法。
1.等待函数os_wait
等待函数os_wait主要用于多任务操作系统中暂停当前任务的执行,等待一个或多个事件的发生后再继续执行。在RTX-51 Tiny中,这里的事件可以是时间间隔、时间到或者来自其他任务以及中断的信号。等待函数os_wait的函数原型如下。
char os_wait(unsigned char event_sel,unsigned char ticks,unsigned int dummy);
其中,各个参数的含义如下。
❑参数event_sel表示等待发生的事件。可以选择的事件有3种形式:K_IVL表示等待的时间间隔、K_SIG表示等待的信号、K_TMO表示等待的时间到。其中,K_TMO即超时。这些事件可以单独使用,也可以在一起组合使用,示例如下。
event_sel=K_IVL|K_TMO;
event_sel=K_SIG|K_IVL;
❑参数ticks表示需要等待完成的时间到(K_TMO)或者时间间隔(K_IVL)所用的时间数。如果没有使用K_IVL或K_TMO事件,则ticks参数无意义。
❑参数dummy在RTX-51 Tiny中不用,其主要用于对RTX-51 FULL的兼容性。
等待函数os_wait的返回值有3种可能。
❑如果返回SIG_EVENT,则表示信号被成功接受。
❑如果返回TMO_EVENT,则表示时间到事件K_TMO发生或者时间间隔K_IVL完成。
❑如果返回NOT_OK,则表示该函数中所设置的event_sel参数无效。
在RTX-51 Tiny中,使用等待函数os_wait的程序示例如下。
include<RTX51TNY.h>
void task_oswait(void)_task_2
{
……
while(1)
{
char osevent;
osevent=os_wait(K_SIG+K_TMO,25,0);
switch(osevent)//根据返回值分别处理
{
case TMO_event://时间到
……//任务处理语句
break;
case SIG_event://信号到
……//任务处理语句
break;
default://默认
break;
}
}
……
}
2.等待函数os_wait1
等待函数os_wait1主要用于暂停当前任务,等待信号的到来。在RTX-51 Tiny中,等待函数os_wait1是os_wait函数的子集,主要用于一些对代码体积要求比较严格的程序。os_wait1函数暂停当前任务的执行,等待一个事件发生后再继续执行。等待函数os_wait1的函数原型如下。
char os_wait1(unsigned char event_sel);
其中,只包含一个参数event_sel,用来表示等待发生的事件,其只能设置为K_SIG。等待
函数os_wait1的返回值如果为SIG_EVENT,则表示信号被成功接受;如果为NOT_OK,则表示该函数中所设置的event_sel参数无效。使用等待函数os_wait1的程序示例如下。
include<RTX51TNY.h>
void task_oswait1(void)_task_2
{
……
while(1)
{
char osevent;
osevent=os_wait1(K_SIG);//等待
switch(osevent)//根据返回值分别处理
{
case SIG_event://信号到
……//任务处理语句
break;
default:
break;
}
}
……
}
3.等待函数os_wait2
等待函数os_wait2主要用于暂停当前任务,等待一个或多个事件发生后继续执行。这里的事件可以是时间间隔、时间到或者来自其他任务以及中断的信号。在RTX-51 Tiny中,等待函数os_wait2与os_wait函数的区别在于少了一个dummy参数,os_wait2函数主要用于一些对代码体积要求比较严格的程序。等待函数os_wait2的函数原型如下。
char os_wait2(unsigned char event_sel,unsigned char ticks);
其中,各个参数的含义如下。
❑参数event_sel表示等待发生的事件。可以选择3种形式的事件:K_IVL表示等待的时间间隔、K_SIG表示等待的信号、K_TMO表示等待的时间到。这些事件可以单独使用,也可以在一起组合使用,示例如下。
event_sel=K_IVL|K_TMO;
event_sel=K_SIG|K_IVL;
❑参数ticks表示需要等待完成的时间到(K_TMO)或者时间间隔(K_IVL)所用的时间数。如果没有使用K_IVL或K_TMO事件,则该参数无意义。
等待函数os_wait2的返回值有3种可能。
❑如果返回SIG_EVENT,则表示信号被成功接受。
❑如果返回TMO_EVENT,则表示时间到事件K_TMO发生或者时间间隔K_IVL完成。
❑如果返回NOT_OK,则表示该函数中所设置的event_sel参数无效。
在RTX-51 Tiny中,使用等待函数os_wait2的程序示例如下。
include<RTX51TNY. h>
void task_oswait2(void)_task_2
{
……
while(1)
{
char osevent;
osevent=os_wait2(K_SIG+K_TMO,50,0);
switch(osevent)//根据返回值分别处理
{
case TMO_event://时间到
……//任务处理语句
break;
case SIG_event://信号到
……//任务处理语句
break;
default:
break;
}
}
……
}