This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS: timer_start()不会重置计数器

Guru**** 2595800 points
Other Parts Discussed in Thread: SYSBIOS, F28M35H52C

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/665351/rtos-timer_start-does-not-reset-the-counter

“Thread:SysBIOSF28M35H52C”中讨论的其它部件

工具/软件:TI-RTOS

F28M35H52C1RFPQ  

API文档指出Timer_start()将“重新加载并启动计时器”。 如果计时器正在运行,Timerstart不会重新启动计时器,也不会重置其计数器。 如何重新启动计时器?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Juvf,您好!

    在调用Timer_start()之前,您是否可以尝试调用Timer_stop(),看看是否可以解决问题?  您是否还可以提供有关您如何遇到此问题的更多信息?  另外,您使用的是什么版本的SYS/BIOS?

    谢谢!

    珍妮特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在调用Timer_start()之前尝试了Timer_stop(),计数器没有重置。

    编辑*。cfg时创建计时器。 我设置的时间段为300万 µs。 我要分配一个处理程序。 我收集程序并运行。 我每隔一秒都会调用Timer_Start()。 第一次调用Timer_Start ()后3秒后,我进入处理程序。

    tisto_c2000_2_16_01_14

    BIOS_6_45_02_31

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Juvf,您好!
    能否发布创建计时器的.cfg文件中的代码以及调用Timer_start()的处理程序中的代码? 我会看看是否可以再现。
    谢谢!
    珍妮特
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,Janet

    是的,我可以。 计时器的名称是timerKeepW5100_1和timerKeepW5100_2。

    void timerKeepalive_1 (UArg套件)

       EVENT_POST (eventW5100_1,EVENT_W5100_DIS);
    }

    e2e.ti.com/.../modulAuto.cfg

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Timer_start()没有出现问题。  以下是我的cfg代码(从您的复制):

    VAR计时器= xdc.useModule('ti.sysbios.hal.Timer');

    VAR timer0Params =新Timer.Params();
    timer0Params.instance.name ="timerKeepW5100_1";
    timer0Params.period = 300万;
    timer0Params.startMode = Timer.StartMode_user;
    timer0Params.runMode = Timer.RunMode_OneShot;
    program.global.timerKeepW5100_1 = timer.create_(null,"&timerKeepalive_1",
           Timer0Params);

    VAR timer1Params =新Timer.Params();
    timer1Params.instance.name ="timerKeepW5100_2";
    timer1Params.period = 300万;
    timer1Params.startMode = Timer.StartMode_user;
    timer1Params.runMode = Timer.RunMode_OneShot;
    timer1Params.periodType = Timer.PeriodType_microsecs;//默认值
    program.global.timerKeepW5100_2 = Timer.creation(1),"&timerKeepAlive_2",
           Timer1Params);

    下面是我的测试中的代码:

    #include <XDC/cfg/globL.h>

    /*这些计时器句柄在XDC/cfg/global.h */中声明
    外部连接Timer_Handle timerKeepW5100_1;
    外部连接Timer_Handle timerKeepW5100_2;

    UINT32计时器1计数=0;
    UINT32 timer2Count = 0;

    /*
     * ========= 主====
     */
    INT MAIN ()

       Timer_start (timerKeepW5100_1);
       Timer_start (timerKeepW5100_2);

       BIOS_START();   /*不返回*/
       返回(0);
    }

    void timerKeepalive_1 (UArg参数)

       timer1Count++;
       Timer_start (timerKeepW5100_1);
    }

    void timerKeepalive_2 (UArg参数)

       timer2Count++;
       Timer_start (timerKeepW5100_2);
    }

    当我在CCS中运行此程序时,我可以看到计时器计数正在增加。

    此致,

    珍妮特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好 你听到我的声音吗?

    API文档指出Timer_start()将“重新加载并启动计时器”。 重新加载!!! 您了解吗?


    您是否可以尝试以下代码:

    UINT32计时器1计数=0;
    UINT32 timer2Count = 0;


    #define TASKSTACKSIZE 1024
    #define task_WS (TASKSTACKSIZE)

    task_Struct task0Struct;
    CHAR task0Stack[TASKSTACKSIZE];

    /*
    *========= 主====
    */
    INT MAIN ()



    task_params_init(&taskParams);
    taskParams.STACKSIZE = TASK_WS;
    taskParams.stack =&task0Stack;
    task_construct (&task0Struct,(Task_FuncPTR)维护任务,&taskParams,NULL);



    BIOS_START();/*不返回*/
    返回(0);
    }


    空维护任务(UArg arg0,UArg arg1)



    对于(;;)



    Timer_start (timerKeepW5100_1);
    Timer_start (timerKeepW5100_2);

    TASK_SLEEP (1000);//SLEEP 1秒

    }

    }

    void timerKeepalive_1 (UArg参数)

    timer1Count++;
    Timer_start (timerKeepW5100_1);
    }

    void timerKeepalive_2 (UArg参数)

    timer2Count++;
    Timer_start (timerKeepW5100_2);
    }


    UINT32计时器1计数=0;
    UINT32 timer2Count = 0;


    #define TASKSTACKSIZE 1024
    #define task_WS (TASKSTACKSIZE)

    task_Struct task0Struct;
    CHAR task0Stack[TASKSTACKSIZE];

    /*
    *========= 主====
    */
    INT MAIN ()



    task_params_init(&taskParams);
    taskParams.STACKSIZE = TASK_WS;
    taskParams.stack =&task0Stack;
    task_construct (&task0Struct,(Task_FuncPTR)维护任务,&taskParams,NULL);



    BIOS_START();/*不返回*/
    返回(0);
    }


    空维护任务(UArg arg0,UArg arg1)



    对于(;;)



    Timer_start (timerKeepW5100_1);
    Timer_start (timerKeepW5100_2);

    TASK_SLEEP (1000);//SLEEP 1秒

    }

    }

    void timerKeepalive_1 (UArg参数)

    timer1Count++;
    Timer_start (timerKeepW5100_1);
    }

    void timerKeepalive_2 (UArg参数)

    timer2Count++;
    Timer_start (timerKeepW5100_2);
    }



    如果计时器周期为3秒,则永远不应调用timerKeepAlive_1和timerKeepAlive_2功能。 但在程序启动后3秒内,它们被调用。 为什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Juvf,您好!

    感谢您发布测试案例。  我发现问题是由于您使用的BIOS版本较旧。  在该版本中,lm3计时器的Timer_start()不会重新加载周期。  此问题已在BIOS 6.46 .00.23 中修复。  没有适用于C2000的TI-RTOS版本的修复程序,因此您可以将lm3 Timer.c文件替换为固定版本(见下文)。   该文件位于:

     <TIRTOS_INSTALL_DIR>/tirtos_c2000_2_16_01_14/products\BIOS_6_45_02_31/packages/ti/SysBIOS/family/arm/lm3

    然后,您可以重新构建测试。  希望这能解决问题。

    e2e.ti.com/.../Timer.c

    此致,

    珍妮特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Janet
    谢谢你。 为什么是家族/ARM/lm3? 我使用F28M35H52C -这是"ARMRegistered CortexRegistered-M3"。 我认为这是家庭/手臂/立方米。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Juvf,您好!

    lm3计时器模块用于器件上的GP计时器,而m3计时器是指Systick计时器。  名称'lm'代表"Luminary Micro",这可能是驱动程序最初的来源。

    此致,

    珍妮特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好Janet

    请问您是否在 我之前从BIOS 6.46 .00.23 中检查过定时器以更换Timer.c?

    我可以在Timer.c中看到Timer_start()的来源

    /*
     * ========= timer_start =========
     *  1. hwi_disable();
     *  2.清理计数器
     *  3.清除IFR
     *  4.启用计时器中断
     *  5.启动计时器
     *  6. hwi_restore()
     */
    void Timer_start(Timer_Object *obj)

       UINT密钥;
       UINT32 AMR;
       ti_catalog_arm_peripherals_timers_TimerRegs *timer;

       计时器=(ti_catalog_arm_peripherals_timers_TimerRegs *)Timer_module->device[obj->id].baseAddr;

       密钥= HWI_DISABLE();

       Timer->GPTMCTL &=~1;/*通过清除位0 (Taen)*/停止计时器

       计时器->GPTMICR = 0x101;/*清除中断*/

       如果(obj->hwi){
           hwi_clearInterrupt (obj->intNum);
           hwi_enableInterrupt (obj->intNum);
           TIMER -> GPTMMR |=1;   /*取消计时器中断的掩码*/
       }

       AMR = timer->GPTMTAMR &~0x3;/*清除模式位*/

       如果(obj->runMode == Timer_RunMode_Continuous ){
           /*子1起始期间以补偿重新加载期间的额外计数*/
           TIME->GPTMTAILR = OBJ->Period -1;
           Timer->GPTMTAMR = AMR +2;/* Periodic Timer mode */
       }
       否则{
           TIMER ->GPTMTAILR = OBJ->Period;/*设置Period */
           Timer->GPTMTAMR = AMR + 1;/* OneShot Timer模式*/
       }

       TIMER -> GPTMCTL |=3;       /*通过设置位0 (Taen)*/启动计时器

       HWI_RESTORE (密钥);
    }

    注释中的第二步是“*  2.清除计数器"。 我在源代码中看不到此步骤。  在哪一行代码中清除计数器?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Juvf,您好!

    写入定时器ILR寄存器的代码行,例如:

           TIME->GPTMTAILR = OBJ->Period -1;

    应导致计数器重新初始化为新值(计数器正在倒计时)。

    此致,

    珍妮特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Juvf,

    此问题是否得到解决?

    托德

    [+没有听到任何消息,因此我将此线程标记为“TI认为已解决”。 如果您认为不是这样,请发布跟进]