大家觉得UCOS中的OSTimeDly()是否有问题呢?
我们大家都知道,OSTimeDly()的程序是下面这样的:
void OSTimeDly (INT16U ticks)
{
INT8U y;
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status */
OS_CPU_SR cpu_sr;
cpu_sr = 0; /* Prevent compiler warning */
#endif
if (ticks > 0) { /* 0 means no delay! */
OS_ENTER_CRITICAL();
y = OSTCBCur-> OSTCBY; /* Delay current task */
OSRdyTbl[y] &= ~OSTCBCur-> OSTCBBitX;
if (OSRdyTbl[y] == 0) {
OSRdyGrp &= ~OSTCBCur-> OSTCBBitY;
}
OSTCBCur-> OSTCBDly = ticks; /* Load ticks in TCB */
OS_EXIT_CRITICAL();
OS_Sched(); /* Find next task to run! */
}
我们从上面的程序可以分析知道,当一个任务运行完主要的工作,调用OSTimeDly (2),想延时两个节拍,我不知道按照这样的程序还能延时吗?
大家看看上面的程序,当TICKS> 0时就可以进行任务调度了, 也就是说不当我一开始调用这个函数OSTimeDly (2)的时候,TICKS肯定是大于0的(时钟节拍一般都在10MS~100MS之间,所以TICKS还没有减到0吧?),那么这样也就是没有延时就有任务切换了,那这样的延时根本就不起作用了。我想应该不对的吧,应该是要等到延时到了以后才进行任务切换的吧?所以我改成了下面的形式:void OSTimeDly (INT16U ticks)
{
INT8U y;
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
cpu_sr = 0; /* Prevent compiler warning */
#endif
if (ticks > 0) { /* 0 means no delay! */
OS_ENTER_CRITICAL();
y = OSTCBCur-> OSTCBY; /* Delay current task */
OSRdyTbl[y] &= ~OSTCBCur-> OSTCBBitX;
if (OSRdyTbl[y] == 0) {
OSRdyGrp &= ~OSTCBCur-> OSTCBBitY;
}
OSTCBCur-> OSTCBDly = ticks; /* Load ticks in TCB */
OS_EXIT_CRITICAL();
//OS_Sched(); /* Find next task to run! */
}
else
OS_Sched();
}
但是这样的程序至少要延时3个TICKS以上才会进行任务的切换,我想应该是OSTIMETICK()的问题吧?我正在考虑,我不知道我讲的对不对?希望大家一起讨论一下好吗?
发表时间:2004年9月14日11:23:09