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.

[参考译文] TMS320F280025C:浮点转换编译器错误/器件勘误表问题?

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1459134/tms320f280025c-float-conversion-compiler-bug-silicon-errata-issue

器件型号:TMS320F280025C

工具与软件:

你(们)好、

我发现了一个奇怪的问题、在浮点数计算期间、预期值 会在结果预计约为3328.0f (从 ADC 测得的毫伏)时波动。 我相当肯定这是一个器件/勘误表问题、因为无论我在代码中的哪个位置进行此计算、也无论我使用什么变量来存储结果并继续波动。 (我尝试在 main ()中执行此计算、而不是在计时器触发的中断中执行此计算、结果相同)。

为了演示该问题、我使用 uint32_t 进行了相同的计算、但没有看到这种波动。 然后我将结果转换为浮点值(并除以10.0f)、我再次看到波动。

CH3_VOLTAGE_AVERAGE_DMV 是类型 uint32_t

CH3_VOLTAGE_AVERAGE_mV[1]是类型 悬空

以在使用时保持精度  uint32_t、  CH3_VOLTAGE_AVERAGE_DMV 是 ch3_VOLTAGE_AVERAGE_mV 大小的10倍。

您可以看到第一行、其中的 uint32_t 执行计算:

 Ch3_VOLTAGE_AVERAGE_DMV =(SENSE_VOLTAGE_DMV * 625)/ 1000;//波动介于33281和33268之间。  总通量为1.3mV (当您将 DMV 除以10得到 mV 时)。

在出现 float 转换和除以10.0f 的第二行中:  

 ch3_voltage_average_mV[1]=((float) ch3_voltage_average_DMV)/10.0f;//目前的波动介于3311和3344之间。 这总波动为33mV。  

相关代码部分用红色圈出:

我浏览了勘误表:TMS320F28002x 实时 MCU 器件勘误表器件修订版 A、0  

我发现了一个标题为: FPU 到 CPU 寄存器移动操作之前在第14页上有任何 FPU 2p 操作。  

我的问题可能是这个错误以某种方式导致的吗? 我正在使用最新的编译器 V22.6.1、因此我不确定这是如何实现的?

非常感谢您对此的支持。

此部分的分解也可以在下面找到:

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

    请帮助我更好地理解这一点。 您是否说即使您为公式提供恒定输入、输出也会波动? 如果我的理解是正确的、请告诉我您保存的是哪些变量"常量"。

    和说明了输入值、输出值和预期值。

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

    尊敬的 Sira:

    某些原因导致的磁通只在我取实值时发生。 当我保持他们不变时,他们停止波动,这是一个非常令人不安的现象。  

    他们似乎只发生当我投入浮点,这并不重要,是否有进一步的数学运算或没有。 这是一段很大的代码、我在许多位置都使用了浮点型、但出于某种原因、我在这里只对这种计算和这个特定值有问题-这又非常令人困惑。  

    为了更好地演示问题、我创建了一个开关、我可以手动修改输入值、以测试它在固定值和 ADC 读取值下的行为、但行为取决于固定值。  

    演示代码如下:

    if (TEST_SWITCH =0)

    SENSE_VOLTAGE_DMV = 10*((uint32_t)(8192 + ch3_VOLTAGE_RAW[1]-CH2_VOLTAGE_RAW[1]);//SENSE_VOLTAGE_DMV 是 ADC 结果值、所有这些变量都是 uint32_t;
    Ch3_VOLTAGE_AVERAGE_DMV =(SENSE_VOLTAGE_DMV * 625)/ 1000;//此处暂无问题
    ch3_VOLTAGE_AVERAGE_DMV_CAST_TO_FLOAT =(float) ch3_VOLTAGE_AVERAGE_DMV;//发生问题!
    }
    设计

    //如果 TEST_SWITCH == 1在这里,我们可以手动将 SENSE_VOLTAGE_DMV 设置为有问题的值,但不显示波动。
    CH3_VOLTAGE_AVERAGE_DMV =(SENSE_VOLTAGE_DMV * 625)/ 1000;
    ch3_VOLTAGE_AVERAGE_DMV_CAST_TO_FLOAT =(float) ch3_VOLTAGE_AVERAGE_DMV;

    }

    当 SENSE_VOLTAGE_DMV 介于53240和53250之间(这是实际 ADC 读数略微波动、 符合预期)时、浮点转换开始出现问题。

    将 TEST_SWITCH 设置为零后、我将获得以下图表数据-请注意  当 SENSE_VOLTAGE_DMV_CAST_TO_FLOAT  在测试开始时稍微降低时(在样本65之前的 x 轴上)、ch3_VOLTAGE_AVE_DMV_CAST_TO_FLOAT 如何波动

    在上面的图中(在 x 轴上采样65之后)、您可以看到  ch3_VOLTAGE_AVERAGE_DMV_CAST_TO_FLOAT 中的大幅跳跃 、这在 SENSE_VOLTAGE_DMV  增加之前不会发生。

    然后、我  通过将 TEST_SWITCH 设置 为1 (x 轴中大约样本85处)、尝试使用固定值对 SENSE_VOLTAGE_DMV 进行相同的测试。   然后、我们将 SENSE_VOLTAGE_DMV 最初手动设置为有问题的值 53250 、然后设置为53240、再再次设置为53250、 但如果您观察  ch3_VOLTAGE_DMV_CAST_TO_float 、可以看到正确的值、波动已经消失。 我试着手工改变价值几次,但这种现象已经消失了。  

    如果这有助于您的理解、请告诉我-再次感谢您的帮助。