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.

[参考译文] TMS320F28379D:具有优化功能的 C2000编译器意外删除了指令

Guru**** 2558250 points
Other Parts Discussed in Thread: TMS320F28379D

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1336530/tms320f28379d-c2000-compiler-with-optimization-accidentally-removing-instructions

器件型号:TMS320F28379D

我相信 C2000编译器可能会有一个优化错误、这将删除重要的代码行。

由于代码是保密的、我无法共享整个 CCS 项目、因此我会发布代码片段并共享其他屏幕快照来描述问题。

此处显示了问题的根源。 该静态内联函数由在 TMS320F28379D 微控制器第二个内核上以100Hz 运行的函数调用。

此函数调用几个滤波器函数、这些函数获取并构造和输入浮点值、并返回一个浮点值、然后将存储在全局变量中。 为了便于参考、下面的几张图显示了 filter1_input 的结构定义和函数调用(这是一个静态内联函数)。

如上面的屏幕截图所示、"filter_input"函数的输出是根据输入浮点值以及在滤波器结构中定义的状态参数来计算的。 输出也会存储到滤波器中称为"y_n1"的参数中、并将用于滤波器执行的下一次计算。 这意味着每次调用"filter1_input"时、都应更新滤波器结构中的"y_n1"参数。

问题在于、"lowpassAmpPhase2D"滤波器结构永远不会更新"yn_1"参数。 当连续运行"second_filter_dq_outputs"函数时、"yn_1"参数从不在"lowpassAmpPhase2D"上更新、但在其他滤波器上会发生变化。 下一个屏幕截图显示了内存查看器中的结构。

红色文本表示存储器中的地址最近更新过。 如青色框中所示、对于 lowpasAmpsPhase2D、有32位数据永远不会被更新、其中"y_n1"为。 在存储"Y_n1"的地址放置一个观察点、该观察点从不关闭、这表示存储器值从不更新。

该问题最奇怪的部分是、仅通过以不同的顺序声明这些滤波器结构就可以解决问题。 如果在其他筛选器之前声明 lowpasAmpsPhase2D、则内存视图如下所示:

如图所示、lowpassAmpsPhase2D 被首先清零、而现在它的"yn_1"值正在更新。 所有其他筛选器也正常工作、因此这个简单的交换解决了该错误。

根据我所看到的内容、我认为"yn_1"值不会被缓冲区溢出或其他一些内存错误覆盖、因为我们应该会在存储器视图中看到该值会进行更新、并且会在设置为其地址时触发一个观察点。 似乎完全缺失用于写入该内存值的指令、这使我认为这可能是编译器错误。 这是否看起来可能是编译器错误、或者是一些我没有考虑过的其他问题?

其他信息:

Code Composer Studio 版本:12.1.0.00007

以下是工程中使用的优化设置:

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

    Eric、您好!

    启用优化后、调试程序 不是很可靠。 之所以这样做、是因为某些类型的优化会使使用仿真器分步调试代码变得困难。 有关如何删除变量、重新排列生成的汇编代码等的更多详细信息、请参阅 C28优化指南:

    如果您担心代码是否起作用、请 在可能的情况下尝试运行代码、而不进行任何优化。  要测试 代码是否具有优化功能、您必须将程序加载到器件中(即不是调试)、并且必须通过某种外部方法来监控程序的功能。

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

    您好、Omer:

    感谢您发送编修。  

    此代码已在 CCS 调试器之外进行了测试、发现它不能正常工作(即我在本文中提到的滤波器没有产生预期的输出)。


    我的担心和我发表这篇文章的原因是因为我认为这是编译器错误。 正如我在文章中所说的、当更改过滤器声明顺序时、代码是固定的。 因此、从技术上讲、这个问题已经得到了"解决"、但这个问题的深层原因似乎可能是编译器问题。 调试器显示、当滤波器不工作时、这是因为应该定期更改的特定存储器地址从未更改过。

    根据这些观察结果、您认为这可能是编译器错误吗? 同样、该问题仅在按特定顺序声明筛选器变量时出现、并在它们重新排序后得到修复。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Unknown 说:
    我相信 C2000编译器可能有一个优化错误、该错误正在删除基本代码行。

    解决此问题的唯一方法是您提交测试案例、以便我们重现此行为。

    您不必共享整个 CCS 项目。  在一个源文件中出现问题。  对于该源文件、 请按照 如何提交编译器测试用例一文中的说明进行操作。  请注意文章中有关如何直接向我提交测试用例的详细信息。

    谢谢。此致、

    -乔治

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

    感谢您通过私人消息提交测试案例。  我能够重现相同的行为。  我提交了 EXT_EP-11683 来对此进行调查。  我们欢迎您通过这个链接来了解这一点。

    谢谢。此致、

    -乔治