物联网开发中,ucos系统任务间的通信是指,两个任务之间有数据的交互,具体的一起来看看吧。

  1)消息邮箱

  我们还是提供两个任务Task1和Task2,假设我们还是解决刚刚的问题,Task1进行按键扫描,有多个按键key1到key n,Task2根据扫描出来的按键处理LED灯1到LED灯n,上次我们使用了一个方法,这个方法使用了一个事件标志组来进行,这个时候假设我不使用事件标志组,我使用消息邮箱,这个时候,我加入一个全局变量key-value,假设这个key-value等于0,表明没有按键按下,key-value于1,表明第一个按键按下,key-value等于2,表明第二个按键按下,key-value等于3,表明第三个按键按下,依次往下面增,那这个时候,我们的Task2要想判断哪一个按键按下,就不再像我们事件标志组那样一步一步的进行判断,我们只需要判断key-value的值就行了,那这个key-value的值是由谁改变呢?

  是由Task1这个任务改变的,在这里我们也可以看见,Task1和Task2之间进行了一个数据的交互,它们要的是key-value这个数据的值,也就是Task1改变key-value的值,Task2使用key-value的值,在这里我们就把它叫做消息的邮箱,就像一个邮箱一样,就像我们写信一样,我们把这个信放进邮箱,邮箱帮我们把信传递到远方,远方的亲戚朋友呢,打开我们的信,就可以看到信中的内容,同样,我们远方的亲戚朋友也可以使用这个邮箱,也可以写信发送给我们。

  在这个过程中我们的Task1和Task2就进行了一个数据的交互,那这个就被称做消息的邮箱,我们可以看到,在消息的邮箱过程中,我们有个任务提供发邮箱,而另外一个,我们会接收这个邮箱任务,接收以后使用,使用完后,它有可能向Task1发送邮箱,Task1接收到了这个邮箱以后,也会进行使用,这就是消息邮箱这个概念。

  2)消息队列

  事实上就是由多个消息邮箱构成的队列,就叫做消息队列,那既然有消息邮箱了,我们为什么药使用消息队列呢?

  我们还是提供两个任务Task1和Task2,假设Task1还是进行了一个按键的扫描,比如这个时候,它扫描的是我们windows下面的标准按键——键盘,而Task2呢进行按键的处理,比如应用处理,在这里我们都知道有两个问题,Task1在进行按键扫描,并且在发送这个消息邮箱的时候,它发的很快,因为它必须扫描的很快,它才能保证这个按键不被丢失,比如说你扫描的很慢,某些人它打印键盘的速度很快,那这样的话,这个按键就会丢失,但是应用程序它有可能处理不了那么快,就是说,它处理的速度可能会比较慢一些,那这个时候怎么办呢?

  比如Task1发出去了,Task2接收到了,但是它还没有处理,那这个时候Task1又发送了下一个按键,那下一个按键能不能被接收到呢?

  或者说上一个按键能不能被处理呢?这是个问题,那这个时候,我们就可以使用多个消息邮箱,比如我在Task1和Task2之间,我们建立很多个消息邮箱,第一个按键按下以后,我们发送到第一个消息邮箱,第二个按键按下以后,我们发送到第二个消息邮箱,第三个按键按下以后,我们发送到第三个消息邮箱,依次类推。到最后一个的时候,接下来再有按键按下,我们就再往第一个发送,那这个时候,对应用处理的要求稍微就要低一些,为什么呢?我只要保证在这个多次之间,我们只要把第一个按键处理掉以后就行了,因为处理掉第一个按键以后消息邮箱已经变成空啦,这个时候,我们就可以往第一个里面放,那也就是说我们假设本来有程序需要10毫秒,处理这个按键,但是现在如果有7个消息邮箱,我们可以每隔70毫秒处理一下,只要保证在同一时刻,只要有一个消息邮箱为空就行。

  那这么多消息邮箱组合在一起,我们就把它叫做消息队列,这个队列满足一个先进先出的规则,先进的队列的成员先出去,当然这个队列,我们也可以满足一个后进先出。比如说这个按键比较紧急,你必须先处理这个按键,那我们可以把这个按键直接发送给Task2,那它就是一个后进先出的原则,这个就是我们的消息队列和消息邮箱的不同,在这里我们可以看出消息队列的本质,实际上多个消息的邮箱构成的一个队列的数据结构。

原文链接:http://www.maiziedu.com/wiki/iot/ucoscomm/

