ucos内核中的任务延时函数是什么
这篇文章给大家介绍ucos内核中的任务延时函数是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
ysmz4:以下主要解决我为什么设置OSTimeDly(2),延时2ms的问题。
只要你延时超过1个系统时钟节拍(1ms),UCOSII就会执行任务切换,不需要计算每个任务延时多久,只要你保证延时大于一个系统时钟节拍,就可以了.
编写过单片机程序的都知道,延时函数是经常被用到的。
在ucos II 里,系统也提供了这样的延时函数。一个是大众版的OSTimeDly(),一个是精致版的OSTimeDlyHMSM()。 萝卜青菜,各有所爱,随你怎么选。
这两者的区别是,OSTimeDly()的延时时间是以节拍数来衡量的,OSTimeDlyHMSM()的延时时间则是以具体时间大小来衡量的。
这两个函数有着非常重要重要的作用,就是当你调用这两个函数的时候,ucos II 会进行一次任务调度。所以cpu能在各任务间进行切换,很大功劳得益于这两个函数。
调用这两个延时函数都会挂起本任务,cpu就会执行就绪表中优先级最高的任务。
有一点要注意的是任务调用OSTimeDly()后,一旦规定的时间期满或者有其它的任务通过调用OSTimeDlyResume()取消了延时,它就会马上进入就绪状态,而不是执行状态,也就是说延时结束后本任务不一定会被立刻执行。
假设你在任务执行过程中,调用延时函数延时0.001秒,时间的延时时间是有可能大于这个值的。这就得看你任务的安排了。
下面看看这两个函数的具体实现。
程序清单 L 5.1 OSTimeDly(). |
Void OSTimeDly (INT16U ticks) |
{ |
if (ticks > 0) { (1) |
OS_ENTER_CRITICAL(); |
if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) { (2) |
OSRdyGrp &= ~OSTCBCur->OSTCBBitY; |
} |
OSTCBCur->OSTCBDly = ticks; (3) |
OS_EXIT_CRITICAL(); |
OSSched(); (4) |
} |
} |
其实程序就做了下面几件事
1. 把本任务从任务就绪表中删除
2. 把延时值保持到任务控制块中,并且通过OSTimeTick()每隔一个时钟节拍就减少一个延时节拍数
3. 调用任务调度函数,切换任务。
INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli) |
{ |
INT32U ticks; |
INT16U loops; |
if (hours > 0 || minutes > 0 || seconds > 0 || milli > 0) { (1) |
if (minutes > 59) { |
return (OS_TIME_INVALID_MINUTES); |
} |
if (seconds > 59) { |
return (OS_TIME_INVALID_SECONDS); |
} |
If (milli > 999) { |
return (OS_TIME_INVALID_MILLI); |
} |
ticks = (INT32U)hours * 3600L * OS_TICKS_PER_SEC (2) |
+ (INT32U)minutes * 60L * OS_TICKS_PER_SEC |
+ (INT32U)seconds * OS_TICKS_PER_SEC |
+ OS_TICKS_PER_SEC * ((INT32U)milli + 500L/OS_TICKS_PER_SEC) / 1000L; (3) |
loops = ticks / 65536L; (4) |
ticks = ticks % 65536L; (5) |
OSTimeDly(ticks); (6) |
while (loops > 0) { (7) |
OSTimeDly(32768); (8) |
OSTimeDly(32768); |
loops--; |
} |
return (OS_NO_ERR); |
} else { |
return (OS_TIME_ZERO_DLY); (9) |
} |
} |
关于ucos内核中的任务延时函数是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。