当前位置:  技术问答>linux和unix

uC/OS-II中的OSTimeDlyHMSM()函数的一个问题

    来源: 互联网  发布时间:2016-08-18

    本文导语:  在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 时钟节拍) ti...

在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的地方了。


    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 选u C/OS-II还是μCLinux ?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3