Other Parts Discussed in Thread: TMS320F28P650DK
器件型号: 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
反汇编代码:


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


