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.

[参考译文] TMS320F280045:溢出条件下浮点单精度分频可能存在的问题

Guru**** 2513185 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1186810/tms320f280045-possible-issue-with-floating-point-single-precision-division-with-overflow-conditions

器件型号:TMS320F280045

在我们的应用中、我们将使用最新的 fs_div28.asm 文件(来自编译器工具 v20.2-1 LTS、看起来与 v22.6.0 LTS 相同)执行浮点除法、当测试指数溢出和除法0时、我们发现以下问题:

  1. 当使用会导致溢出的数字时、软件会给出错误的结果、例如:

F1 =  1.75e+34 (0x7858b717)、大正数

F2 = -1.96e-07 (bb452f117)、小负数

F1/F2 = 2.35e-38 (0x01000008)、小正数

在指数溢出的情况下、检查 fs_div28.asm 文件似乎是为了返回 max 有效的正负浮点数(0x7F7FFFFF 或0xFF7FFFFF),但无法使用。

下面这个问题看起来就像这样:代码通过在 AL 寄存器中加载生成的浮点指数、减去255并检查结果是否大于或等于0来检查溢出。 然后,“溢出”处理部分尝试使用 SAT 指令将 ACC 寄存器填充为0x7FFF FFFF,但由于 ACC 寄存器本身没有溢出,OVC 不会增加(保持为0),ACC 保持不变,因此 ACC 中的最终结果不正确。

此外,如果生成的浮点数为负,则 ACC 保存在 P 寄存器中,AH 被修改,但在分支到“返回值”部分之前,ACC 永远不会恢复。

2.计算除数时、结果为+3.38e+38 (0x7f7f0000)或–3.38e+38 (0xFF7F0000)、具体取决于被除数的符号。

因此、对于问题1、任何人能否确认这是否是 FS_DIV28.asm 中的问题、或者器件是否需要额外设置才能执行浮点决策。

关于问题2、使用这些数字的原因是什么、而不是+/-无穷大或最大值 有效的正负浮点数(0x7F7FFFFF 或0xFF7FFFFF)?

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

    您好、Jose、

    我们的专家将在明天回来。

    最棒的

    Ryan Ma

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

    感谢您将此问题通知我们、并提供简要说明。  我可以重现相同的行为。  我提交了 EXT_EP-11014条目  以进行调查。  欢迎您访问该链接。

    谢谢、此致、

    乔治

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

    我们可能需要比下一个发布周期更快的解决方案。  我们将制定一个针对代码的建议、并将其展示在此处以获取反馈。

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

    为了解决问题2、我们打算将 FS_DIV28.asm 的第437-447行从以下内容中进行更改:

    为此:

    OVERFLOW
        MOV     AL, #0            ; Load 0 in AL
        MOV     AH, RES_SIGN      ; Load sign in AH 0000 S000 0000 0000
        XOR     AH, #0800         ; Flip sign bit S
        LSL     AH, 7          ; Set flipped bit S in bit 31 of ACC
        NOT     ACC          ; Flip back sign, fill with 1's
        SUB     AH, #080h         ; AH = S111 1111 0111 1111
            B       RETURN_VALUE,UNC

    请提供建议。

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

    对于第1个问题、我们正在考虑将 FS_DIV28.asm 的第463-475行从以下内容中进行更改:

    为此:

    OP2_ZERO
        MOV     AL, #0            ; Load 0 in AL
        MOV     AH, OP1_SE        ; load sign and exp of op1 to AH
        AND     AH, #0100h       ; mask to get sign
        XOR     AH, #0100         ; Flip sign bit S
        LSL     AH, 7          ; Set flipped bit S in bit 31 of ACC
        NOT     ACC          ; Flip back sign, fill with 1's
        SUB     AH, #080h         ; AH = S111 1111 0111 1111
        B       RETURN_VALUE,UNC

    请提供建议

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

    我们使用编译器向 RTS 库提供源代码、以便客户可以对其进行修改。  因此、我们欢迎您在编译器的副本中进行这些建议的更改。  遗憾的是、我们无法验证任何此类修改是否正确。

    谢谢、此致、

    乔治