V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
maiziedu
V2EX  ›  程序员

Ucos 系统任务间的通信详解

  •  
  •   maiziedu · 2016-11-22 17:50:09 +08:00 · 1466 次点击
    这是一个创建于 2952 天前的主题,其中的信息可能已经有所发展或是发生改变。

    物联网开发中, 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/

    aleen42
        1
    aleen42  
       2016-11-22 20:41:08 +08:00
    哥们讲起 ucos 让我想起我当年大学做的一张大图: https://github.com/aleen42/ucos/blob/master/ucos.png
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5355 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 09:11 · PVG 17:11 · LAX 01:11 · JFK 04:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.