飞思卡尔iMX6q ARM处理器的gcc选项

飞思卡尔iMX6q ARM处理器的gcc选项,gcc,arm,toolchain,Gcc,Arm,Toolchain,我正在尝试为我正在设置的工具链(用于开发板)找出gcc选项: Sabre lite基于飞思卡尔的iMX6q四处理器 现在我知道iMX6基本上是一个cortex-a9处理器,它有vfpv3和neon的协处理器,还有矢量图形、2D甚至3D引擎 然而,发行说明和使用指南文档对于如何启用gcc中可以启用的任何选项还不是很清楚 事实上,我可以“玩”的选项如下 -march= armv7-a - ok this one is pretty obvious. -mfpu= vfp

我正在尝试为我正在设置的工具链(用于开发板)找出gcc选项: Sabre lite基于飞思卡尔的iMX6q四处理器

现在我知道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/包:

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

感谢您的帮助

使用
-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用于浮点。

我不能回答所有问题,但“-softfp”意味着使用FPU,但要保持与不使用FPU的代码的兼容性


嘿,请详细说明一下。为什么我应该使用softfp而不是hard?另外-O3,是为了linux内核而进行的过于激进的优化。不我的意思是,试图编译u-boot、内核和包,我可能会做噩梦。不感谢您提供其余选项softfp和hard的区别在于浮点参数的传递方式,这取决于您使用的Linux发行版。由于编译器中的默认值是softfp,因此Linux发行版可能会在整数寄存器中传递浮点参数(但是,它仍然可以使用硬件FPU进行FP操作)。如果您只想编译Linux内核或U-boot,请不要更改编译器默认值;上面的选项用于编译用户空间程序,-mfloat abi应该与系统上使用的abi匹配。softfp也使用浮点硬件,但调用约定不同。您可以使用“readelf-A/bin/ls”进行检查(例如)。“Tag_ABI_VFP_args:VFP registers”的意思是硬的。非常有用,非常感谢!(当然,如果您是在目标系统上使用系统的本机gcc进行本机编译,那么正确的ABI将是编译器中的默认值,可以省略。)我找到了以下相关条目(使用readelf)。我相信“软FP”的尖叫声
Tag_FP_arch:VFPv3
Tag_ABI_HardFP_use:SP和DP
这些尖叫软件都没有,但是如果没有Tag_ABI_VFP_args:在那里,那么缺失本身就没有了。