当前位置: 首页 > news >正文

嵌入式软件--->任务间通信

        任务间通信是指任务之间为了协调工作,需要相互交换数据和控制信息。任务之间的通信可以分为两种类型:

  • 低级通信:只能传递状态和整数值等控制信息。例如,用来实现任务间同步与互斥的信号量机制和信号机制都是一种低级通信方式。这种方式速度较快,缺点是传送的信息量非常少。如果需要传递较多信息,就需要进行多次通信。
  • 高级通信:能够传递任意数量的数据,主要包括三类:共享内存、消息传递和管道。

1.共享内存

        共享内存指的是各个任务共享它们地址空间当中的某些部分,在此区域,可以任意读写和使用任意的数据结构,把它看成是一个通用的缓冲区。一组任务向共享内存中写入数据,另一组任务从中读出数据,通过这种方式来实现它们之间的信息交换。在有些嵌入式操作系统中,不区分系统空间和用户空间,整个系统只有一个地址空间,即物理内存空间,系统程序和各个任务都能直接对所有的内存单元进行随意地访向。

2.消息传递

        消息是内存空间中一段长度可变的缓冲区,其长度和内容均由用户定义。从操作系统的角度来看,所有的消息都是单纯的字节流,既没有确切的格式,也没有特定的含义。对消息内容的解释是由应用来完成的,应用根据自定义的消息格式,将消息解释成特定的含义,如某种类型的数据、数据块的指针或空。
消息传递指的是任务与任务之间通过发送和接收消息来交换信息。
消息机制由操作系统来维护,包括定义寻址方式、认证协议、消息的数量等。一般提供两个基本的操作:send操作,用来发送一条消息;receive操作,用来接收一条消息如果两个任务想要利用消息机制来进行通信,它们首先要在两者之间建立一个通信链路然后就可以使用send和receive操作来发送和接受消息。

任务之间的通信方式可以分为直接通信和间接通信两种。
(1)直接通信

       通信双方必须明确知道与之通信的对象。采用类似下面的通信原语: 

  • send (P, message):发送一条消息给任务 P;
  • receive (Q, message):从任务Q那里接收一条消息。如果没有收到消息,可以阻塞起来等待消息的到来,也可以立即返回

在通信双方之间存在一条通信链路,该链路具有如下特征: 

  • 通信链路是自动建立的,由操作系统来维护
  • 每条链路只涉及一对相互通信的任务,每对任务之间仅存在一条链路
  • 通信链路可以是单向或双向的

(2)间接通信

        通信双方不需要指出消息的来源或去向,而是通过共享的邮箱(mailbox)来发送和接收消息,每个邮箱都有一个唯一的标识。采用类似下面的通信原语: 

  • send (A, message):发送一条消息给邮箱 A;
  • receive (A, message):从邮箱A接收一条消息

间接通信的特点: 

  • 对于一对任务,只有当它们共享一个公共邮箱时才能进行通信
  • 一个邮箱可以被多个任务访问,每对任务也可以使用多个邮箱来通信
  • 通信可以是单向或双向的

邮箱只能存放单条消息,它提供了一种低开销的消息传递机制,其状态只有两种: 空或满。另外一种间接通信机制是消息队列。它与邮箱是类似的, 但可以同时存放若干条消息,提供了一种任务间缓冲通信的方法。如下图所示, 发送消息的任务将消息放入队列,而接收消息的任务则将消息从队列中取出。

3.管道

        管道通信以文件系统为基础,所谓管道即连接两个任务之间的一个打开的共享文件,专用于任务之间的数据通信。发送任务是从管道的一端写入数据流,接收任务从管道的另一端按先进先出的顺序读出数据流。管道的读写操作即为普通的文件读写操作,数据流的长度和格式没有限制。

本文内容参考嵌入式系统设计师教程第2版!

http://www.dtcms.com/a/336041.html

相关文章:

  • 【C++知识杂记1】智能指针及其分类
  • 05-实施任务控制
  • open Stack及VM虚拟机和其他平台虚拟机迁移至 VMware vSphere(esxi)虚拟化平台骨灰级后台磁盘替换法迁移方式
  • Maven依赖范围
  • C11期作业18(07.12)
  • 跨越南北的养老对话:为培养“银发中国”人才注入新动能
  • Linux——一些常用的其他命令
  • 学习Python中Selenium模块的基本用法(5:程序基本步骤)
  • MySQL数据库备份与恢复
  • 《棒球百科》奥运会取消了棒球·野球1号位
  • 旋钮键盘项目---foc讲解(闭环位置控制)
  • Redis-plus-plus API使用指南:通用操作与数据类型接口介绍
  • TensorFlow|张量流
  • C/C++复习(四)
  • 【LeetCode】单链表经典算法:移除元素,反转链表,约瑟夫环问题,找中间节点,分割链表
  • Javascript面试题及详细答案150道之(106-120)
  • 深度学习——常见的神经网络
  • Tomcat 类加载器原理深度解析
  • PowerPoint和WPS演示让多个对象通过动画同时出现
  • 近期(2021-2025)发行的常用国军标GJB 整理,2021,2022,2023,2024,2025
  • 深入理解QFlags:Qt中的位标志管理工具
  • 本文将详细介绍如何构建一个功能完整的键盘测试工具,包含虚拟键盘、实时统计、打字练习等核心功能,无需任何后端服务或复杂依赖。
  • 无人机视角土地区域类型识别分割数据集labelme格式4904张7类别
  • 使用oradebug收集数据库诊断信息
  • 第3章 Java NIO核心详解
  • AOP配置类自动注入
  • Linux系统分析 CPU 性能问题的工具汇总
  • 【102页PPT】某著名企业智能制造解决方案及智能工厂产品介绍(附下载方式)
  • 19.5 「4步压缩大模型:GPTQ量化实战让OPT-1.3B显存直降75%」
  • 微网智能光储协调控制器方案