5、嵌入式学习之uCOS-II基础入门

死锁(或抱死)

死锁也称作抱死,指两个任务无限期地互相等待对方控制着的资源。设任务T1正独享资源R1,任务T2在独享资源T2,而此时T1又要独享R2,T2也要独享R1,于是哪个任务都没法继续执行了,发生了死锁。最简单的防止发生死锁的方法是让每个任务都: 

l  先得到全部需要的资源再做下一步的工作

l  用同样的顺序去申请多个资源

l  释放资源时使用相反的顺序

 内核大多允许用户在申请信号量时定义等待超时,以此化解死锁。当等待时间超过了某一确定值,信号量还是无效状态,就会返回某种形式的出现超时错误的代码,这个出错代码告知该任务,不是得到了资源使用权,而是系统错误。死锁一般发生在大型多任务系统中,在嵌入式系统中不易出现。

同步

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

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

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

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

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

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

    两个任务可以用两个信号量同步它们的行为。如图5.2所示。这叫做双向同步(bilateral rendezvous)。双向同步同单向同步类似,只是两个任务要相互同步。

    例如则程序清单5.11中,运行到某一处的第一个任务发信号给第二个任务[L5.11(1)],然后等待信号返回[L5.11(2)]。同样,当第二个任务运行到某一处时发信号给第一个任务[5.11(3)]等待返回信号[L5.11(4)]。至此,两个任务实现了互相同步。在任务与中断服务之间不能使用双向同步,因为在中断服务中不可能等一个信号量。

图5.2 两个任务用信号量同步彼此的行为

//5.11  双向同步
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;
    }
}

事件标志(Event Flags)

当某任务要与多个事件同步时,要使用事件标志。若任务需要与任何事件之一发生同步,可称为独立型同步(即逻辑或关系)。任务也可以与若干事件都发生了同步,称之为关联型(逻辑与关系)。独立型及关联型同步如图5.3所示。

                       图5.3独立型及关联型同步

可以用多个事件的组合发信号给多个任务。如图5.4所示,典型地,8个、16个或32个事件可以组合在一起,取决于用的哪种内核。每个事件占一位(bit),以32位的情况为多。任务或中断服务可以给某一位置位或复位,当任务所需的事件都发生了,该任务继续执行,至于哪个任务该继续执行了,是在一组新的事件发生时辨定的。也就是在事件位置位时做辨断。

内核支持事件标志,提供事件标志置位、事件标志清零和等待事件标志等服务。事件标志可以是独立型或组合型。μC/OS-Ⅱ目前不支持事件标志.

任务间的通讯(Intertask Communication)

有时很需要任务间的或中断服务与任务间的通讯。这种信息传递称为任务间的通讯。任务间信息的传递有两个途径:通过全程变量发消息给另一个任务。

用全程变量时,必须保证每个任务或中断服务程序独享该变量。中断服务中保证独享的唯一办法是关中断。如果两个任务共享某变量,各任务实现独享该变量的办法可以是关中断再开中断,或使用信号量(如前面提到的那样)。请注意,任务只能通过全程变量与中断服务程序通讯,而任务并不知道什么时候全程变量被中断服务程序修改了,除非中断程序以信号量方式向任务发信号或者是该任务以查询方式不断周期性地查询变量的值。要避免这种情况,用户可以考虑使用邮箱或消息队列。

                        图5.4事件标志

 

猜你喜欢

转载自blog.csdn.net/SherlockHolmess/article/details/88218467