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.

[参考译文] TMS320F280039C:变量定义类型不同、计算结果异常、为什么?

Guru**** 2465890 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1484391/tms320f280039c-variable-definition-type-different-the-calculation-result-abnormal-why

器件型号:TMS320F280039C

工具与软件:

尊敬的专家:

我要求为我的客户提供服务。  

如下图左侧所示、i32_TempCurrent 定义了 int32类型;i32_TempCurrent 定义了 Uint32无符号整数类型、如下图右侧所示;代码在输入之前受到限制(0~100)、结果是 i32_TempFilt 定义了 UINT32无符号整数、此值有时会非常异常(24579)。 为什么? 您可以检查附加的文件。  e2e.ti.com/.../Variable-definition-type-different_2C00_-the-calculation-result-abnormal.pptx

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

    尊敬的绍兴市:

    看到的"异常"值的示例是什么? 您如何查看/验证异常值是什么?

    您/客户能否验证在异常情况下程序不会尝试将负有符号整数转换为无符号整数? 这可能导致一个异常值。  

    此致、

    Allison

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

    您好、Allison、

    异常值为 24579 (正常值应为0~100)。 我没有得到你的最后一句话。

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

    您好、Allison、

    我们检查 DISABLE C2000 Complier Optimization level、问题仍然存在;

    我们检查是否移除 FPU、整数乘法依赖于 C2000编译器库、此处仍然存在问题。

    我们检查 RAM 地址(i32_TempCurrent)是否由 device_init ()代码初始化。 您有任何建议吗?

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

    尊敬的绍兴市:

    在 PPT 中提供的"异常" case 的代码中、我可以看到客户正在将有符号整数转换为无符号整数。 如果有符号整数为负值、则结果可能会导致较大值异常。 这是因为有符号整数类型的负值表示为二进制补码、如 C28x 编译器指南 (第 J.3.5节)中所述。  

    客户能否确认在结果异常高的情况下使用的有符号整数的值?

    此致、

    Allison

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

    您好、Allison、

    客户已经使用过、如果其他情况下要限制 负值、您可以看到已向您发送的电子邮件。

    请在此处帮助我们找出这个根本原因。  谢谢。

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

    尊敬的绍兴市:

    您是否可以让客户将该计算分离为单独的行、以便您可以在每行上停止程序、以查看公式中发生的计算误差?  

    例如:

    A = (uint32)i32_TempCurrFilt;
    B = A * 214;
    C = (uint32)st_Display.u32_DcCurrFilt
    D = C * 3882
    E = B + D
    …
    Etc.
    

    完成此操作后、请发送屏幕截图、并告知我们客户在 其中一行中发现意外结果的位置。  

    此外、是否存在客户不使用"uint32_t"和"int32_t"类型的原因? 客户在哪里定义"uint32"和"int32"?

    此致、

    Allison

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

    您好、 Allison、

    客户使用 int32_t 类型、计算正常。 但 uint32_t 类型的情况下、 计算异常。

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

    尊敬的绍兴市:

    很高兴看到他们所使用的类型符合预期、带有"_t"。 当客户执行我的建议、逐行分解方程式以观察发现任何意外价值时、他们发现了什么?

    [报价 userid="568270" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1484391/tms320f280039c-variable-definition-type-different-the-calculation-result-abnormal-why/5716103 #5716103"]

    您是否可以让客户将该计算分离为单独的行、以便您可以在每行上停止程序、以查看公式中发生的计算误差?  

    例如:

    全屏
    1.
    2.
    3.
    4.
    5.
    6.
    7.
    A =(Uint32) i32_TempCurrent;
    B = A * 214;
    C =(UINT32) st_Display.u32_DcCurrFilt
    D = C * 3882
    E = B + D
    …μ A
    等等
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    完成此操作后、请发送屏幕截图、并告知我们客户在 其中一行中发现意外结果的位置。  

    [报价]

    此致、

    Allison