是的,你没有FPU所以浮点数需要在整数数学中完成。但是,这样做有两种机制,一种比另一种快11倍。
GCC目标ARM-Linux的GNU通常包括在ARM的第一FPU代码真正的浮点指令的“FPA”,现在这么难得的是不存在的。这些会导致非法指令陷阱,然后在内核中被捕获和模拟。由于上下文切换,这非常缓慢。
-msoft浮子代替插入到库函数调用(在libgcc.a中)。这样可以避免切换到内核空间,速度比仿真的FPA指令快11倍。
你不会说你正在使用什么浮点模型 - 它可能是你已经用-msoft-float构建整个用户空间 - 但它可能是值得检查的,你的目标文件不包含FPA指令。你可以检查:
objdump -d file | grep '<space><tab>f' | less
其中
file
是你的编译器输出的任何目标文件,可执行文件或库。所有的FPA指令都以
f
开头,而没有其他ARM指令。这些是实际的空间和制表符,你可能需要说
<control-V><tab>
来让制表符通过你的shell。
如果使用FPA的insn,您需要使用-msoft浮来编译你的整个用户空间。
最全面深入阅读对这些问题是http://wiki.debian.org/ArmEabiPort这主要关心的是第三种选择:使用arm-linux-gnueabi
编译器,一个新的替代ABI,可从GCC-4.1.1开始并具有不同的特点。有关更多详细信息,请参阅文档
GCC 3.3!?你意识到这已经超过5年了?成为'真正的程序员'并编译你自己的GCC 4.4.2工具链! – LiraNuna
我已经为它编译了一个4.1 GCC工具链,但它看起来非常糟糕,所以我回到了供应商提供给我的那个工具链。 – user21293
不知道“真正的程序员”的东西,但如果你测量最近的GCC的操作,你会发现,至少对于ARM来说,4.2是编译时所用的本地最小时间,用于编译的内存,生成目标代码的大小并且目标代码需要运行的时间。从4.3开始,所有4组中的某种指数增长都在。 – martinwguy