|
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得地方?
请高手帮忙,多谢了
|
|