资料目录
uCOS专区
实时系统的几个基本概念---同步
发布日期:2011/11/27
可以利用信号量使某任务与中断服务同步(或者是与另一个任务同步,这两个任务间没有数据交换)。如图2.13所示。注意,图中用一面旗帜,或称作一个标志表示信号量。这个标志表示某一事件的发生(不再是一把用来保证互斥条件的钥匙)。用来实现同步机制的信号量初始化成0,信号量用于这种类型同步的称作单向同步(unilateral rendezvous)。一个任务做I/O操作,然后等信号回应。当I/O操作完成,中断服务程序(或另外一个任务)发出信号,该任务得到信号后继续往下执行。

图2.13 用信号量使任务与中断服务同步
如果内核支持计数式信号量,信号量的值表示尚未得到处理的事件数。请注意,可能会有一个以上的任务在等待同一事件的发生,则这种情况下内核会根据以下原则之一发信号给相应的任务:
l 发信号给等待事件发生的任务中优先级最高的任务,或者
l 发信号给最先开始等待事件发生的那个任务
根据不同的应用,发信号以标识事件发生的中断服务或任务也可以是多个。
两个任务可以用两个信号量同步它们的行为。如图2.14所示。这叫做双向同步(bilateral rendezvous)。双向同步同单向同步类似,只是两个任务要相互同步。
例如则程序清单2.10中,运行到某一处的第一个任务发信号给第二个任务[L22.10(1)],然后等待信号返回[L2.10(2)]。同样,当第二个任务运行到某一处时发信号给第一个任务[2.10(3)]等待返回信号[L2.10(4)]。至此,两个任务实现了互相同步。在任务与中断服务之间不能使用双向同步,因为在中断服务中不可能等一个信号量。

图2.14 两个任务用信号量同步彼此的行为
|
程序清单2.10 双向同步 |
|
Task1() |
|
{ |
|
for (;;) { |
|
Perform operation; |
|
Signal task #2; (1) |
|
Wait for signal from task #2; (2) |
|
Continue operation; |
|
} |
|
} |
|
|
|
Task2() |
|
{ |
|
for (;;) { |
|
Perform operation; |
|
Signal task #1; (3) |
|
Wait for signal from task #1; (4) |
|
Continue operation; |
|
} |
|
} |