举例:
OS_EVENT *Str_Box;
................
Str_Box = OSMboxCreate ((void*)0); //创建
................
void MyTask (void *pdata)
{
for (;;)
{
sprintf(s,"%d" ,Times);
OSMboxPost(Str_Box,s); //发送消息
Times++;
OSTimeDlyHMSM(0, 0, 1, 0); //等待1秒
}
}
....................
void YouTask (void *pdata)
{
for (;;)
{
ss=OSMboxPend(Str_Box,10,&err);
PC_DispStr(10,++y, ss, DISP_BGND_BLACK+DISP_FGND_WHITE );
OSTimeDlyHMSM(0, 0, 1, 0); //等待1秒
}
}
建立一个邮箱,OSMboxCreate()
1) 使用邮箱之前,必须先建立邮箱。该操作可以通过OSMboxCreate()函数来完成,并且须定义指针的初始值。
2) 一般,这个初始值是NULL,但也可以初始化一个邮箱,使其在最开始就包含一条消息。
&8226; 如果使用邮箱的目的是通知一个事件的发生(发送一条消息),那么就要初始化该邮箱为空,即NULL。因为在开始时(很有可能)事件还没有发生。
&8226; 如果用邮箱共享某些资源,那么就要初始化该邮箱为一个非NULL的指针。在这种情况下,邮箱被当成一个二值信号量使用。
等待邮箱中的消息,OSMboxPend()
1) 如果邮箱中有消息(非NULL指针):
&8226; 那么,从邮箱中取出该消息,返回给调用函数,并将NULL指针存入邮箱中。
&8226; 同时,OSMboxPend()函数将“无错”代码(OS_NO_ERR)返回给它的调用函数。这个返回结果表示,已由另一个任务或者中断服务子程序将消息发送到邮箱中,这也是运行OSMboxPend()函数最快的情况。
2) 如果邮箱为空:
&8226; 则,调用OSMboxPend()函数的任务要进入睡眠状态,等待另一个任务(或者中断服务子程序)通过邮箱发送消息。
&8226; OSMboxPend()允许定义一个最长等待时间作为它的参数(超时时限),这样可以避免该任务无限期地等待邮箱的消息。
3)
&8226; 如果该参数值是一个大于0的值,那么OSMboxPend()函数挂起该任务,该任务将一直等到邮箱获得消息或者等待超时。
&8226; 如果该参数值为0,则该任务将无限期地等待下去。
向邮箱发送一则消息,OSMboxPost()
如果从中断服务子程序中调用OSMboxPost()函数,那么,这时并不发生任务的切换。因为,中断服务子程序引起的任务切换只发生在中断嵌套的最外层和中断服务子程序调用OSIntExit()函数时。
联系客服