ucos内核中的任务延时函数是什么
创始人
2024-12-26 01:42:08
0次

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)

    }

}

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...