zoukankan      html  css  js  c++  java
  • UCOS-2 消息邮箱与队列

     一个有趣的网络解释

    信号量就是中央政府发给官人做一方大员的官印,有很多种官印但是不能一印多发,得到官印者才能掌权鱼肉一方百姓(任务得到信号量才能运行),否则你就只要等官跑官。(当然官印也可随时被政府收回(因腐败违反纪律等问题被剥夺优先权而分给其他人,当然以后表现好还可复出),或者嫌累或工资低自己封印辞官)

       邮箱,就好给比当差的下达的抄家、拆房、收监等红头文件,拿到啥样的文件就干啥。
       消息队列,就是给任务发了一连串的邮件,官员(任务)拿到这一大摞文件,可以从底部或者顶部(LIFO or FIFO)一个一个拆开处理。

    信号量:主要负责管理.OSEventCnt域,管理信号量计数。单值信号量是对系统管理的(遵守规则)某种有限特定资源进行互斥申请享用(有时间限制,不能长期霸占),对于已被占用的要么等待或特权占用(优先级高,但必须系统管理员许可,不可直接占用)。多值信号量好比十字楼口的交通员手势信号(或信号灯),每台车虽然不占用其它车道资源,但要想通过必须听同一个信号的安排。

    三种常见的信号量(VXWOKRS):

    二进制(位标志):可实现任务间通讯的互斥上锁和同步(如共享的内存缓冲区域或IO资源),常在中断系统中使用,

    互斥信号量:为了解决内在的互斥问题如优先级继承、删除安全和递归等情况而最优化的特殊的二进制信号量

    互斥信号量与二进制不同点在于:

    ①定义一个互斥信号量时,其已经初始化完毕为可用,它仅用于互斥;

    ②仅能由取(semTake ())它的任务释放,即由同一个任务申请然后使用完毕后释放;

    ③因为semTake和semGive是成对出现的,因此不能在ISR 中释放(semGive ())。

    计数式信号量:每次释放,计数器加一,每次获取,计数器减一,当信号量减到0 时,试图获取该信号量的任务被阻塞,从而保持对信号量释放次数的跟踪。

    邮箱与消息队列的异同:

    相同点:都基于事件控制块,用于进行任务间的通讯和同步,收发的对象包括定向和非定向(可指定接收对象或共享的其它任务),具体操作方式包括阻塞式或非阻塞式(接收时仅检查信息后就返回是非阻塞,确认对方接收到才返回是阻塞;发送等对方接收后才返回是阻塞;不管对方接收就返回是非阻塞式),基本操作包括创建 发 查询(MSMboxAccept() 检查消息,返回;OSMboxQuery()查询状态) 接收 删除。

    区别:消息队列在OS_EVENT结构基础之上添加了一循环队列,可以同时容纳多个消息,而邮箱只能容纳一个。因此,可以将消息队列看作同时接收多条消息的邮箱。采用了循环缓冲方法。将二维数组在逻辑上连接成首尾相接的环,提供了读定指针,有效提供了读写的效率及便利

     

    邮箱:负责管理.OSEventPtr域,管理单个消息的发帝与接收。它是一个指针型变量。可以向一个任务或一个中断服务子程序发送一则消息(一个指针),也可以当作只取2个值的信号量来用

     

  • 相关阅读:
    PHP5.4中新增的traits
    PHP各版本的区别
    冒泡排序原理
    服务器&linux
    PHP
    excel 导出
    try cache
    sql
    Linux下php安装Redis扩展
    Redis安装部署
  • 原文地址:https://www.cnblogs.com/jieruishu/p/4349814.html
Copyright © 2011-2022 走看看