消息邮箱是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)

UC/OS II 消息邮箱相关推荐

  1. Lab 6:uC/OS II

    为什么80%的码农都做不了架构师?>>>    目标: 移植uC/OS II到RPi上,实现两个任务的调度.这两个任务能轮流点亮LED,并通过串口发送消息表明自己正在运行 具体步骤: ...

  2. UART0串口编程(四):UART0串口编程之在UC/OS—II中遭遇的危机

    UART0串口编程之在UC/OS-II中遭遇的危机 一.潜在的危机 1.在uc/os操作系统中设计串口编程时,由于ISR和多个任务并发执行,情况比较复杂.尤其是接收状态为被动状态时,只能靠串行口中断来 ...

  3. uc/OS II——多任务设计

    uc/OS II--多任务设计 (1)设计 开始任务 [1]/声明 开始任务 任务块 static OS_STK App_TaskStartStk[APP_TASK_START_STK_SIZE]; ...

  4. 【 uC/OS II 】uC/OS II 源代码阅读(os_mbox.c)消息邮箱

    前言 关于消息邮箱,是一个消息邮箱里面,只能存储一条消息.核心结构体如下: #if (OS_EVENT_EN) && (OS_MAX_EVENTS > 0u) typedef s ...

  5. linux串口互斥,UART0串口编程之在UC/OS—II中遭遇的危机

    一.潜在的危机 1.在uc/os操作系统中设计串口编程时,由于ISR和多个任务并发执行,情况比较复杂.尤其是接收状态为被动状态时,只能靠串行口中断来接收数据. 2.在进行串行通信时,双方遵循相同的通信 ...

  6. 【嵌入式系统—实时操作系统】uC/OS II源码的官网下载

    要下载源码为:STM32F107-uC/OS-II源码包 Micrium官网的下载地址:Micrium_uC-Eval-STM32F107_uCOS-II 怎么找? 到官网的产品专区目录入口查找STM ...

  7. 【 uC/OS II 】uC/OS II 源代码阅读(os_task.c)任务管理

    前言 这个任务管理源代码,是整个系统最核心的部分,也是最难的部分,多看几遍吧.其中的核心结构体是: typedef struct os_tcb {OS_STK *OSTCBStkPtr; /* Poi ...

  8. uc os ii与linux,uC/OS-II嵌入式实时操作系统的几大特点

    uC/OS-II嵌入式实时操作系统的几大特点 出处:网络 发布于:2018-09-12 14:46:03 uC/OS-II的特点 1.uC/OS-II是由Labrosse先生编写的一个开放式内核,主要 ...

  9. UC/OS II 任务管理(4)之任务创建

    任务的创建函数 ucosii之前的版本都只支持64个任务,但是V2.90版本支持的任务数量达到了256. 用法和原理都差不多.我这里就只介绍任务数不大于64的情况.当任务大于64的时候,只需要配置相关 ...

最新文章

  1. 计算机网络实验指导书实验报告,计算机网络实验一 熟悉常用的网络命令实验报告模板...
  2. KeyMob聚合平台--国内口碑最好的移动广告聚合平台
  3. JSP中应用MVC架构
  4. html怎么设置log区,javlog
  5. Mantis安装过程笔记
  6. python 线性回归 技术方案亮点_基于Python的线性回归实战
  7. md5withrsa java_浏览器运行java插件报错:Algorithm constraints check failed: MD5withRSA
  8. 实践 | Element UI + Vue 管理系统首页
  9. 第 4 章 部署 Enterprise Library
  10. Flutter实战一Flutter聊天应用(十六)
  11. GitLab常用报错及备份
  12. SQLMAP安装及详解
  13. 卧槽,移动互联网时代这就结束了?下一个风口是啥?
  14. 2020清北学堂NOIP刷题营day3Bdierti洛谷P4310绝世好题
  15. ask调制流程图_利用卷积神经网络的自动调制分类算法
  16. OpenGL 核心技术之立方体贴图
  17. Android手机与PC端进行通信
  18. 玲听预告 | 蚂蚁金服布局区块链的底层心法是什么?
  19. 选择OA,终极“避雷”方法来啦!
  20. 中断、陷阱、软中断之间的异同

热门文章

  1. jquery jtemplates.js一个很好用的html-json模板工具
  2. 永恒之蓝(EternalBlue)漏洞利用实例
  3. 关于程序中的路径问题
  4. dsp 28377s+w5500 通过tftp下载到dsp内部flash
  5. FieldByName, FindField确实太好用了
  6. linux下查看磁盘分区的文件系统格式
  7. 通过PHP调用天市数据的全国交通违章查询接口
  8. TextMate中文教程之一次编辑多行
  9. FreeNAS的优点和不足
  10. kindle paperwhite折腾记