在嵌入式操作系统中,交换信息的“质”与“量”将进程间通信大体分为两类。

低级通信重在传递控制信号以实现同步,而高级通信则重在高效地传递大量数据

📊 核心区别速览

在这里插入图片描述

🔧低级通信:任务的“信号灯”与“门闩”

低级通信主要解决任务间的同步与互斥问题,确保系统行为有序,防止数据错乱。
1、信号量 (Semaphore) / 互斥量 (Mutex):最典型的低级通信方式。它们本身不传递数据,只通过一个计数器(信号量)或一个标志(互斥量)来传达“资源是否可用”或“是否允许进入”等状态信息。PV操作(P操作获取资源,V操作释放资源)就是其核心体现。
2、任务通知 (Task Notification):在FreeRTOS等RTOS中,这是一种轻量级的低级通信,允许一个任务直接向另一个任务发送事件,并可附带一个整数值。它比信号量更快,且无需单独创建通信对象。
3、信号 (Signal):一种异步通知机制,用于告知任务发生了某个事件(如用户按下了中断键),也是一种传递控制信息的低级方式。

📦 高级通信:任务的“数据管道”与“共享黑板”

高级通信则专注于高效、灵活地传输大量数据。
1、消息队列 (Message Queue):最常用的高级通信方式之一。它像一个内核维护的“缓冲区”,任务可以将任意长度和格式的消息放入队列,另一个任务则从中取出。这种方式很好地解耦了数据的发送和接收。
2、共享内存 (Shared Memory):速度最快的通信方式。它让多个任务直接访问同一块物理内存区域,就像在一块“黑板”上读写数据。由于没有内核介入拷贝数据,效率极高。但这也带来了新的问题:需要配合信号量等低级通信机制来防止多个任务同时写入导致数据错乱。
3、管道 (Pipe):一种基于文件系统、单向的字节流传输方式。数据从一端写入,以先进先出(FIFO)的顺序从另一端读出。它非常适合在两个任务之间建立一条简单的数据“流水线”。
4、邮箱 (Mailbox):可视为只能存放一条消息的“微型消息队列”。它提供了一种低开销的消息传递机制,适用于通知事件或传递少量数据。

直接通信和间接通信

📌直接通信:点对点的“打电话”

在这种模式下,发送任务必须在发送时明确指定接收方的ID,接收任务也可以通过指定发送方ID来选择性地接收消息(或接收任意发送者的消息)。通信双方建立了一种显式的、点对点的联系。

核心机制:通信原语通常为 Send(Destination, Message) 和 Receive(Source, Message)。
典型代表:任务通知 (Task Notification)、信号量 (Semaphore) 的释放与等待(因为操作必须指定具体作用于哪个任务或哪个信号量对象)。

特点与优劣:
优点:传输延迟极低,实时性非常高;无需额外的中间存储对象,节省RAM开销。
缺点:收发双方存在强耦合。一旦接收方任务挂掉或改名,发送方必须修改代码;若发送方需要广播消息给多个任务,必须循环调用多次Send,效率较低。

📭 间接通信:投递到“信箱/公告板”

在这种模式下,通信双方不直接认识对方,而是通过操作系统内核维护的中间对象(如消息队列、邮箱、管道)来进行数据交换。

核心机制:发送方将消息 Send(Mailbox, Message) 投递到某个特定的中间对象中,接收方从该中间对象 Receive(Mailbox, Message) 取出消息。发送方不知道谁会取走消息,接收方也不知道消息从谁那里来。
典型代表:消息队列 (Message Queue)、邮箱 (Mailbox)、管道 (Pipe)。

特点与优劣:
优点:解耦效果极佳。生产者和消费者可以独立编写和修改,甚至允许一对多、多对一、多对多的关系(例如多个任务往同一个队列写数据,多个任务从中取数据,不过RTOS中多读任务时需要谨慎处理竞争)。
缺点:因为数据要经过内核缓冲区复制,延迟比直接通信略高;且需要预先分配内存给中间对象,增加了资源消耗。

⚖️ 核心区别对比表

在这里插入图片描述

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