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.

[参考译文] TMS320F28P650DK:TMS320F28P650DK 的程序

Guru**** 2885260 points

Other Parts Discussed in Thread: TMS320F28P650DK

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1644136/tms320f28p650dk-the-program-for-tms320f28p650dk

器件型号: TMS320F28P650DK

您好、

我们将 TMS320F28P650DK 用于我们的工程、现在、我们最近在中遇到了问题

代码调试、其中变量在赋值过程中未按预期运行。 #define

current_sample_default_offset_MAX 39321 // 32768 * 1.2 volatile int32_t temp2;

TEMP2 = current_sample_default_OFFSET_MAX;
 
运行结果为 temp2 = 2457。  您能帮我找出原因吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、张:

    根本原因是 C28x 编译器被 int 视为 16 位、因此常量 39321 被解释为 16 位值、从而导致溢出和截断。

    在 TMS320F28P650DK (C28x CPU) 上、 int 只有 16 位宽[1]。 当编译器遇到 39321 不带类型后缀的字面量时、它将其视为 16 位整数。 由于 39321 超过最大有符号 16 位值 (32767)、因此会发生溢出、产生意外的结果 2457。

    修复

    附加一个 LUL 后缀以强制进行 32 位解释:

    #define CURRENT_SAMPLE_DEFAULT_OFFSET_MAX 39321L
    #define CURRENT_SAMPLE_DEFAULT_OFFSET_MAX ((int32_t)39321)
    这可确保 long 在赋值给 int32_t 变量[2]之前将常量视为一个(32 位)值。

    为什么会发生这种情况

    参数
    C28x CPU 大小
    int
    16 位
    long
    32 位
    long long
    64 位

    这是众所周知的 C2000 陷阱。 C/C++语言标准管理编译器确定常量类型的方式、并且 没有编译器选项来更改此默认行为 —您必须在源代码[2]处显式指定类型。

    检查您的代码库以查看具有较大数字常量的其他宏(超过 32767 表示有符号、高于 65535 表示无符号)。 任何超出 16 位范围且没有 L/UL 后缀的常量都将在 C2000 器件上表现出相同的截断行为。


    为了帮助进一步完善这一点、了解以下信息会很有用:

    • 代码库中是否存在类似的大常量、这些常量可能需要相同的修复
    • 您的编译器版本和优化设置(尽管无论优化级别如何,都会出现此问题)

    1. C2000 Academy — 数据类型大小
    2. TMS320F28P650DK:如何将常量默认设置为 32 位

    此致、

    Zackary Fleenor