UCOS 的延时函数OSTimeDlyHMSM()实现精确延时

来源:互联网 发布:黑之宣告知乎 编辑:程序博客网 时间:2024/04/26 13:05

介绍UCOS的资料汗牛,但详细解说OSTimeDlyHMSM()函数的不多,经过本人仔细研究该函数代码并通过调试发现:要想实现精确延时的对代码进行相应的修正。
   本人实现的是UCOS在2812上的移植,在其它DSP型号上移植情况是一样的,相差不大。
   以下是OSTimeDlyHMSM()函数的代码片段:      
    ticks = ((INT32U)hours * 3600L + (INT32U)minutes * 60L + (INT32U)seconds) * OS_TICKS_PER_SEC
              + OS_TICKS_PER_SEC * ((INT32U)milli + 1000L / OS_TICKS_PER_SEC) / 1000L;
        loops = ticks / 65536L;                 
        ticks = ticks % 65536L;
       OSTimeDly(ticks);
        while (loops > 0) {
            OSTimeDly(32768);
            OSTimeDly(32768);
            loops--;
    由ticks表达式看出:ticks的值与OS_TICKS_PER_SEC宏(一般设为100或200)的大小相关,为精确延时,请务必注意两点:
   1、OS_TICKS_PER_SEC取100或200时OS_TICKS_PER_SEC * ((aINT32U)milli + 1000L / OS_TICKS_PER_SEC) / 1000L部分中的分子1000L应作相应的调整,比如当OS_TICKS_PER_SEC取100时,分子应为500L,而200时为1000L。
   2、以上只是实现精确延时的第一步,我们知道,时钟节拍ticks是通过定时器中断来实现,在配置定时器时,函数
    void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period)中的 float Freq和 float Period俩参数取值有讲究:Freq要求为Mhz,其对应DSP的SysCtrlRegs.HISPCP的工作频率,Period单位为US,一般取为1000000/OS_TICKS_PER_SEC,为什么这样,请大家自己好好琢磨,只有这样才记得深刻,对吧!
    完成以上两步,你便可放心大胆的运用该函数了,好好品味那种随心所欲驾驭任何长时间延时的成就感吧!!

http://blog.sina.com.cn/s/blog_4419d72d0100mrrf.html


0 0
原创粉丝点击