uCOS专区

实时系统的几个基本概念---同步

发布日期:2011/11/27

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

图2.13 用信号量使任务与中断服务同步

 

    如果内核支持计数式信号量,信号量的值表示尚未得到处理的事件数。请注意,可能会有一个以上的任务在等待同一事件的发生,则这种情况下内核会根据以下原则之一发信号给相应的任务:

发信号给等待事件发生的任务中优先级最高的任务,或者

发信号给最先开始等待事件发生的那个任务

 

    根据不同的应用,发信号以标识事件发生的中断服务或任务也可以是多个。

    两个任务可以用两个信号量同步它们的行为。如图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;

    }

}