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.

[参考译文] MSP430F2274:使用 Code Composer Studio 时、unsigned long 值不正确时的问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1448349/msp430f2274-issues-with-unsigned-long-values-not-being-correct-using-code-composer-studio

器件型号:MSP430F2274

工具与软件:

我一直在追逐计算误差、并将其范围缩小到具有 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;

    我在发布我的问题后进行了一些互联网研究、发现了以下问题:

    (+) MSP430FR6007:MSP430的 unsigned long 和 unsigned long long 的 C 问题- MSP 低功耗微控制器论坛- MSP 低功耗微控制器- TI E2E 支持论坛

    它支持您关于"优化器"的评论。  我还发现、   当一个新项目被创建时、CCS 版本:12.2.0.00009缺省为一些优化。  

    优化和压缩("Properties">"CCS Build">"Optimization")
    默认情况下、Code Composer Studio 会将:

    • 优化级别(--opt_level、-O):0-寄存器优化      ==>设置为"关"
    • 速度与大小的权衡(--opt_for_speed、-mf):1.
    • 对齐幂函数和循环(--align_for_power):取消选中
    • RTS 的内联硬件乘法版本(--use_hw_mpy):无

    将 "Optimization level (--opt_level、-O)"更改为"Off (关闭)"后、问题就消失了。

    为什么编译器会产生这个问题呢?

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

    由于算术是常量、我希望编译器在编译时计算结果、结果变为"return ((long) 256)"。  如果是这样、它可能从不会实际填充变量。 我似乎记得调试器对某些变量说"已优化掉";这可能是"Variables"(与"Expressions")视图。

    通过将变量声明为"volatile"、可以获得所需的结果。