UC/OS II 消息邮箱

消息邮箱是uC/OS-II中的另一种通信机制,可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量。通常该指针指向一个包含了“消息”的特定数据结构。如果该指针为空,说明邮箱是为空,若该指针不为空,则该邮箱是满。消息邮箱才用的数据结构是ECB(事件控制块)。每隔消息邮箱的可以容纳的消息数目是为1。
     消息邮箱的管理函数主要有7个。在os_mbox.c中定义。
1:消息邮箱创建函数OSMboxCreate
函数原型为:OS_EVENT  *OSMboxCreate (void *pmsg)   pmsg为指向消息的指针。
消息邮箱的建立和信号量的创建差不多,从空闲事件控制块链表取出事件控制块然后进行一些设置。
跟信号量的创立不同的地方主要在一个是类型的设置,还有一个就是事件指针设置为指向消息的地址。
pevent->OSEventType    = OS_EVENT_TYPE_MBOX;
pevent->OSEventPtr     = pmsg;

2:请求消息OSMboxPend
其函数原型为:void  *OSMboxPend (OS_EVENT  *pevent,  INT32U     timeout,  INT8U     *perr)
该函数的主要功能是任务向邮箱请求消息,若消息存在时,获取消息,若消息不存在的时候,放弃CPU的占用,直到有消息的时候才被唤醒。
该函数除了事件类型和判断条件跟信号量请求有不同之外,其他基本上一样。
通过pmsg != (void *)0 来判断邮箱是否为空,若为空,则任务阻塞,若不为空,则任务取消息,清空邮箱继续执行。

3: 向邮箱发送消息OSMboxPost和OSMboxPostOpt
函数的原型为:1:INT8U  OSMboxPost (OS_EVENT  *pevent,void      *pmsg) 
                       2:INT8U  OSMboxPostOpt (OS_EVENT  *pevent,void      *pmsg, INT8U      opt)  
向邮箱发送消息的函数有连个OSMboxPost和OSMboxPostOpt。
OSMboxPost函数
当因为邮箱为空的阻塞的时候,只有其他任务或者中断向邮箱发送消息的时候,阻塞状态才能被恢复到就绪状态。
if (pevent->OSEventGrp != 0u) {                   //如果OSEventGrp为0,若是则说明该没有任务在等待该消息
                                                      /* Ready HPT waiting on event                    */
        (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_MBOX, OS_STAT_PEND_OK); //将等待的任务中的最高优先级任务转为就绪
        OS_EXIT_CRITICAL();
        OS_Sched();                                   //执行调度
        return (OS_ERR_NONE);
    }
//下面是没有任务等待该邮箱消息
    if (pevent->OSEventPtr != (void *)0) {            //先判断该邮箱是不是满的,若是满的则不做操作返回,若是空的,则将控制块的事件指针指向该消息
        OS_EXIT_CRITICAL();
        return (OS_ERR_MBOX_FULL);
    }
    pevent->OSEventPtr = pmsg;                      
    OS_EXIT_CRITICAL();
OSMboxPostOpt函数
该函数的跟OSMboxPost相比,参数多了一个opt选项
opt有三种情况
OS_POST_OPT_NONE         发送一个消息,然后唤醒等待任务中的最高优先级的任务,就是执行OSMboxPost函数一样的功能
OS_POST_OPT_BROADCAST    发送一个消息广播给所有的等待任务,唤醒所有等待任务
上面两个可以任选一个可以跟下面的进行OR运算进行组合
OS_POST_OPT_NO_SCHED     发送消息之后,是否进行调度选项

4:删除消息邮箱OSMboxDel
函数原型为:OS_EVENT  *OSMboxDel (OS_EVENT  *pevent,  INT8U  opt,  INT8U*perr)
跟删除信号量一样,opt具有两个选项
opt == OS_DEL_NO_PEND  
opt == OS_DEL_ALWAYS
当我们不在需要该邮箱是,应该使用该函数删除消息邮箱。

5:放弃等待邮箱消息OSMboxPendAbort
跟放弃信号量类似,本任务自己是不可能放弃等待的(因为自己在阻塞中,根本得不到执行)。只有其他任务来执行该函数,该该函数的功能实现跟信号量基本类似。没有什么特别的
放弃等待后,等待任务转为就绪态。
其函数原型为:INT8U  OSMboxPendAbort (OS_EVENT  *pevent, INT8U      opt,INT8U     *perr)
注意opt选项,两种情况
OS_POST_OPT_NONE         放弃等待,然后唤醒等待任务中的最高优先级的任务,就是执行OSMboxPost函数一样的功能
OS_POST_OPT_BROADCAST    放弃等待广播给所有的等待任务,唤醒所有等待任务

6:无等待请求消息OSMboxAccept
函数原型如下:void  *OSMboxAccept (OS_EVENT *pevent)
若邮箱不为空,则取消息,若为空,不阻塞等待,而是转而去执行其他的代码。

7:查询消息邮箱状态OSMboxQuery
函数原型如下INT8U  OSMboxQuery (OS_EVENT      *pevent,OS_MBOX_DATA  *p_mbox_data)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值