日期:2014-05-16  浏览次数:20607 次

uC/OS-II中的OSTimeDlyHMSM()函数的一个问题
在OSTimeDlyHMSM()函数中是这么写的:
ticks = (hours * 3600L + minutes * 60L + seconds) * OS_TICKS_PER_SEC
+ OS_TICKS_PER_SEC * (milli + 500L / OS_TICKS_PER_SEC) / 1000L;
loops = ticks / 65536L; //计算得商得倍数(多少个65536 时钟节拍)
ticks = ticks % 65536L; //计算得余数
OSTimeDly(ticks); //先作余数清除 ——A
while (loops > 0) //如果节拍数超过65536 个时钟节拍
  { 
  OSTimeDly(32768); //执行两次延时,实现共65536 个时钟节拍 ——B
  OSTimeDly(32768); ——C
  loops--; //继续减1,直到为0
  }
return (OS_NO_ERR); //返回(函数调用成功)
}
OSTimeDly函数是这么写的
void OSTimeDly (INT16U ticks) 
{
if (ticks > 0) {  
OS_ENTER_CRITICAL(); 
if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) {
OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
}
  OSTCBCur->OSTCBDly = ticks; 
OS_EXIT_CRITICAL(); 
OS_Sched();  
}
}
我很不明白的是OSTimeDlyHMSM()的延时机制,假如任务1调用函数OSTimeDlyHMSM(0, 11, 0, 0);并进入了休眠状态,此时休眠的tick状态位置在A位置,在此处另外一个任务2运行,这时候任务A的休眠时间是 OSTimeDly(ticks); 什么时候才能执行到B和C呢?而且保证恰好休眠结束后开始新的休眠时间,也就是B和C得地方?
请高手帮忙,多谢了
转自Tony嵌入式论坛,地址:http://www.cevx.com/bbs/thread-27763-1-1.html


------解决方案--------------------
你这里注释这么详细了还有啥地方不明白
USHRT_MAX
 65535 (0xffff)
 Maximum unsigned short value

SHRT_MAX
 32767
 Maximum (signed) short value
 
INT16U 按道理可以达到65535 但是看代码似乎只用到32767(0~32767)
因为OSTimeDly()参数有上限 所以为了方便 代码变成上面那样

----------------------
什么时候才能执行到B和C呢?而且保证恰好休眠结束后开始新的休眠时间,也就是B和C得地方
---------------------
这个就得看OSTimeDly的实现了 OS_Sched();使其他进程得以调度运行 当此次delay时间到时,我估计会产生一个中断,然后时间片回到原进程,此时便到了b与c的地方了。