在ucos里,系统也提供了这样的延时函数,一个是大众版本OSTimeDly(),一个是精致版本的OSTimeDlyHMSM(),随你怎么选择
这两者的区别就是,OSTimeDly的延时时间是以节拍数来衡量的额,OSTimeDlyHMSM的延迟时间则使以具体时间大小来很亮的。
这两个函数有着非常重要的作用,就是当你调用这两个函数的时候,ucos会进行一次任务调度,所以CPU能在各任务间进行切换,很有大功劳得以这两个函数
调用这两个函数都会挂起本任务,CPU就会执行就绪表优先级最高的任务。
有一点要注意的是任务调用OSTimeDly()后,一旦规定的时间期满或者有其它的任务通过OSTimeDlyResume()取消了延迟,它就会马上进入就绪态,
而不是执行状态,也就是说延时结束后本任务一定不会被立刻执行
void OSTimeDly(INT16U ticks)
{
if(ticks>0)
{
OS_ENTER_CRITICAL(); (1)
if((OSRdyTbl[OSTCBCur->OSTCBy]&=~OSTCBCur->OSTCBBitx)==0) (2)
{
OSRdyGrp&=~OSTCBCur->OSTCBBitY;
}
OSTCBCur->OSTCBDly=ticks;
OS_EXIT_CRITICAL();
OSSched();
}
}
其实程序就做不下面几件事
1.把任务从任务就绪表中删除
2.把延时值保持到任务控制块中,并且通过OSTimeTick()每隔一个是在节拍就减少一个延时节拍数
3.调用任务调度函数,切换任务。
INT8U OSTimeDlyHMSM(INT8U hours,INT8U minutes,INT8U seconds,INT16U Milli)
{
INT32U ticks;
INT16U loops;
if(hours>0||minutes>0||seconds>0||milli>0)
{
if(minutes>59)
return OS_TIME_INVALID_MINUTES;
if(seconds>59)
return OS_TIME_INVALID_SECONDS;
if(milli>999)
return (OS_TIME_INVALID_MILLI);
ticks=(INT32U)hours*3600*OS_TICKS_PER_SEC+minutes*60*OS_TICKS_PER_SEC+seconds*OS_TICKS_PER_SEC
+OS_TICKS_PER_SEC*milli+500/OS_TICKS_PER_SEC/1000
loops=ticks/65536 ;ticks=ticks%65536
OSTimeDly(ticks)
while(loops>0)
{
OSTimeDly(32768);
OSTimeDly(32768);
loops-;
}
}
else
{
return(OS_TIME_ZERO_DLY);
}
}