我有一个针对 MicroBlaze CPU 的“c”代码。
当我在 Eclipse + GCC 或 Visual Studio 中将代码调试为 c 程序时,我得到了我想要的结果。
然而,当我在目标上运行时,结果却不同了。
它仅发生在浮点运算(乘法和除法)上。
我怎样才能让它以全浮点精度工作?
有特殊的 GCC 标志吗?
附注
MicroBlaze 的配置是启用所有浮点运算的硬件。
我对 MicroBlaze 不太有经验,但是维基百科页面指出:
此外,可以有选择地添加/删除很少使用但在硬件中实现成本更高的关键处理器指令(即乘法、除法和浮点运算。)
强调我的。
因此,请确保您的特定 MicroBlaze 实际上支持浮点运算,否则我想您的结果将非常随机。
还要确保您的编译器工具链生成正确的指令,有时嵌入式开发工具链支持软件模拟浮点。通过反汇编最终代码并查看浮点运算是如何实现的,应该很容易弄清楚这一点。
硬件中的 MicroBlaze 浮点支持 IEEE754,但 MicroBlaze 参考指南中列出了一些例外情况。
浮点并非在所有机器上 100% 相同。 这取决于执行运算时的实际精度(硬件在执行单精度运算时可以使用扩展精度),还取决于舍入模式的配置(IEEE定义了四种不同的舍入模式)。
MicroBlaze 不支持非规范化浮点(它们将被视为零)。 然而,正常编码应避免非规范化值,因为它们的准确性会降低。
你看到什么不同?
马跃然·比尔斯基
嘿有同样的问题。是的,有特殊的 gcc 标志,但从 Vivado 导出硬件时应自动设置它们。您可以在
查看此(Vivado SDK 2019.1)Project > Properties > C/C++ Build > Settings > Microblaze gcc compiler > Inferred Options > Processor Options
和
Project > Properties > C/C++ Build > Settings > Microblaze gcc linker > Inferred Options > Processor Options
无论这些设置如何,结果都应该以某种形式代表您想要的结果。即使没有可用的 FPU,标准库也应该模拟浮点算术。
您链接了数学库(-lm)吗? 因为我也有同样的问题,奇怪的结果和 0 作为目标机器上标准数学函数的输出,没有编译时错误。在我链接“m”后,行为符合预期。 您可以在 Vivado SDK 中执行此操作
Project > Properties > C/C++ Build > Settings > Microblaze gcc linker > Libraries > -l > "m"
.