千家信息网

ucos内核中的任务延时函数是什么

发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,这篇文章给大家介绍ucos内核中的任务延时函数是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。ysmz4:以下主要解决我为什么设置OSTimeDly(2),延时2ms的问题。
千家信息网最后更新 2024年11月23日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内核中的任务延时函数是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

0