您的位置:首页 > 其它

UC/OS-II的函数------OSTimeDly

2016-05-14 11:32 246 查看
功能:调用该函数的任务将自己延时一段时间并执行一次任务调度,一旦规定的延时时间完成或有其它的任务通过调用OSTimeDlyResume()取消了延时,调用OSTimeDly()函数的任务马上进入就绪状态(前提是先将任务调度后执行的任务执行到程序尾,且调用OSTimeDly的任务此时优先级最高)。

//将一个任务延时若干个时钟节拍
//描述:将一个任务延时若干个时钟节拍。如果延时时间大于0,系统将立即进行任务调度。延时时间的长度
//     可从0到65535个时钟节拍。延时时间0表示不进行延时,函数将立即返回调用者。延时的具体时间依
//     赖于系统每秒钟有多少时钟节拍(由文件OS_CFG.H中的常量OS_TICKS_PER_SEC设定)
//
//附加:调用该函数会使uCOS-II进行一次任务调度,并且执行下一个优先级最高的就绪态任务。任务调用
//	   OSTimeDly()后,一旦规定的时间期满或者有其它的任务通过调用OSTimeDlyResume()取消了延时,
//	   它就会马上进入就绪状态。注意,只有当该任务在所有就绪任务中具有最高的优先级时,它才会立即
//	   运行。
//
//参数:ticks 为要延时的时钟节拍数。(一个1到65535之间的数)
//
//注意:注意到延时时间0表示不进行延时操作,而立即返回调用者,为了确保设定的延时时间,建议用户设定
//	   的时钟节拍数加1。例如,希望延时10个时钟节拍,可设定参数为11。
//
//任务延时函数(时钟节拍数)
void  OSTimeDly (INT16U ticks)
{
#if OS_CRITICAL_METHOD == 3                      //中断函数被设定为模式3
OS_CPU_SR  cpu_sr;
#endif

if (ticks > 0) {   //如果延时设定为0值,表示不想对任务延时,返回调用任务
OS_ENTER_CRITICAL();		//关闭中断
if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) {  /* Delay current task        */
OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
}
//非0值会使得任务延时函数OSTimeDly()将当前任务从就绪表中移除
OSTCBCur->OSTCBDly = ticks;    //接着,这个延时节拍数会被保存在当前任务的OS_TCB中
OS_EXIT_CRITICAL();		//打开中断
OS_Sched();				//既然任务已经不再处于就绪任务,(任务调度),任务调度程序会执行下一个优先级最高的就绪任务
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: