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.

[参考译文] TMS320F2.8069万:浮点变量被自动覆盖

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/583594/tms320f28069-float-variables-are-overwritten-automatically

部件号:TMS320F2.8069万

大家好,

我正在使用C2000微控制器来应用电力电子。 最近,我开始面临一个问题,一些浮点变量设置为无穷大。 因此,整个系统会失去控制,并会自动关闭。

我确信硬件中没有问题,因为代码的早期版本在相同的硬件设置中运行良好。 程序中存在一个问题,使变量值变得无穷大。 此问题仅在浮点变量中出现。  

以前我没有这么认真地对待这个问题,但现在它变得越来越严重了。

我迫切期待着提出建议或任何建议。  

谢谢!

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

    您可以设置一个中断,以便在设置LVF (锁定过流)时触发。 只要浮点计算的结果为+INF,就会设置LUF。 在ISR中,您可以放入__ASM(" ESTOP0")软件断点,以便随后检查调用堆栈并查看发生中断的函数;您还将获得发生溢出的大致地址。 然后,您可以在该点之前重置并设置两行HW断点,一步完成,直到设置LUF -这将告诉您溢出发生的位置。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    无限值的问题是一旦一个变量设置为+或-INF,从其派生的任何其他变量也将设置为+inf。

    通常,当您将除数除以零时,就会发生这种情况。 按以下方式绑定所有除法操作:

    浮子a,b,c

    #include "float.h"

    IF (fabs(b)< FLT_MIN))

    IF (((fabs (c)> FLT_MIN)

    C = MAX_value_for Your _system;//或FLT_MAX

    }

    否则


    C = 0;

    }

    }

    否则


    c = a/b;

    }

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

    你好,Vishal!

    你好,Mitja;

    感谢您的建议。 由于我不是专家,而且对这个问题的了解有限,我需要一些时间来落实你的想法。 但我一定会在下周再与你们说。

    此致,
    KARAN

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

    请原谅我迟到了。
    最后,我尝试实施您建议的代码。 但我对此有一个疑问。 请您解释一下,为什么在第一个条件下,您选择了浮动变量b?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Mitja,

    感谢您提供代码。 我尝试对特定变量执行与您的代码类似的代码,这将尝试在特定限制内绑定变量。 因此,如果变量超过最小值或最大值范围,则该变量的值将分别等于最小值和最大值范围的值。

    但问题是,在我的控制循环中,分割操作涉及到很多变量,我不可能保持相同的最小和最大范围。 因此,如果我一次又一次地对所有变量执行相同的代码,那么代码的大小将非常长,代码将不会如此高效。

    你能建议我一个想法,我可以在一个循环中绑定所有变量,例如50个浮点变量吗?

    提前感谢

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

    首先,我的代码中有一个拼写错误。 第二个IF应为IF (((fabs (a)> FLT_MIN))。

    现在回答您的问题:

    请您解释一下,为什么在第一个条件下,您选择了浮动变量b?


    B为除数。 如果除数明显为零,则结果应是您的系统支持的最大值,除非红利也为零。

    但问题是,在我的控制循环中,分割操作涉及到很多变量,我不可能保持相同的最小和最大范围。 因此,如果我一次又一次地对所有变量执行相同的代码,那么代码的大小将非常长,代码将不会如此高效。

    你能建议我一个想法,我可以在一个循环中绑定所有变量,例如50个浮点变量吗?


    您只需进行与划分工序一样多的检查。 如果除数是复杂表达式,则只需检查表达式而不是表达式的各个部分。

    您也可以这样做:

    如果(0 <(b)< FLT_MIN) b = FLT_MIN

    如果(0 >(b)>-FLT_MIN) b =-FLT_MIN

    可以使用三元运算符编写,编译器可能会进行优化。

    此外,您是否真的需要提前担心性能?