Ucos系统任务间的通信详解的更多相关文章

  1. 开源项目SMSS发开指南(五)——SSL/TLS加密通信详解(下)

    继上一篇介绍如何在多种语言之间使用SSL加密通信,今天我们关注Java端的证书创建以及支持SSL的NioSocket服务端开发.完整源码 一.创建keystore文件 网上大多数是通过jdk命令创建秘 ...

  2. Android中实现java与PHP服务器(基于新浪云免费云平台)http通信详解

    Android中实现java与PHP服务器(基于新浪云免费云平台)http通信详解 (本文转自: http://blog.csdn.net/yinhaide/article/details/44756 ...

  3. Android Socket通信详解

    一.Socket通信简介  Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客 ...

  4. SSL握手通信详解及linux下c/c++ SSL Socket代码举例

    SSL握手通信详解及linux下c/c++ SSL Socket代码举例 摘自:http://www.169it.com/article/3215130236.html   分享到:8     发布时 ...

  5. SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码)

    SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码) 摘自: https://blog.csdn.net/sjin_1314/article/det ...

  6. React 精要面试题讲解(二) 组件间通信详解

    单向数据流与组件间通信 上文我们已经讲述过,react 单向数据流的原理和简单模拟实现.结合上文中的代码,我们来进行这节面试题的讲解: react中的组件间通信. 那么,首先我们把看上文中的原生js代 ...

  7. java多线程同步以及线程间通信详解&消费者生产者模式&死锁&Thread.join()(多线程编程之二)

    本篇我们将讨论以下知识点: 1.线程同步问题的产生 什么是线程同步问题,我们先来看一段卖票系统的代码,然后再分析这个问题: package com.zejian.test; /** * @author ...

  8. java网络编程Socket通信详解

    Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket.像大家熟悉的QQ.MSN都使用了Socket相关的技术. ...

  9. 基于python的直播间接口测试实战 详解结合项目

    基于python的直播间接口测试详解 一.基本用例内容描述 以设置白名单 /advisor/setUserWhiteList.do接口为例,该方法为POST at first,先要导入一些常用到的模块 ...

随机推荐

  1. Spring AOP详解

    一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnbl ...

  2. 【转】angular指令入坑

    独立作用域和函数参数 通过使用本地作用域属性,你可以传递一个外部的函数参数(如定义在控制器$scope中的函数)到指令.这些使用&就可以完成.下面是一个例子,定义一个叫做add的本地作用域属性 ...

  3. ubuntu环境下vmware取消自动启动服务

    概述其实vmware这个服务取不取消,影响不大,主要是我有强迫症,在不用虚拟机的时候,看着vmware占着进程真心不爽,想要解决这个问题,在用虚拟机的时候启动服务,反之,则停.接下来,我说一下实现吧. ...

  4. Daily Scrum02 12.14

    大家已经被各种作业折磨得体无完肤了,但是大家还挤出时间完成每天的软件工作啊…… 坚持就是胜利! Member 任务进度 下一步工作 吴文会 调试QuerySetting类函数 调试QuerySetti ...

  5. C语言dll文件的说明以及生成、使用方法

    最近在搞一些小项目,由于要涉及到跟其它语言进行交互,动态链接库变成了不二的选择.为此也查阅了很多资料,将动态链接库的相关知识在此做一个整理. 一.动态链接库概述 动态链接库(Dynamic Link ...

  6. 浅析PHP中for与foreach两个循环结构遍历数组的区别

    遍历一个数组是编程中最常见不过的了,这里跟大家讨论下for和foreach两种方法.用这两种方法执行遍历的场景太多太多了,这里我们只针对以下两个数组作为例子来讨论.所谓管中窥豹,多少能理清一点两者的区 ...

  7. Linux tar文件打包

    tar格式,会打包成一个文件,可以对多个目录,或者多个文件进行打包 tar命令只是打包,不会压缩,打包前后大小是一样的 tar命令 -c    //打包 -x    //解压 -f    //指定文件 ...

  8. 关于IoCallDriver使用的疑惑

    #pragma PAGEDCODE NTSTATUS HelloDDKRead(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp) { KdPrint(("Dr ...

  9. Eclipse搭建c环境(CDT)二

    Eclipse 编辑c程序环境的搭建主要为其安装CDT插件即可 Eclipse搭建CDT步骤如下: 1.首先配置好java环境,为后续运行eclipse做准备 (略) 2.下载并安装eclipse(这 ...

  10. 微信支付开发demo

    微信支付的时候,发红包部分的demo,在curl部分还要加上 curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,true); curl_setopt($ch,CURLOPT ...