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/AM3352:时间戳的结果不准确

Guru**** 2547150 points
Other Parts Discussed in Thread: AM3352, SYSBIOS, AM3359

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/600818/rtos-am3352-inaccurate-results-from-timestamping

器件型号:AM3352
Thread 中讨论的其他器件: SYSBIOSAM3359

工具/软件:TI-RTOS

具有 AM3352的定制板

SYSBIOS 6.46.1.38

XDC 工具3.32.1.22

我在 Main 中、所以除了 main 之外、不应该运行任何内容。  

我们有一个例程、允许我们使用时间戳模块等待准确的时间量。 我们正在将产品转换为 AM3352、我需要确保例程仍然准确。 以下是例程:

void waitusec( uint32 uSDelay )

uINT task_restore_key = Task_disable();//禁用任务,这样我们就不会被更高的任务抢占。 *
U64 usec_delay_in_ticks = 0;
U64 StartTicks = 0;
U64电流技巧= 0;
Types_FreqHz 频率;
Types_Timestamp64 BigTicksStamp;

* GPIO2_CLEARDATAOUT = TEST_PLET_OUTPUT;
if (uSDelay!= 0)

/*确定达到等于1uS 所需的节拍数。 *
TIMESTAMP_getFreq (&freq);
usec_delay_in_ticks =(U64)((freq.lo / 1000000U)* uSDelay);

/*我们不必担心检查是否有翻滚问题。 我们的最大 CPU 频率为1GHz、或每"周期" 1ns。 a U64
变量为1.8 x 10至19的功率(真的很大)。 Timestamp 需要超过1500年的时间。
顺便说一下、时间戳模块从内核 AM3352寄存器(TSCH 和 TSCL)获取信息。 不使用计时器。 *
TIMESTAMP_get64 (&BigTicksStamp);
StartTicks = BigTicksStamp.hi;
StartTicks = StartTicks << 32U;
StartTicks = StartTicks | BigTicksStamp.lo;
while (CurrentTicks <(StartTicks + usec_delay_in_ticks))

/*等待延迟到期时不执行任何操作。 *
TIMESTAMP_get64 (&BigTicksStamp);
CurrentTicks = BigTicksStamp.hi;
CurrentTicks = CurrentTicks << 32U;
CurrentTicks = CurrentTicks | BigTicksStamp.lo;


* GPIO2_SETDATAOUT = TEST_PLETED_OUTPUT;

Task_restore (task_restore_key);//将任务恢复到其先前状态。 *

GPIO 输入/输出用于调试目的、以便能够在示波器上为例程计时

我发现、此例程所需的时间是预期的2-3倍。 当我等待1us 时、我得到3us、当我等待10us 时、我得到20us。  

为什么这不准确? 是否需要启用一些时钟才能正确获得节拍?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Cobsonchael、
    我们需要深入了解这一点并返回给您。

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

    您是否能够将 GPIO 从图片中取出、因为它用于调试并使用另一种机制来检查时序?
    尝试从图片中取出 GPIO。

    Lali
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当然、我愿意尝试一些事情。 但是、我问您、如果有时间戳本身存在问题、并且没有 GPIO 来验证例程执行情况、我会使用什么指标来测量精确的1us 等待时间?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    鹅卵石
    我们需要看看这个并返回给您。

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

    我的内核分频器 N = 38 (19.2MHz/39)、而我的 M=2031

    这使我的内核频率达到:

    CLKOUT=999876923Hz 和

    CLKOUTX2 = 1999753846Hz

    根据我的理解、我的 BIOS CLK 频率应为999876923。 在使用平台文件中的999.8MHz 之前

    使用新频率时、我可以获得相当可靠的时间戳持续时间、但只有在我将 CPU 频率设置为499938461 (预期内核频率的1/2)之后。 我的内核速度是1/2的设置是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    因此、我从该线程获得了新的 N 和 M 值:

    e2e.ti.com/.../2223433

    当使用正确的值获得完整的、甚至1GHz 时钟(并在 BIOS 中更改我的 CPU 频率)时、我的时间戳会被2/3关闭。 我预期的1ms 等待时间为1.66ms。 当我将 CPU 频率设置为600MHz 时、它再次是准确的。

    我检查了 MPU_VDD、处理器复位线路变为高电平时为1.1V、因此我认为我们处于 OPP100模式。 是否有方法来验证这一点?

    我是否不理解 BIOS 中的 CPU 时钟是什么? 它真的是 MPU 时钟吗?

    编辑:此帖子的答案位于有关时间不匹配错误的另一个问题的链接中。 一个帮助解决了另一个问题

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不确定 BIOS 中的语义、但毫无疑问、ARM 内核运行在与 DM计时 器不同的 PLL 上。
    MPU 子系统(包含 ARM Cortex-A8)脱离 MPU PLL 运行(请参阅 TRM 中的图8-12)。 这就是在1GHz 和600MHz 之间进行转换时要更改的内容。 该 PLL 的输出不会到达任何其他地方、因此它应该影响任何其他外设的运行
    DMTimer 有几个可能的时钟源(请参阅 DMTIMER_1ms 一章的集成部分)。 这些选项包括 HF 时钟(在您的情况下为19.2MHz)或其他32K 时钟源。 如果您选择 CLK_32KHz、则该值来自每个 PLL、因此如果 PLL 设置为之前在电子表格中显示的值、则应为32KHz。 同样、其他32K 源来自外部或片上、因此它们也不应改变。

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

    我不会将 PLL 从1GHz 更改为600MHz、我要更改的只是 SYBIOS 字段"CPU 时钟频率"中的文本、我假设它将是1GHz、而不是600MHz、但我从时间戳获取准确结果的唯一方法是输入600MHz。 此字段仅很重要、因为它是您在时间戳模块中请求 CPU 频率时返回的值。  这不会改变器件上的任何时钟。 我非常清楚这一点。 我不知道的是、为什么当频率应为1GHz 时、我在1GHz 时无法获得准确的结果、而当我在600MHz 时、我会获得准确的结果?

    此外、我不关心 DMTimer 及其与时间戳的关系。 我知道这两个问题之间的关系很小。 另一篇文章是一个单独的问题、不适用于此处。 我链接它只是为了显示我从哪里获得新的 PLL 设置。

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

    好的、我误解了。  我主要回答的是器件的工作方式、我对 SysBIOS 的实现方式没有太多了解。  我将让该团队在这里鸣叫。

    BTW、上面我说过的轻微拼写错误: 该 PLL 的输出不会转到任何其他地方、因此它不应影响任何其他外设的操作

    此致、

    James

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为您将此内容发布在错误的主题中。 这是关于时间戳、而不是计时器不匹配错误
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请n`t、ARM 内核没有 TSCH 和 TSCL 寄存器。 这是使用与 CPU 时钟相关的 SysTick 生成的、并可定向到使用计时器时钟。 我在 TI RTOS 专家中发布了有关 AM3359平台默认值的评论。

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

    大家好、鹅卵石

    BIOS 使用 AM335X 平台的周期计数时间戳、因此它应该以 CPU 频率运行。  您是否在.cfg 文件中设置了 BIOS.cpufreq.lo 以匹配您更改为的 CPU 频率值?  如果这些不匹配、您的时间戳编号将关闭。

    此致、

    Janet

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您按照线程 Janet 进行操作、您会看到我已将其设置为正确的 CPU 频率、并且它已关闭。 我发布了我的设置以及我期望的频率为(1GHz)、没有人说我错了。 因此、当我放置预期频率(1GHz)时、我会得到不准确的结果。 当我输入的频率不是我期望的频率(600MHz)时、我会得到准确的结果。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为你实际运行的 CPU 频率不匹配、BIOS 认为 CPU 频率是多少。 如果您要将.cfg 文件中的 BIOS.cpufreq 更改为1GHz 并且时间戳不准确、那么我的第一个猜测是您的 CPU 频率实际上不是1GHz。 如果将 BIOS.cpufreq 设置为600MHz 可提供精确的时间戳、那么听起来 CPU 频率确实是600MHz、并且没有改变。 您能否尝试验证您的 CPU 频率是否与您预期的频率大致相同(例如、通过运行一个代码循环、该循环应该需要一段已知的时间)?
    此致、
    Janet
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、存在不匹配。 这就是我发布的原因。 需要一定时间的代码循环是我在原始注释中发布的代码。 我为核心发布了我的 M 和 N 值、但它仍然不正确。 我想知道发生了什么、我对该部件的了解不够、无法知道它为什么这么做。 请阅读该帖子和回复、以便您可以了解已经说过的内容。 如果您需要关注一个新问题、那么如何:

    如何为1GHz 内核操作设置分频器值、除非将 SYSBIOS CPU 频率设置为600MHz、否则无法获得准确的时间戳? 对于600MHz 有什么意义吗?

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

    大家好、鹅卵石

    很抱歉、在我之前的帖子中没有更清楚。  我的意思是您使用独立于时间戳的代码循环、例如、只使用运行大量迭代的 for ()循环。  它应该运行几秒钟、足够大、以便您可以测量手表第二手所花费的时间。  您可以在未更改 M 和 N 的程序中运行循环、并获得所用时间的近似度量。 然后、您可以将 M 和 N 值更改为您认为会导致处理器以1GHz 运行的值。  测量循环所用的时间。  如果您的 CPU 频率确实在变化、那么我希望环路所需的时间更少。  这是一个非常粗略的测量、但至少会让我们了解您的代码是否更改 CPU 频率(在 GEL 文件中?) 正常工作。

    此致、

    Janet

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我对 M 和 N 值进行了更改、我最初发布的时间戳例程在之前和之后都不同。 我知道当我这么做时、内核频率会发生变化。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因此、我的问题似乎是 VDD_MPU 上的 OPP 电压(以及对本主题的理解不足)与内核 M 和 N 的正确值相结合。我现在以1GHz 运行
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我很高兴听到您现在以1GHz 运行。 希望时间戳现在准确无误。
    此致、
    Janet