温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-10-14 14:35:08 来源:亿速云 阅读:213 作者:柒染 栏目:编程语言

这篇文章给大家介绍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内核中的任务延时函数是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI