uCOS专区

测试并置位&禁止,然后允许任务切换

发布日期:2011/11/27

测试并置位

    如果不使用实时内核,当两个任务共享一个资源时,一定要约定好,先测试某一全程变量,如果该变量是0,允许该任务与共享资源打交道。为防止另一任务也要使用该资源,前者只要简单地将全程变量置为1,这通常称作测试并置位(Test-And-Set),或称作TAS。TAS操作可能是微处理器的单独一条不会被中断的指令,或者是在程序中关中断做TAS操作再开中断,如程序清单2.5所示。

 

程序清单2.5 利用测试并置位处理共享资源

Disable interrupts;                              关中断

if (‘Access Variable’ is 0) {                  如果资源不可用,标志为0

    Set variable to 1;                           置资源不可用,标志为1

    Reenable interrupts;                         重开中断

    Access the resource;                         处理该资源

    Disable interrupts;                          关中断

    Set the ‘Access Variable’ back to 0;      清资源不可使用,标志为0

    Reenable interrupts;                         重新开中断

} else {                                            否则

    Reenable interrupts;                          开中断

/* You don’t have access to the resource, try back later; */

/* 资源不可使用,以后再试; */

}

有的微处理器有硬件的TAS指令(如Motorola 68000系列,就有这条指令)

 

禁止,然后允许任务切换

    如果任务不与中断服务子程序共享变量或数据结构,可以使用禁止、然后允许任务切换。(参见3.06给任务切换上锁和开锁)。如程序清单2.6所示,以μC/OS-Ⅱ的使用为例,两个或两个以上的任务可以共享数据而不发生竞争。注意,此时虽然任务切换是禁止了,但中断还是开着的。如果这时中断来了,中断服务子程序会在这一临界区内立即执行。中断服务子程序结束时,尽管有优先级高的任务已经进入就绪态,内核还是返回到原来被中断了的任务。直到执行完给任务切换开锁函数OSSchedUnlock (),内核再看有没有优先级更高的任务被中断服务子程序激活而进入就绪态,如果有,则做任务切换。虽然这种方法是可行的,但应该尽量避免禁止任务切换之类操作,因为内核最主要的功能就是做任务的调度与协调。禁止任务切换显然与内核的初衷相违。应该使用下述方法。

程序清单2.6  用给任务切换上锁,然后开锁的方法实现数据共享.

void Function (void)

{

    OSSchedLock();

    .

    .    /* You can access shared data in here (interrupts are recognized) */

.    /*在这里处理共享数据(中断是开着的)*/

    OSSchedUnlock();

}