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/TMS320F28335:如何查找以毫秒为单位的代码执行时间?

Guru**** 2591810 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/667248/rtos-tms320f28335-how-to-find-code-execution-time-in-milliseconds

器件型号:TMS320F28335

工具/软件:TI-RTOS

您好!

我使用 Timestamp_get64()获取时间戳,使用 Timestamp_GetFreq()获取 CPU 频率。

我的 CPU 频率为80MHz。

我尝试获取以毫秒为单位的执行时间。  我尝试使用的方法如下。

TIMESTAMP_get64 (&ts);

(笑声)

这里是我的代码

TIMESTAMP_get64 (&te);

start64 = ts.hi << 32;

start 64 |= ts.lo;

end64 = te.hi << 32;

end64 |= te.lo;

Millisec =(end64 - start64)/80000;  // Timestamp_getFreq ()接收到的我的 CPU 时钟为80MHz

但是、在每1分钟、毫秒值就会溢出。


如何正确地找到毫秒。

谢谢
Jagan

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

    start64和 end64的定义是什么? 您使用的是什么编译器版本和 SYS/BIOS?

    此外、只需确认..."start 64 |= ts.lo;"是线程中的一个拼写错误。 您的意思是"start64 |= ts.lo"。

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

    >> start64和 end64的定义是什么? 您使用的是什么编译器版本和 SYS/BIOS?

    start64和 end64都定义为 unsigned long。  (64位)。

    >>此外、仅需确认..."start 64 |= ts.lo"是线程中的一个拼写错误。 您的意思是"start64 |= ts.lo"。

    你是对的。 这是一个排印错误。

    谢谢

    Jagan

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

    您好 Jaganath、

    下面是一个有关如何对代码进行时间戳记的示例:

    #include
    #include

    uint64_t ts_1、ts_2;
    Types_Timestamp64 ts64_1、ts64_2;
    Types_FreqHz 频率;
    uint64_t delta;
    uint64_t deltaMS;

    空心跳 Fxn (UARg arg0、UARg arg1)


       TIMESTAMP_getFreq (&freq);

       while (1){
           TIMESTAMP_get64 (&ts64_1);
           Task_sleep (unsigned int) arg0);
           GPIO_TOGGLE (Board_LED0);
           TIMESTAMP_get64 (&ts64_2);

           TS_1 =(((uint64_t) ts64_1.hi << 32)| ts64_1.lo;
           TS_2 =(((uint64_t) ts64_2.hi << 32)| ts64_2.lo;

           Δ= ts_2 - ts_1;
           deltaMS = delta /(freq.lo / 1000);
       }



    我没有看到此代码出现任何溢出。  我还尝试使用"long long"代替 uint64_t、但仍然无法重现问题。  我的 CPU 频率为150MHz、因此大约28秒后、ts64_1和 ts64_2的'hi'字段变为非零。  我刚才在 TIRTOS 空示例中添加了时间戳。  您还需要将此行添加到.cfg 文件中:

    VAR 时间戳= xdc.useModule('xdc.runtime.Timestamp');

    此致、

    Janet

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

    Janet、您好!

    感谢您使用示例代码进行解释。

    我几乎每隔50秒就会观察到、在我的80MHz 时钟中、ts64_1.hi 变为非零。 我在计算时仅考虑 ts64_1.lo。 因此、我观察到它正在复位、因为大约每50秒 Δ 值就会变为负值

    这意味着,Timestamp_get32()永远不会给我准确的结果,因为它会提供32位时间戳。

    您能告诉我时间戳的单位是多少,它的更新频率是多少?

    何时应使用 TIMESTAMP_get64()?


    谢谢

    Jagan

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

    您好 Jagannath、

    您仍然可以使用 Timestamp32()对代码进行基准测试,只要您要进行基准测试的代码段的执行时间比时间戳计数器换行所需的时间更短。  例如、此代码起作用的原因是我进行基准测试的部分执行时间不到2秒:

    uint32_t ts32_1、ts32_2;
    uint32_t delta32、deltaMS32;

    空心跳 Fxn (UARg arg0、UARg arg1)

       TIMESTAMP_getFreq (&freq);

       while (1){
           ts32_1 = Timestamp_get32 ();
           Task_sleep (unsigned int) arg0);
           GPIO_TOGGLE (Board_LED0);

           ts32_2 = Timestamp_get32 ();

           delta32 = ts32_2 - ts32_1;
           deltaMS32 = delta32 /(freq.lo / 1000);
       }


    即使 ts32_2小于 ts32_1、因为它们是无符号类型、数学运算也会得到处理。  通过调用 Timestamp_getFreq()获得的时间戳频率告诉您一秒内更新时间戳记数的次数。  我在 F28M36上运行测试、因此我的时间戳频率(.lo)为150、000、000。   这意味着时间戳计数器将每28秒(4294967296/150000000)换行一次。

    此致、

    Janet