消息邮箱是一种通信机制,它能使任务或中断服务向另一个任务发送一个指针型的变量,这个指针指向一个包含指定“消息”的数据结构。消息邮箱发送的不是消息本身,而是消息的地址指针。使用消息邮箱之前,必须先建立消息邮箱,并且要指定指针的初始值。一般情况下,这个初始值是NULL,但也可以在初始化时,就使其在最开始就包含一条消息。   
消息邮箱主要用于两种目的:① 通知一个事件的发生;② 作二值信号量用。

  • 消息邮箱初始值的设置方法如下:
    (1) 如果使用消息邮箱是用于通知一个事件的发生(发送一条消息),那么就要初始化该消息邮箱为NULL,因为在开始时,事件还没有发生。  
    (2) 如果作二值信号量用,即用于共享某些资源,那么就要初始化该消息邮箱为一个非NULL的指针。

  • 消息邮箱具有如下特点:  
    (1) 消息邮箱中的内容是一个指向消息的指针,指针指向的内容即是消息;  
    (2) 消息邮箱为满时,消息邮箱只包含一个指向消息的指针;消息邮箱为空时,消息邮箱的指针指向NULL;  
    (3) 消息邮箱只能接收和发送一则消息,消息邮箱为满时,将丢弃新消息,保留旧消息。

µC/OS-Ⅱ提供了七种对消息邮箱的操作,消息邮箱函数所属文件是OS_MBOX.C。

  • OSMboxPend()函数用于任务等待消息邮箱中的消息。任务或者中断发出的消息是指针型的变量,在不同的应用中消息的使用也可能不同。该函数具有如下特点:

    1. 如果调用时消息邮箱中已有消息,那么该消息被返回给调用者,并从消息邮箱中清除该消息。
    2. 调用时,如果消息邮箱中没有消息,则OSMboxPend()函数挂起当前任务直到得到需要的消息或等待超时期满。
    3. 该函数的调用者只能是任务,中断不能调用。
    4. OSMboxPend()函数返回接收的消息指针。
void  *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
{void      *pmsg;
#if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */OS_CPU_SR  cpu_sr = 0;
#endif
#if OS_ARG_CHK_EN > 0if (perr == (INT8U *)0) {                         /* Validate 'perr'                               */return ((void *)0);}if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */*perr = OS_ERR_PEVENT_NULL;return ((void *)0);}
#endifif (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {  /* Validate event block type                     */*perr = OS_ERR_EVENT_TYPE;return ((void *)0);}if (OSIntNesting > 0) {                           /* See if called from ISR ...                    */*perr = OS_ERR_PEND_ISR;                      /* ... can't PEND from an ISR                    */return ((void *)0);}if (OSLockNesting > 0) {                          /* See if called with scheduler locked ...       */*perr = OS_ERR_PEND_LOCKED;                   /* ... can't PEND when locked                    */return ((void *)0);}OS_ENTER_CRITICAL();pmsg = pevent->OSEventPtr;if (pmsg != (void *)0) {                          /* See if there is already a message             */pevent->OSEventPtr = (void *)0;               /* Clear the mailbox                             */OS_EXIT_CRITICAL();*perr = OS_ERR_NONE;return (pmsg);                                /* Return the message received (or NULL)         */}OSTCBCur->OSTCBStat     |= OS_STAT_MBOX;          /* Message not available, task will pend         */OSTCBCur->OSTCBStatPend  = OS_STAT_PEND_OK;OSTCBCur->OSTCBDly       = timeout;               /* Load timeout in TCB                           */OS_EventTaskWait(pevent);                         /* Suspend task until event or timeout occurs    */OS_EXIT_CRITICAL();OS_Sched();                                       /* Find next highest priority task ready to run  */OS_ENTER_CRITICAL();switch (OSTCBCur->OSTCBStatPend) {                /* See if we timed-out or aborted                */case OS_STAT_PEND_OK:pmsg =  OSTCBCur->OSTCBMsg;*perr =  OS_ERR_NONE;break;case OS_STAT_PEND_ABORT:pmsg = (void *)0;*perr =  OS_ERR_PEND_ABORT;               /* Indicate that we aborted                      */break;case OS_STAT_PEND_TO:default:OS_EventTaskRemove(OSTCBCur, pevent);pmsg = (void *)0;*perr =  OS_ERR_TIMEOUT;                  /* Indicate that we didn't get event within TO   */break;}OSTCBCur->OSTCBStat          =  OS_STAT_RDY;      /* Set   task  status to ready                   */OSTCBCur->OSTCBStatPend      =  OS_STAT_PEND_OK;  /* Clear pend  status                            */OSTCBCur->OSTCBEventPtr      = (OS_EVENT  *)0;    /* Clear event pointers                          */
#if (OS_EVENT_MULTI_EN > 0)OSTCBCur->OSTCBEventMultiPtr = (OS_EVENT **)0;
#endifOSTCBCur->OSTCBMsg           = (void      *)0;    /* Clear  received message                       */OS_EXIT_CRITICAL();return (pmsg);                                    /* Return received message                       */
}
  • OSMboxPost()函数通过消息邮箱向任务发送消息,消息是指针型变量,消息的数据类型可能会因具体应用的不同而有所差异。该函数具有如下特点:  
    (1) 如果消息邮箱中已有消息,返回错误代码说明消息邮箱已满,函数立即返回调用者,并丢弃新消息;
    (2) 如果消息邮箱无消息,则:① 如果有任务在等待消息,最高优先级的任务将得到这个消息。如果等待消息的任务的优先级比函数的调用者优先级高,则这个高优先级任务得以恢复运行,调用者被挂起,发生一次任务切换。 若从中断调用,则不发生任务切换。② 如果没有任务在等待消息,则消息的指针被保存在消息邮箱中。
