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;

}

}

……

}