第五篇:完善的协作式的内核——OSTaskSemPend
//任务等待信号量,挂起
unsigned char OSTaskSemPend(unsigned char Index,unsigned int Timeout)
{
//unsigned char i=0;
if(Sem[Index].OSEventState) //信号量有效
{
if(Sem[Index].OSEventType==0) //如果为独占型
Sem[Index].OSEventState = 0x00; //信号量被独占,不可用
}
else
{ //加入信号的任务等待表
Sem[Index].OSTaskPendTbl |= 0x01<<OSTaskRunningPrio;
OSRdyTbl &= ~(0x01<<OSTaskRunningPrio); //从任务就绪表中去除
TCB[OSTaskRunningPrio].OSWaitTick=Timeout; //如延时为0,刚无限等待
OSSched(); //从新调度
if(TCB[OSTaskRunningPrio].OSWaitTick==0) return 0;
}
return 1;
}