针对Freescale iMX6q ARM处理器的GCC选项

9
我正在尝试为我正在设置的开发板Sabre-lite(基于Freescale的iMX6q四核处理器)配置gcc选项。现在,我知道iMX6基本上是一个cortex-a9处理器,具有协处理器vfpv3和neon,以及向量图形、2D甚至3D引擎。然而,发布说明和使用指南文档并没有明确说明如何启用gcc中可启用的任何选项。实际上,我可以“玩耍”的选项如下:
-march= armv7-a                - ok this one is pretty obvious.
-mfpu= vfpv3/neon              - i can use only the vfpv3 co-processor, or both (respectively, depends on option)
-mfloat-abi=softfp/soft/hard   - I guess I can choose hard here, as there is hardware for fp operations
-mcpu=cortex-a9                - is it option even necessary? it is not clear if it just an alias for -march or something else.

还有其他我应该启用的选项吗? 为什么工具链默认选项是构建Linux内核/uboot/packages如下:

-march= armv7-a -mfpu= vfpv3 -mfloat-abi=softfp

感谢你的帮助。

4
您的 -mfloat-abi 应该与系统使用的 ABI 匹配。softfp 也使用浮点硬件,但调用约定不同。您可以使用 "readelf -A /bin/ls" 命令(例如)来进行检查。如果输出中出现 "Tag_ABI_VFP_args: VFP registers",则表示为 hard ABI。 - unixsmurf
(当然,如果您在目标系统上使用系统的本机gcc进行本地编译,则正确的ABI将是编译器中的默认值,可以省略。) - unixsmurf
我使用readelf找到了以下相关条目。我相信你看到了“softfp”这个词?Tag_FP_arch: VFPv3Tag_ABI_HardFP_use: SP and DP - nass
没有一个是明显的 softfp,但如果其中没有 Tag_ABI_VFP_args:,那么这个缺失本身就是。 - unixsmurf
2个回答

6

使用以下编译选项:-mthumb -O3 -march=armv7-a -mcpu=cortex-a9 -mtune=cortex-a9 -mfpu=neon -mvectorize-with-neon-quad -mfloat-abi=softfp。请注意,默认情况下,编译器不会使用NEON对浮点运算进行矢量化,因为NEON不支持非规格化数。如果您可以接受一定的精度损失,可以通过添加-ffast-math开关来让gcc使用NEON进行浮点运算。


2
嗨,能否详细说明一下?为什么我应该使用softfp而不是hard呢?另外,-O3对于Linux内核来说过于激进的优化了,不是吗?我的意思是,我冒着尝试编译u-boot、内核和软件包时出现噩梦的风险,不是吗?感谢您提供的其他选项。 - nass
2
softfp和hard的区别在于浮点参数传递的方式,并且它取决于你使用的Linux发行版。由于编译器的默认值是softfp,因此您的Linux发行版很可能会将浮点参数传递到整数寄存器中(但仍然可以使用硬件FPU进行FP操作)。如果您只想编译Linux内核或U-boot,请不要更改编译器默认值;上面的选项是用于编译用户空间程序的。 - Marat Dukhan

1
我可以协助翻译,这里的“--softfp”表示使用FPU,但同时保持与不支持FPU的代码的兼容性。以下是链接到稍有过时的ARM FP文档:Slightly outdated ARM FP document

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接