我相信 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
以下是工程中使用的优化设置:

