飞思卡尔 iMX6q ARM 处理器的 gcc 选项
Posted
技术标签:
【中文标题】飞思卡尔 iMX6q ARM 处理器的 gcc 选项【英文标题】:gcc options for a freescale iMX6q ARM processor 【发布时间】:2013-02-04 10:14:48 【问题描述】:我正在尝试找出我正在为开发板设置的工具链的 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/packages 的默认选项:
-march= armv7-a -mfpu= vfpv3 -mfloat-abi=softfp
感谢您的帮助
【问题讨论】:
您的 -mfloat-abi 应该匹配系统上使用的任何 ABI。 softfp 也使用浮点硬件,但调用约定不同。您可以使用“readelf -A /bin/ls”(例如)进行检查。 “Tag_ABI_VFP_args: VFP registers”的意思是hard。 非常有用,非常感谢! (当然,如果您在目标系统上使用系统的本机 gcc 进行本机编译,那么正确的 ABI 将是编译器中的默认值,可以省略。) 我找到了以下相关条目(使用 readelf)。我相信尖叫“softfp”?Tag_FP_arch: VFPv3
和 Tag_ABI_HardFP_use: SP and DP
没有一个尖叫 softfp,但如果没有 Tag_ABI_VFP_args: 在那里,那么这种缺席本身就是如此。
【参考方案1】:
使用-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而不是hard?另外-O3,对于linux内核来说过于激进的优化。不?我的意思是我冒着噩梦试图编译 u-boot 、内核和软件包的风险。不?感谢您提供其他选项 softfp 和hard 的区别在于浮点参数的传递方式,这取决于您使用的Linux 发行版。由于您的编译器中的默认值是 softfp,因此您的 Linux 发行版可能会在整数寄存器中传递浮点参数(但是,它仍然可以使用硬件 FPU 进行 FP 操作)。如果您只想编译 Linux 内核或 U-boot,请不要更改编译器默认值;以上选项用于编译用户空间程序。【参考方案2】:我无法回答所有问题,但“--softfp”表示使用 FPU,但与不使用的代码保持兼容性。
Slightly outdated ARM FP document
【讨论】:
以上是关于飞思卡尔 iMX6q ARM 处理器的 gcc 选项的主要内容,如果未能解决你的问题,请参考以下文章