uCOS-II之邮箱

来源:互联网 发布:自学泰语软件下载 编辑:程序博客网 时间:2024/05/01 10:54

多任务操作系统中,常常需要再任务与任务之间通过传递一个数据(注意这里是1个数据,而不是多个数据)的方式进行通信,为了达到这个目的,可以在内存中创建一个存储空间作为该数据的缓冲区,如果把这个缓冲区称为消息缓冲器,这样在任务间传递数据(消息)的最简单的办法就是传递消息缓冲区的指针,我们把用来传递消息缓冲区指针的数据结构叫做邮箱(消息邮箱)。

在ucos中,我们通过事件控制块的OSEventPrt来传递消息缓冲区指针(在信号量中,不需要该指针),同时使实践控制块的成员OSEventType设定为常数OS_EVENT_TYPE_MBOX,则该事件控制块ECB就叫做消息邮箱。

与消息邮箱相关的几个函数分别为:

1、创建邮箱函数:OS_EVENT *OSMboxCreate(void *msg),函数中的参数msg为消息的指针,函数的返回值为消息邮箱的指针。该函数的实现方法是:先判断是否在中断中调用该函数,如果是则无效返回;定义一个空ECB,类型为消息邮箱,将OSEventPrt赋初值为某个指针。返回一个指向上述ECBB的指针。

2、向邮箱发送消息函数:INT8U  OSMboxPost(OS_EVENT *pevent,void *pmsg),函数实现过程:检查了事件控制块是否是一个邮箱后[L6.16(1)],OSMboxPost()函数还要检查是否有任务在等待该邮箱中的消息[L6.16(2)]。如果事件控制块中的OSEventGrp域包含非零值,就暗示着有任务在等待该消息。这时,调用OSEventTaskRdy()将其中的最高优先级任务从等待列表中删除[见6.02节,使一个任务进入就绪状态,OSEventTaskRdy()][L6.16(3)],加入系统的就绪任务列表中,准备运行。然后,调用OSSched()函数[L6.16(4)],检查该任务是否是系统中最高优先级的就绪任务。如果是,执行任务切换[仅当OSMboxPost()函数是由任务调用时],该任务得以执行。如果该任务不是最高优先级的任务,OSSched()返回,OSMboxPost()的调用函数继续执行。如果没有任何任务等待该消息,指向消息的指针就被保存到邮箱中[L6.16(6)](假设此时邮箱中的指针不是非NULL的[L6.16(5)])。这样,下一个调用OSMboxPend()函数的任务就可以立刻得到该消息了。

     注意:在OSMboxPost函数中,有判断邮箱中是否已经有了消息,如果已经有消息,则返OS_ERR_MBOX_FULL,这就代表,ucos中的邮箱一次只能发送1个指针,即1个数据,这在使用上就有些局限。

   3、等待一个邮箱中的消息函数:OSMboxPend(OS_EVENT *pevent,INT32U timeout,INT8U *perr),函数的实现过程:它和OSSemPend()也很相似,因此,在这里只讲述其中的不同之处。OSMboxPend()首先检查该事件控制块是由OSMboxCreate()函数建立的[L6.15(1)]。当.OSEventPtr域是一个非NULL的指针时,说明该邮箱中有可用的消息[L6.15(2)]。这种情况下,OSMboxPend()函数将该域的值复制到局部变量msg中,然后将.OSEventPtr置为NULL[L6.15(3)]。这正是我们所期望的,也是执行OSMboxPend()函数最快的路径。如果没有消息可用,则等待。

0 0
原创粉丝点击