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”这个是怎么实现的?