RTOS的线程间通信和资源共享

版本 :CMSIS-RTOS V1
参考Inter-Thread Communication and Resource Sharing

什么是线程间通信?

线程间通信(ITC, Inter-Thread Communication),在并行的多个线程之间交换数据的方式。

由于线程是相互独立运行的,不像线程内可以直接访问线程自己的临时变量;而访问全局变量会引入许多同步或竞争问题。

因此操作系统为我们提供了ITC来进行安全的进程间通信。

什么是资源共享?

资源共享(Resource Sharing),用来解决多个进程间共享计算机资源所引发的问题。

计算机系统的资源包括内存、I/O(如串口、DMA)、CPU时间等。

多个进程相互独立地并行执行,访问共享资源,但某些资源是有限的,甚至是独占的,因此就需要控制对共享资源的访问。

CMSIS-RTOS V1 支持的6种ITC及对比

Name 名称 作用
Signal Event 信号事件 进程同步
Message Queue 消息队列 小数据量(32bit)FIFO
Mail Queue 邮件队列 大数据量(内存块)FIFO
Memory Pool 内存池 线程安全的共享内存块(堆)
Mutexes 互斥锁 为独占性共享资源加锁
Semaphores 信号量 控制有限的共享资源访问

1. Signal Event

在无ITC的情况下,各个进程是异步的(并不需要其他进程执行到哪里了)。

而有些进程执行到特定的地方时,需要满足一定的条件/先后顺序才能继续运行,当这个条件是由进程外部决定的,就需要进行同步

在这里,同步就是使进程等待一个或多个特定的事件,这些事件可以由其他进程产生,也可以由中断ISR产生。
[学习记录]RTOS的线程间通信和资源共享 - 图1

2. Message Queue

在FreeRTOS中,Queue(队列)都是FIFO(先入先出)结构。

Message Queue使进程间可以安全地进行小数据量的通信,每一个元素都可以是 整型量 或者是 指针

[学习记录]RTOS的线程间通信和资源共享 - 图2

3. Mail Queue

Mail QueueMessage Queue 很相似,只是队列的元素内存块组成(需要分配和释放)。

Mail Queue 使用 Memory Pool 创建格式化内存块,并在消息队列中传递指向这些块的指针。

这是 Mail 相对于仅能传输32bit值或指针的 Message 的优势。

[学习记录]RTOS的线程间通信和资源共享 - 图3

4. Memory Pool

内存池是固定大小的内存块,是 线程安全 的。

它们的运行速度比动态分配的堆快得多,而且 不会出现碎片

由于是线程安全的,因此可以从 线程ISR 访问它们。

5. Mutexes

Mutual exclusion (通常称为 Mutexes)在各种操作系统中用于资源管理。

微控制器设备中的许多资源可以被重复使用,但一次只能被一个线程使用(例如串口、内存和文件)。

Mutexes互斥锁用于保护对共享资源的访问。

互斥锁可以理解为是一种二值信号量。

[学习记录]RTOS的线程间通信和资源共享 - 图4

6. Semaphores

Semaphores 用于管理和保护对共享资源的访问。

SemaphoresMutexes 非常相似。

Mutex 每次只允许 一个 线程访问共享资源,而 Semaphores 可以用来允许固定数量的线程访问共享资源。

使用信号量,可以管理对一组相同外设的访问(例如多个DMA通道)。

[学习记录]RTOS的线程间通信和资源共享 - 图5