嵌入式软件--->任务间通信
任务间通信是指任务之间为了协调工作,需要相互交换数据和控制信息。任务之间的通信可以分为两种类型:
- 低级通信:只能传递状态和整数值等控制信息。例如,用来实现任务间同步与互斥的信号量机制和信号机制都是一种低级通信方式。这种方式速度较快,缺点是传送的信息量非常少。如果需要传递较多信息,就需要进行多次通信。
- 高级通信:能够传递任意数量的数据,主要包括三类:共享内存、消息传递和管道。
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版!