多任务操作系统中,常常需要再任务与任务之间通过传递一个数据(注意这里是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()函数最快的路径。如果没有消息可用,则等待。

uCOS-II之邮箱相关推荐

  1. 用C语言写ucos中断服务程序,在ARM处理器上移植uCOS II的中断处理

    uCOS II是一个源码公开.可移植.可固化.可剪裁和抢占式的实时多任务操作系统,其大部分源码是用ANSI C编写,与处理器硬件相关的部分使用汇编语言编写.总量约200行的汇编语言部分被压缩到最低限度 ...

  2. 51单片机中使用ucos ii的优缺点(好文)

    摘要:近年来,在单片机系统中嵌入操作系统已经成为人们越来越关心的一个话题.本文通过对一种源码公开的嵌入式实时操作系统ucos ii的分析,以51系列单片机为例,阐述了在单片机中使用该嵌入式操作系统的优 ...

  3. lwip协议栈在linux运行,LwIP协议栈在uCOS II下的实现

    1.概述: LwIP协议栈在设计时就考虑到了将来的移植问题,因此把所有与硬件.OS.编译器相关的部份独立出来,放在ucosii&LwIPsource etlwiparch目录下.因此LwIP在 ...

  4. UCOS II移植到STM32F103开发板

    早期嵌入式开发没有嵌入式操作系统的概念 ,直接操作裸机,在裸机上写程序,比如用51单片机基本就没有操作系统的概念.通常把程序分为两部分:前台系统和后台系统. 简单的小系统通常是前后台系统,这样的程序包 ...

  5. ucos II任务管理之一:挂起任务

    Ucos II 任务管理之一 创建好了任务之后,就已经初步跨进了ucos II 的编程了.随着进一步的编程,发现学会创建了任务还是不够的. 在我的项目里,需要实现485通信功能,我创建了任务1用于串口 ...

  6. ucos II任务管理之三:删除任务

    ucos II任务管理之三:删除任务 有了前面的经历之后,mcu21决定全面地学习了任务的管理.这样在项目编程中才能做到"信手拈来". 在ucos II 里,创建一个任务之后,可以 ...

  7. ucos II 创建第一个任务之一

    Ucos II创建第一个任务 我们已经从远处欣赏过ucos II 的身材,现在可以近距离地欣赏Ucos II性感的局部了. 任务是什么? 有一句话:CPU不同的时刻段总是在执行着优先级最高的任务.所以 ...

  8. 基于STM32的简易示波器的UCOS II嵌入式实时操作系统实现

    基于STM32的简易示波器的UCOS II嵌入式实时操作系统实现 在基于STM32的示波器的实现的基础上,在STM32上移植UCOS II嵌入式实时操作系统. 在UCOS II操作系统中将各个功能分发 ...

  9. ucos ii堆栈大小检测

    在使用ucos ii时经常会有疑问,这个堆栈该给多大,虽然ucos ii 自带了任务堆栈检测,但是我觉得太麻烦了,而且还会占用资源,我投机取巧的使用内存是否为0来判断堆栈是否使用过,进而检测出堆栈的最 ...

  10. IAR中移植UCOS II系统以及sourceInsight 使用

    ucos 学习笔记 1 sourceInsight 使用 CSDN参考链接 新建工程 第一步:project中new project 第二步:在高亮部分输入工程的地址,工程文件夹与IAR工程文件夹放在 ...

最新文章

  1. 计算机网络协议分层体系结构
  2. STM32开发 -- 无线网络协议
  3. 【排序算法】计数排序
  4. php代码导入sql,php导入SQL文件(示例代码)
  5. std::set作为一个有序集合
  6. python代码规范准则_Python编码规范
  7. Redis面试 - redis 的雪崩和穿透?
  8. unity 打开vs没有解决方案_VS找不到UnityEngine、UnityEngine.UI等引用的解决办法
  9. Linux使用rostopic echo将rosbag文件转换成csv或txt文件以及sh脚本批量化操作
  10. 某IT公司的面试题,难度系数“爆表”。。。
  11. 语音信号处理入门入籍和课程推荐
  12. mysql查询排序(asc,desc)
  13. 安卓Activity的生命周期函数详解
  14. 利用node爬取王者荣耀英雄信息,并存入数据库
  15. 麻雀租房App 作品展示
  16. 安卓如何实现动态广告栏
  17. 台积电:3纳米芯片工厂地址首选台湾 美国次之
  18. 配置了Maven环境变量后,cmd中mvn -v一直报“mvn不是内部命令”
  19. Tribal项目介绍
  20. 判断平面图的库拉托夫斯基定理

热门文章

  1. Bentley 软件公司发起 2021 基础设施数字化光辉大奖赛项目征集活动
  2. 2034——人见人爱A-B
  3. 192、如何查询局域网内在线的监控设备IP
  4. unraid应用_unraid 篇三:unraid docker之网页文件管理,强迫症的福音
  5. 医院陪诊小程序怎么开发-医院陪诊小程序源码功能
  6. 用mission planner或者3drradioconfig软件配置X-ROCK数传电台
  7. c语言文件被认为是木马,为啥我用c语言写成的exe文件会被360当做木马?
  8. opc ua 用哪种语言编写_什么是OPC UA?
  9. 解决安卓手机H5页面input获得焦点时页面挤压或者底部上移
  10. linux库函数pthread.h------pthread_rwlock_t读写锁说明