Other Parts Discussed in Thread: TMS320F28P650DK
器件型号: TMS320F28P650DK
您好、
我们将 TMS320F28P650DK 用于我们的工程、现在、我们最近在中遇到了问题
代码调试、其中变量在赋值过程中未按预期运行。 #define
current_sample_default_offset_MAX 39321 // 32768 * 1.2 volatile int32_t temp2;
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.
Other Parts Discussed in Thread: TMS320F28P650DK
器件型号: TMS320F28P650DK
您好、
我们将 TMS320F28P650DK 用于我们的工程、现在、我们最近在中遇到了问题
代码调试、其中变量在赋值过程中未按预期运行。 #define
current_sample_default_offset_MAX 39321 // 32768 * 1.2 volatile int32_t temp2;
您好、张:
根本原因是 C28x 编译器被 int 视为 16 位、因此常量 39321 被解释为 16 位值、从而导致溢出和截断。
在 TMS320F28P650DK (C28x CPU) 上、 int 只有 16 位宽[1]。 当编译器遇到 39321 不带类型后缀的字面量时、它将其视为 16 位整数。 由于 39321 超过最大有符号 16 位值 (32767)、因此会发生溢出、产生意外的结果 2457。
附加一个 L 或 UL 后缀以强制进行 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 器件上表现出相同的截断行为。
为了帮助进一步完善这一点、了解以下信息会很有用:
此致、
Zackary Fleenor