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.

[参考译文] AM2434:对 ClockP_getTimeUsec() 的第二次调用返回较低值(与绕回无关)

Guru**** 2873850 points

Other Parts Discussed in Thread: AM2434, LP-AM243

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1629271/am2434-second-call-to-clockp_gettimeusec-returns-lower-value-not-related-to-wrap

器件型号: AM2434
主题中讨论的其他器件: LP-AM243

大家好、我正在处理一个我们之前编写的超时代码失败的问题、可能是在编译器和/或 SDK 升级时。

我在 AM2434 ALX 上使用 CLANG v4.0.4.LTS 和 Ind Comms SDK 11.0.0.13。

总之,我们使用 ClockP_getTimeUsec() 来检查在等待数字输入变为设置时的超时 — 这是非常简单的代码。

但是、我们看到了错误的超时。 事实证明 对 ClockP_getTimeUsec 的第二个调用返回的值低于第一个调用 (否,这不是包装问题-目标仅运行了一分钟)。

为了解决这个问题、我发现下面的代码是有效的:

inline uint64_t getTimestamp_us() 

  uint64_t TimeStamp0_us、TimeStamp1_us;
  应该做
  {
    TimeStamp0_us = ClockP_getTimeUsec ();
    TimeStamp1_us = ClockP_getTimeUsec ();

    IF (TimeStamp0_us > TimeStamp1_us)
    {
     debugLog(“TimeStamp0_us:%u“、TimeStamp0_us);
     debugLog(“TimeStamp1_us:%u“、TimeStamp1_us);
    }

  } while (TimeStamp0_us > TimeStamp1_us);

  返回 TimeStamp1_us;
}

这是在中调用的

      while (true) 
      {
        ClockP_USleep (1);

        const uint32_t D1State = GPIO_pinRead (CSL_GPIO1_BASE、SPI0_D1_pin);

        const uint64_t timestamp_us = getTimestamp_us ();

        const uint32_t ElapsedTime_us = static_cast (timestamp_us - StartTime_us);

        IF (ElapsedTime_us > WriteTimeMax_us)
        {...}
...
    }

忽略明显的绕回场景、getTimestamp_us 中的调试日志和循环永远不会发生、但确实会:

“TimeStamp0_us:8830999“ 
“TimeStamp1_us:8830015“
“TimeStamp0_us:8831999“
“TimeStamp1_us:8831016“

这是怎么回事?

谢谢、Steve

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

    您好、

    带我了解您的应用。

    是否在 ISR 中完成计时器计算? 您从哪个内核运行应用? 它是 FreeRTOS 还是 nortos?

    此致、

    Vaibhav

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

    尊敬的 Vaibhav:

    这是内核 3 上的 FreeRTOS 应用。 该函数不在 ISR 上下文中调用。  任务 P_PRIORITY 最高 — 3.

    Steve

    P.S.-我之前发布过此内容、但您的 E2E 网站似乎有问题。

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

    您是否可以分享您的申请、让我评估不同的指针?

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

    嗨、Vaibhav -我已经分享了我能做的一切 — 我们的源代码是机密的-但代码片段中应该有足够的内容可以在 LaunchPad 上复制。

    我不认为我们使用 ClockP_getTimeUsec 的方式特别具有挑战性 — 您能重现吗?  

    谢谢、Steve

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

    您好:
    感谢您的查询。 有关专家因** TI 印度**假期而离职。
    请预计响应会延迟。 感谢您的耐心和理解。

    此致、
    TI E2E 支持团队
    ——
    *这是一个自动通知。*

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

    您好 Steve、

    、但代码片段中应该有足够的内容可以在 LaunchPad 上复制。

    我相信您指的是 LP-AM243。 我将尝试重现此内容并告诉您。

    谢谢、

    Vaibhav

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

    您好、

    我使用最新的 MCU PLUS SDK 11.2 进行了测试、根本没有看到任何问题。

    此致、

    Vaibhav