INT8U  OSMboxPost (OS_EVENT *pevent, void *pmsg)
{
#if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */OS_CPU_SR  cpu_sr = 0;
#endif
#if OS_ARG_CHK_EN > 0if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */return (OS_ERR_PEVENT_NULL);}if (pmsg == (void *)0) {                          /* Make sure we are not posting a NULL pointer   */return (OS_ERR_POST_NULL_PTR);}
#endifif (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {  /* Validate event block type                     */return (OS_ERR_EVENT_TYPE);}OS_ENTER_CRITICAL();if (pevent->OSEventGrp != 0) {                    /* See if any task pending on mailbox            *//* Ready HPT waiting on event                    */(void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_MBOX, OS_STAT_PEND_OK);OS_EXIT_CRITICAL();OS_Sched();                                   /* Find highest priority task ready to run       */return (OS_ERR_NONE);}if (pevent->OSEventPtr != (void *)0) {            /* Make sure mailbox doesn't already have a msg  */OS_EXIT_CRITICAL();return (OS_ERR_MBOX_FULL);}pevent->OSEventPtr = pmsg;                        /* Place message in mailbox                      */OS_EXIT_CRITICAL();return (OS_ERR_NONE);
}

uc/os-ii消息邮箱相关推荐

  1. UC/OS II 消息邮箱

    消息邮箱是uC/OS-II中的另一种通信机制,可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量.通常该指针指向一个包含了"消息"的特定数据结构.如果该指针为空,说明 ...

  2. Lab 6:uC/OS II

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. unity3d EasyTouch滑动屏幕移动相机观看场景
  2. Python进阶5——切片
  3. C#入门篇5-6:流程控制语句 foreach
  4. ES transport client使用
  5. not accessible due to restriction on required library
  6. Java包装类型对象比较相等性注意事项
  7. 2019最强Python书单,喜欢看书的小伙伴看这里!
  8. 测试团队成功适应敏捷的障碍
  9. adb的环境搭建,下载和卸载app
  10. html 字体围绕图片效果
  11. 腾讯云认证证书——云计算行业的敲门砖
  12. Java入门第三季—简易扑克牌游戏
  13. 关于不同体系结构风格的简单认识
  14. 从手机端 H5 制作来看 WEB 动画的术与道
  15. 2020年千兆路由器推荐 数码宅男来带路 赶紧M
  16. 随机数 == 伪随机数?
  17. html导航栏悬停过渡,JS 实现导航栏悬停效果
  18. Spring教程——Spring IoC(控制反转)
  19. CSR8675学习笔记:新建一个GATT server
  20. EM算法在高斯混合模型学习中的应用

热门文章

  1. 进程线程(五) groups和CPU资源分群分配
  2. Flutter 中键盘弹起时,Scaffold 发生了什么变化
  3. 可以SE,vmp过强壳检测的硬件级虚拟机--virtualbox/vbox超能版 去虚拟化
  4. OSChina 周日乱弹 —— 波赛冬之吻
  5. 计算机系统启动的三个步骤,怎样进入安全模式 三个方法随你操作【图文】
  6. 例26:利用递归方法求5!。
  7. ADSL猫+无线路由=多台机器同时上网
  8. WinEdt学习笔记(三、论文排版)
  9. 攻防世界wth.sh
  10. SDP sedumi yalmip