当前位置: 技术问答>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
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的地方了。
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.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。