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.

[参考译文] TMS320F28P650DK:将浮点除法与后续转换为整数会产生错误的结果

Guru**** 2782615 points

Other Parts Discussed in Thread: TMS320F28P650DK

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1609337/tms320f28p650dk-float-division-with-subsequent-conversion-to-integer-gives-wrong-result

器件型号: TMS320F28P650DK

尊敬的 TI 支持部门:

我们发现 f28p65x MCU 的 C 生成代码存在一些错误行为。 此问题会在采用 F28P65x C2000 实时 MCU 的 TI LaunchPad 套件上重现。

问题:以下合法的 C 代码被错误执行:

浮点 x =–10.0;
int64_t result = x / 0.1f;

on 输出结果变量包含 0、但它应该为–100(从浮点转换到整数是合法的 C 运算,直到值能够适应整数类型范围)

TT 中附加了一个非常简单的工程(对于 f28p65x、可以在 LaunchPad 上运行)。 在 LaunchPad 上运行(未连接调试器/JTAG)时、它开始使红色和绿色 LED 反相闪烁。 但是、如果可疑代码在调试器中单步执行、则获得了正确的结果、并仅开始以绿灯闪烁。

一些详细信息:

1.密钥编译器标志(其他标志可以在附加的工程属性中找到):

-- cla_support=cla2

-- float_support=fpu32

-Ooff

——fp_mode=relaxed

-- fp_reassoc=on

--define=debug

--define=cpu1.

--- define=RAM

-define=generic_ram_lnk

-- abi=eabi

2、从 RAM 执行相关代码(出于引导加载程序目的,这是一项要求)。 转换代码 (_c28xabi_ftoll) 也从 RAM 执行。 您可以在附加的工程(构建的工程包括汇编器列表)中看到它、也可以在调试器的屏幕截图中看到它。

3、从闪存执行代码时、问题不能重现、只能从 RAM 执行。 从 RAM 执行时、复制率为 100%。 我们尝试了两种 f28p65x MCU:f28p650dk6pzp 和 f28p650dk9nmr (LaunchPad)-两种芯片都出现问题。

4.编译器版本:TI v22.6.1LTS (Linux)

CSS Studio 版本:20.0.2.5_1.6.2 (Linux)

 

我们怀疑这是一个未遵守 DIVF32 指令流水线限制的编译器问题。  

例如:如果在除法之后和转换之前使用 intermidiate 浮点变量、则不能重现问题:在这种情况下、编译器插入 4 条 NOP 指令(如“TMS320C28x 扩展指令集技术参考手册“中所示)

但是、如果没有中间变量、则不会插入这些 NOP 指令(LCR 紧随其后的是 DIVF32 指令)。

另请注意、第一个__c28xabi_ftoll 指令从 R0H 寄存器读取除法的结果、该除法目前似乎尚未就绪。

请考虑我们的观察结果、并向我们提供一些建议或建议、以便正确地处理或解决此问题。

测试项目: DIVF32_DIVF.zip Test_Project

反汇编代码:

main_asm.png__c28xabi_ftoll_asm.png

“TMS320C28x 扩展指令集技术参考手册“文档中的 DIVF32 示例:

Extended_Instruction_Sets_Technical_Reference_Manual_DIVF32_Example.png

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

    您好 Oleh:

    我已经邀请了编译器专家来看看您的问题。

    此致、

    Delaney

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

    感谢您向我们通知此问题并提供测试用例。  我能够重现同样的行为。  我提交了条目 EXT_EP-13179 以对其进行调查。  欢迎点击这个链接。

    谢谢。此致、

    -乔治

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

    由于我看到问题标记为“TI 认为已解决“、而没有答案如何处理该问题。 TI 内部票证声明内部曾尝试在其他 CPU(而不是 TMS320F28P650DK)上重现问题。 我不认为这可能是一个论点、问题是无效的。

    不过,这个问题还是存在的,而且还没有提出任何解决办法。 我在此处只看到两个可能的选项:

    1. 如果是编译器问题: 在这种情况下、我预计此问题不会被拒绝、而是在编译器中修复、发布了一些更新/修补程序。
    2. 这是一个芯片问题:在这种情况下、应更新勘误文档。 此外、还应提供一些权变措施。 例如、可能会向编译器添加一些新开关来解决问题。 (看起来已经添加了一些开关来修复其他问题:--PROTECT_Volatile、--silicon_errata_fpu1_workaround)。

    因此、无论如何、不管这是编译器问题还是器件问题、编译器中都应该引入一些更改。 仅仅因为在其他芯片上没有重现这个问题、拒绝这个问题是不合理的。 它在 TMS320F28P650DK 上重现。

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

    以了解我为什么标记我的答复 TI 认为已经解决 、请参阅 CCS 论坛使用指南中的第一个常见问题解答。   

    由于编译器团队无法重现问题、我将此线程的责任更改为 C28x 器件专家。

    谢谢。此致、

    -乔治

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

    如果编译器团队试图在报告了问题的硬件平台上复制问题、那么他们复制问题的运气会更好吗?

    “无法在 tenor 或 soprano 设备的硬件主板上重现问题。“ -这听起来不像 TMS320F28P650DK。

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

    您好、Michal、

    在 RAM 中运行代码时、我可以在 P65x LaunchPad 上复制这一点。 当不需要进行浮点转换时、LCR 至_c28xabi_fTOLL 会导致违例、并且不会发生观察到的情况。

    使用转换:

     

    无转换:

    此致、
    马特

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

    Michal、

    我们已确定根本原因、并 在以下 TT 中更新了详细信息:
         https://sir.ext.ti.com/jira/browse/EXT_EP-13233
    请忽略旧的 TT、仅使用上面的信息跟踪此问题。

    此问题将在下一个修补程序版本中得到解决。

    此致、
    GREG