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.

[参考译文] TMS320F28069:同一源代码的两个编译之间的不同执行时间

Guru**** 2539500 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1251304/tms320f28069-different-execution-time-between-two-compiles-of-the-same-source-code

器件型号:TMS320F28069

我有一个工程(两个不同版本)、两者都使用相同的编译器进行编译(22.6.0.LTS);在这两个工程中、我有一行代码在这两个工程之间生成不同的结果。  此问题不是与这行代码隔离的、我们只是选择这行代码作为问题的示例。   代码行如下:

MULT = 1 -(ABS (gMotorVars.Speed_Hz)/(gUserParams.motor_baseFreq/2));

// mult 是局部变量、并且 gMotorVars 和 gUserParams 以及 mainISR 的位置在两个版本之间完全相同。

我们比较了编译器/链接器设置、甚至研究了生成的汇编器(两个版本之间的情况不同)。 我们使用了来自断点计数事件的时钟周期评估、而时钟周期为313与1378。  我们还使用了 GPIO 和示波器来评估执行时间、并且能够看到两个项目之间的执行时间是执行时间的4倍。

我们使用 Code Composer  11.2.0.00007.

我们不知道接下来在哪里查找版本差异的原因。

非常感谢您的帮助和参与。

桑迪

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

    代码在哪个循环中执行? 后台循环中? 状态向量是怎样的?

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

    在 ISR 循环中

    桑迪

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

    在这两个项目中、您使用的是哪种输出格式? COFF 或 EABI? 您是否有机会通过单击"View->Disassembly"来检查 CCS 中的反汇编代码以查看有何差异?

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

    我对这两个项目都使用 COFF 输出格式。  当我们在相关行的断点处查看汇编时、我们确实看到了不同的汇编代码

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

    另一个意见是,时间增加引起关注的主要领域似乎都涉及某种程度的浮点。  大部分项目使用 IQmath 库、但并非所有代码。  两个版本的项目都使用浮点支持选项 SoftLib。

    感谢您的帮助!

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

    对于包含该行的源文件...

    kimi chang 说:
    mult = 1 -(abs (gMotorVars.Speed_Hz)/(gUserParams.motor_baseFreq/2);

    ... 请按照 如何提交编译器测试用例一文中的说明进行操作。  但执行两次。  一个项目。

    谢谢。此致、

    -乔治

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

    George

    已将数据发送到您的私人电子邮件。

    谢谢!

    桑迪

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

    不知何故、你创建了一条我无法访问的非常大的消息。  我成功地复制了这么多...

    我正在附加所请求的文件。 1.03和1.11这两个版本都使用 TI V22.6.0.LTS 编译器。 如上所述、尽管这似乎是浮点区域的一般问题、但我们选择了两个版本之间完全相同的一行代码、然后按如下所示查看时序。
    MULT = 1 -(ABS (gMotorVars.Speed_Hz)/(gUserParams.motor_baseFreq/2));
    // mult 是局部变量、并且 gMotorVars 和 gUserParams 以及 mainISR 的位置在两个版本之间完全相同。
    版本1.03第20457行
    版本1.11第1867行
    相关线路的 GPIO 时序
    版本1.03 3.8 us 版本1.11 15.6 us
    相关线路的时钟周期
    版本1.03 324版本1.11 1384
    版本1.03控制台

    我可以看到您使用的是编译器版本22.6.0.LTS。  我不明白对版本1.03和1.11的提及。  请解释一下。

    请重新发送每个测试用例。  请不要发送整个构建日志。  仅复制并粘贴调用此命令的构建日志中的一行 cl2000 在您在第一篇文章中显示的包含问题源代码行的源文件上。  我仍然需要每个测试用例的预处理文件。  如果这些文件很大、请将其压缩并 附加 该 zip 文件。

    谢谢。此致、

    -乔治

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

    George

    我相信我今天上午通过一封私人电子邮件回答了您的请求。

    谢谢。

    桑迪

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

    感谢您使用测试用例。  我可以将它们构建成汇编代码。  两个构建的汇编代码包含的差异非常小。  当然没有足够的差异来解释...

    kimi chang 说:
    我们可以看到两个项目之间的执行时间是执行时间的4倍

    因此、编译器生成的代码不是造成差异的根本原因。

    kimi chang 说:
    gMotorVars 和 gUserParams 以及 mainISR 的位置在两个版本之间完全相同。

    我以其表示这两个全局变量的内存位置、以及函数的内存位置 维护 ISR (包含示例代码行)是相同的。  但此代码大部分时间都花在浮点函数上、如 FS$$TOI (将浮点值转换为整数)或 FS$$DIV (将两个32位浮点数相除)。  这些函数来自编译器 RTS 库。  它们位于同一个存储器中吗?  所有存储器的配置方式是否相同?

    谢谢。此致、

    -乔治

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

    George

    感谢您的帮助!   我更多地使用了存储器位置、尽管 RTS 库的设置看起来是相同的、但通过其他更改、我看到了执行速度的显著提高。  我没有时间验证提请您注意的特定路线、但我相信问题已经解决。  非常感谢您的帮助!  我表示此问题已解决。

    再次感谢!

    桑迪