凌阳科技大学计划论坛

首页 » 16位应用专题 » OS应用专区 » Minios中同步信号灯之疑问
gree - 2007-1-5 12:18:00

main()

{

    void Task1();

    SpSInit();

    *P_IOA_DIR = 0x00FF;

    *P_IOA_ATTRIB = 0x00FF;                //Set prot A attribute

    *P_IOA_BUFFER = 0x0000;

    err = SpSTaskCreate(Task1,0,t1stack+24,1);    //Create first task

    sem = SpSSemCreate(0);                //Create semaphore

    SpSStart();                    //Start kernel

}

void Task1()                //Task one

{

             void Task2();

             unsigned int i = 1;

    err = SpSTaskCreate(Task2,0,t2stack+24,2);    //Create second task

             while(1) {

        for(i = 1;i<0x100;i<<=1) {

                                         SpSSemPend(sem,0);            //Waiting semaphore

                                         *P_IOA_BUFFER = i;

        }

         }

}

void Task2()

{

    while(1) {

                             SpSSemPost(sem);                //Realease semaphore

                             SpSTimeDly(64);                    //Delay 64 tick

                             *P_WATCHDOG_CLEAR = 0x0001;

        }

}

这个程序演示了同步,第一个任务等一个信号量,等到后把灯点亮,并移一位,为下次点亮下一个灯做准备。第二个任务定时(0.5秒)发一个同步信号给第一个任务,让第一个任务点亮下一个灯。

Minios指南书上有这么一段话“第二种信号灯的用途是做同步用的,比如运行的任务要等待另一个任务运行到一部分时再运行下面程序,使用这种用法。但初始值(建立信号量时)为 0(这会使该任务转为等待态,等待信号量为1时再运行),等待另一个任务把它设置为1,然后任务将继续运行下去,运行完后再次设置为0。这样这个任务就和另一个任务完成了同步过程。”

我的疑问是“运行完后再次设置为0”这个是怎么实现的?

zhyimm - 2008-4-1 14:24:00
我的理解是这里实现 sem = SpSSemCreate(0);                //Create semaphore
 1 
查看完整版本: Minios中同步信号灯之疑问