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.

[参考译文] TMS320F28384D:有关 IPC 自由运行计数器的问题

Guru**** 2886930 points

Other Parts Discussed in Thread: TMS320F28384D, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1642017/tms320f28384d-question-regarding-ipc-free-running-counter

器件型号: TMS320F28384D
主题: SysConfig 中讨论的其他器件

尊敬的专家:

我最初计划使用 IPC 自由运行计数器(根据 TMS320F2838x 技术参考手册进行下文所述)来测量两个断点之间的执行时间。

16.5 自由运行计数器

器件中存在一个 64 位自由运行计数器、可用于为处理器之间的 IPC 事件打时间戳。 该计数器由 PLLSYSCLK 计时、并通过 SYSRSn 复位。 计数器实现为两个 32 位寄存器 IPCCOUNTERH 和 IPCCOUNTERL。 读取 IPCCOUNTERL 时、将保存 IPCCOUNTERH 的值。 对 IPCCOUNTERH 的后续读取将返回此保存的值。 因此、用户必须始终先读取 IPCCOUNTERL、然后接下来读取 IPCCOUNTERH。 此设计可防止由于两个寄存器读取之间的 IPCCOUNTERL 溢出而出现竞态条件。 自由运行的计数器仅在所有 CPU 上的仿真暂停(当调试器命中断点时)时停止。 如果任何内核正在执行、计数器将运行。

我的方法如下:我先停止两个 CPU ,然后执行待测 CPU ,直到它到达第一个断点,记录当时自由运行的计数器的值。 接下来、我独立地恢复 CPU 执行、直到到达第二个断点、再次捕获计数器值。 根据我的理解、第一个断点和第二个断点的计数器值之间的差值应该表示在这两个点之间执行指令所需的时间(以 CPU 周期为单位)。 (我还确认 IPC 计数器已停止,并且在捕获两个测量值期间没有继续计数。)

但是、与预期的帧时间相比、测量值与我的预期值不匹配。 经过一些进一步的测试后、我观察到 CPU 自由运行时计数器产生了预期的帧时间。 然而、当停止 CPU 并使用断点测量计数器时、记录的值偏离了预期的帧时间。 相对于计数器停止时、使用调试器停止 CPU 时是否可能发生延迟、这可能会影响断点之间的时序测量? 我非常希望能够深入了解这种差异的潜在原因、或者建议采用其他方法来准确测量两个断点之间的执行时间。

此致、

Marvin

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

    尊敬的 Marvin:
    专家是 OOO、请期待明天响应。

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

    你好、Marvin

    是的、使用断点时存在时序伪影、它取决于 CPU 流水线与停止机制的交互方式。 当硬件断点触发时、CPU 会在指令达到流水线的 DECODE 2 (D2) 阶段而不是在指令执行的确切时刻停止。 在断点逻辑触发和计数器实际冻结之间、这种流水线延迟会引入一个较小但一致的偏移。 由于有两个断点(起始和结束)、这些偏移可能无法完全抵消(尤其是在每个断点位置的流水线状态不同时)、这就解释了基于断点的测量与自由运行行为的区别。

    此外、还有一个次要注意事项:读取 64 位计数器需要在 C28x 的 32 位数据总线上使用两个 32 位读取周期。 当第二次读取完成时、计数器已经递增两个周期。 然而,由于您确认计数器在您的读取过程中停止,这种特殊的伪影不应适用于您的情况。\

    您使用的是哪个 CCS 版本? 如果您使用较新版本的 CCS、我建议使用内置时钟而不是 IPC 计数器来测量 CPU 周期。  

    请考虑以下专用选项、而不是使用 IPC 计数器(旨在为 IPC 事件添加时间戳,而不是精确的执行分析):

    CCS 性能分析时钟  
    系统配置时钟使用芯片资源来计算两个断点之间的 CPU 周期数。 要使用它:
    • 在 CCS 中: 运行→Clock→Enable
    • 在两个测量点设置断点
    • 在第一个断点处、复位时钟计数器
    • 运行至第二个断点并读取周期计数

    此方法专门用于补偿您遇到的流水线效应。

    您能尝试使用这种方法、让我知道它是否适合您吗?

    谢谢、

    IRA

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

    尊敬的 Ira:

    你好。

    感谢您对 IPC 计数器的详细说明—这一切现在都有意义。 下载最新版本的 CCS (20.5.1) 后、我尝试使用 CCS 性能分析时钟。 但是、我遇到了类似的问题、即报告的周期数与我的预期不一致。 我预计每帧~40,000 个 CPU 周期(我确认自由运行 CPU 和在不使用断点的情况下测量帧之间的 IPC 计数器时是正确的)、但 CCS 性能分析时钟始终报告每帧 123 个 CPU 周期。 CCS 性能分析时钟是否来自系统时钟、我是否可以假设它与系统时钟以相同的频率运行?

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

    尊敬的 Marvn:

    我假设您说“每帧“时、您要尝试测量 2 个断点之间的 CPU 周期一次。 在 TMS320F28384D 中、CCS 性能分析时钟基于  DEVICE_SYSCLK_FREQ 中定义的器件 CPU 频率 device.h

    您能否确保将其正确设置为实际器件频率?

    此外、您是否能够确保在调试器设置选项中启用这两个选项?

    此外、如果这种方法不起作用、您可以考虑

    1. CPU 计时器->需要通过将其乘以 CPU 频率将其转换为 CPU 周期。 您可在 SysConfig 中找到 CPU 计时器实例

    2.切换 GPIO ->如果只需少量测量周期、这将是一个不太理想但却是权变措施的解决方案

    谢谢、

    IRA