多任务系统中,任务之间的交互包括同步和通信服务。常用的同步对象如下:
信号量
任务/中断之间的信号不需携带数据时,可以使用信号量实现同步。信号的含义由信号量对象说明,最常见的信号量类型是二值信号量,用于触发任务活动。典型的设计是任务包含一个无限循环,调用RTOS服务以获取信号量。如果信号量尚未发出信号,RTOS将阻塞任务执行,直到某个任务或中断给出信号量。
互斥信号量
实现互斥操作的二值信号量,用于保护临界区,实现任务之间的互斥操作。其工作原理与二值信号量相同,但使用方式不同。它在进入临界区之前先获取信号量,使用完成之后立即释放信号量。互斥信号量会记录其所有者(任务),并可能修改任务的调度优先级以避免“优先级倒置”的问题。
队列
队列是一个FIFO缓冲区,将消息传递给任务。通常,每个队列只有一个接收者,可以有一个或多个发送者。队列通常用作服务类型任务的输入,提供多种服务/命令。
RTOS 通过提供多种类型的交互机制,用于任务之间、中断和任务之间的通信和同步。图1中,任务H阻塞直到互斥信号量(mutex)可用,因为互斥信号量通常只用于临界段,持续时间比较短,所以实现本身没有问题。