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产生。
2. Message Queue
在FreeRTOS中,Queue(队列)都是FIFO(先入先出)结构。
Message Queue使进程间可以安全地进行小数据量的通信,每一个元素都可以是 整型量 或者是 指针 。
3. Mail Queue
Mail Queue 和 Message Queue 很相似,只是队列的元素内存块组成(需要分配和释放)。
Mail Queue 使用 Memory Pool 创建格式化内存块,并在消息队列中传递指向这些块的指针。
这是 Mail 相对于仅能传输32bit值或指针的 Message 的优势。
4. Memory Pool
内存池是固定大小的内存块,是 线程安全 的。
它们的运行速度比动态分配的堆快得多,而且 不会出现碎片 。
由于是线程安全的,因此可以从 线程 或 ISR 访问它们。
5. Mutexes
Mutual exclusion (通常称为 Mutexes)在各种操作系统中用于资源管理。
微控制器设备中的许多资源可以被重复使用,但一次只能被一个线程使用(例如串口、内存和文件)。
Mutexes互斥锁用于保护对共享资源的访问。
互斥锁可以理解为是一种二值信号量。
6. Semaphores
Semaphores 用于管理和保护对共享资源的访问。
Semaphores 与 Mutexes 非常相似。
Mutex 每次只允许 一个 线程访问共享资源,而 Semaphores 可以用来允许固定数量的线程访问共享资源。
使用信号量,可以管理对一组相同外设的访问(例如多个DMA通道)。