工具与软件:
我一直在追逐计算误差、并将其范围缩小到具有 unsigned long (int32_t)的问题。
以下是调试器观察窗口中的简单代码和一幅图像。
长 temp32;
temp32s =(长) 1;
temp32s =(long) temp32s *(long) 256;
我预计结果是256、而不是 4194304
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.
工具与软件:
我一直在追逐计算误差、并将其范围缩小到具有 unsigned long (int32_t)的问题。
以下是调试器观察窗口中的简单代码和一幅图像。
长 temp32;
temp32s =(长) 1;
temp32s =(long) temp32s *(long) 256;
我预计结果是256、而不是 4194304
在具有 CCS 12.6.0的 G2553 (F2系列)上、我没有看到这种行为。 我同时尝试了-O0和-O4。
我怀疑优化器/调试器的错觉。 周围代码看起来是什么样子的? 您是否在任何地方使用结果?
我在代码集中提供了上述 ADC 样本、但从未在示例中使用过。
为了使编译器能够实际编译"temp32s"值、必须使用返回 temp32s。
int32_t temp32;
int16_t raw1;
raw1 =(int16_t)(GetADC10Sample (ADC_TEMPERATURE)& 0x03FF);
temp32s =(长) 1;
temp32s =(long) temp32s *(long) 256;
返回 temp32;
我在发布我的问题后进行了一些互联网研究、发现了以下问题:
它支持您关于"优化器"的评论。 我还发现、 当一个新项目被创建时、CCS 版本:12.2.0.00009缺省为一些优化。
优化和压缩("Properties">"CCS Build">"Optimization")
默认情况下、Code Composer Studio 会将:
将 "Optimization level (--opt_level、-O)"更改为"Off (关闭)"后、问题就消失了。
为什么编译器会产生这个问题呢?
由于算术是常量、我希望编译器在编译时计算结果、结果变为"return ((long) 256)"。 如果是这样、它可能从不会实际填充变量。 我似乎记得调试器对某些变量说"已优化掉";这可能是"Variables"(与"Expressions")视图。
通过将变量声明为"volatile"、可以获得所需的结果。