用于确定树莓派上是否 运行 的预定义宏?
Predefined macro to determine if running on a Raspberry?
我正在维护一个在 GNU/Linux (x86, x86_64), Windows (x86, x86_64), Bionic/Android ( armeabi-v7a、arm64-v8a、x86、x86_64) 以及 Raspberry Pi (armhf)。由于 Raspberry OS 实际上是 GNU/Linux Debian 的修改版本,如果我在 ARM 上 运行 linux (__linux__
),我可以 determine (__arm__
),但我无法辨别它是否是硬浮动的。 (是的,这可能是一个 XY 问题。)
我需要一种方法来精确定位树莓派,因为代码的某些部分 不会 在 Android 上实现。是的,我可以在编译时使用 -DRASPBERRY
但想知道编译器是否已经为我做了。最好是标准宏而不是特定于编译器的宏,但我正在 linux 上与 gcc 交叉编译。
我正在考虑 __ARM_FP
,但不确定。
此软件可在型号 2 及更高版本上运行,如有任何提示,我们将不胜感激。
编辑 1
为了确定这一点,我一直在 linux x86_64 上使用本机 gcc 的输出、4 个 NDK 变体和一个用于 x86 的 mingw crross 编译器。这些引起了我的注意:
__ARM_ARCH
全部
__ARM_32BIT_STATE
和 __ARM_64BIT_STATE
可能有用
__ARM_EABI__
和 __ARMEL__
似乎只出现在 Android 的 armeabi-v7a
和 Raspbian 的 gcc 中,所以可能是很好的候选者
__ARM_FP
对所有这些都有不同的值,一旦我弄清楚它的含义,这也可能有用
一般地处理问题。您如何确定哪些标志可用?使用 GCC dump preprocessor defines .
i can't discern if it's hard-float or not.
这很简单:
- 列出所有带硬浮点的编译器宏
- 列出所有没有硬浮动的编译器宏
- 显示差异
例如:我选择 arm-none-eabi-gcc
并且 cortex-m7
具有硬件浮动支持。我愿意:
$ get() { arm-none-eabi-gcc -mcpu=cortex-m7 -dM -E - < /dev/null "$@" | sort; }
$ diff <(get -mfloat-abi=soft) <(get -mfloat-abi=hard)
26c26,27
< #define __ARM_PCS 1
---
> #define __ARM_FP 14
> #define __ARM_PCS_VFP 1
132a134,139
> #define __FP_FAST_FMA 1
> #define __FP_FAST_FMAF 1
> #define __FP_FAST_FMAF32 1
> #define __FP_FAST_FMAF32x 1
> #define __FP_FAST_FMAF64 1
> #define __FP_FAST_FMAL 1
153,154c160,161
< #define __GCC_IEC_559 0
< #define __GCC_IEC_559_COMPLEX 0
---
> #define __GCC_IEC_559 2
> #define __GCC_IEC_559_COMPLEX 2
299d305
< #define __SOFTFP__ 1
__SOFTFP__
对您来说可能非常有趣(使用特定编译器时)。
Predefined macro to determine if running on a Raspberry?
好吧,您无法知道您的代码将 运行 用于什么,只能知道它 编译 的架构。查看输出:
diff <(ssh myraspberry gcc -dM -E - < /dev/null | sort) <(gcc -dM -E - </dev/null | sort)
这些宏可能听起来很有趣:
< #define __ARM_32BIT_STATE 1
< #define __ARM_ARCH 6
< #define __ARM_ARCH_6__ 1
< #define __ARM_ARCH_ISA_ARM 1
< #define __ARM_ARCH_ISA_THUMB 1
< #define __ARM_EABI__ 1
< #define __ARM_FEATURE_CLZ 1
< #define __ARM_FEATURE_COPROC 15
< #define __ARM_FEATURE_DSP 1
< #define __ARM_FEATURE_LDREX 4
< #define __ARM_FEATURE_QBIT 1
< #define __ARM_FEATURE_SAT 1
< #define __ARM_FEATURE_SIMD32 1
< #define __ARM_FEATURE_UNALIGNED 1
< #define __ARM_FP 12
< #define __ARM_PCS_VFP 1
5.5.1 Hardware floating point
__ARM_FP is set if hardware floating-point is available.
...并继续枚举可能的有效值,如 0x04
、0x6
、0xC
和 0xE
.
NDK 为 armeabi-v7a
设置了 0xC
,为 arm64-v8a
设置了 0xE
我有点困惑,因为 Raspberry 中的 gcc 编译器 OS 设置了它到 12
... 即 0x0C
.
我正在维护一个在 GNU/Linux (x86, x86_64), Windows (x86, x86_64), Bionic/Android ( armeabi-v7a、arm64-v8a、x86、x86_64) 以及 Raspberry Pi (armhf)。由于 Raspberry OS 实际上是 GNU/Linux Debian 的修改版本,如果我在 ARM 上 运行 linux (__linux__
),我可以 determine (__arm__
),但我无法辨别它是否是硬浮动的。 (是的,这可能是一个 XY 问题。)
我需要一种方法来精确定位树莓派,因为代码的某些部分 不会 在 Android 上实现。是的,我可以在编译时使用 -DRASPBERRY
但想知道编译器是否已经为我做了。最好是标准宏而不是特定于编译器的宏,但我正在 linux 上与 gcc 交叉编译。
我正在考虑 __ARM_FP
,但不确定。
此软件可在型号 2 及更高版本上运行,如有任何提示,我们将不胜感激。
编辑 1
为了确定这一点,我一直在 linux x86_64 上使用本机 gcc 的输出、4 个 NDK 变体和一个用于 x86 的 mingw crross 编译器。这些引起了我的注意:
__ARM_ARCH
全部
__ARM_32BIT_STATE
和 __ARM_64BIT_STATE
可能有用
__ARM_EABI__
和 __ARMEL__
似乎只出现在 Android 的 armeabi-v7a
和 Raspbian 的 gcc 中,所以可能是很好的候选者
__ARM_FP
对所有这些都有不同的值,一旦我弄清楚它的含义,这也可能有用
一般地处理问题。您如何确定哪些标志可用?使用 GCC dump preprocessor defines .
i can't discern if it's hard-float or not.
这很简单:
- 列出所有带硬浮点的编译器宏
- 列出所有没有硬浮动的编译器宏
- 显示差异
例如:我选择 arm-none-eabi-gcc
并且 cortex-m7
具有硬件浮动支持。我愿意:
$ get() { arm-none-eabi-gcc -mcpu=cortex-m7 -dM -E - < /dev/null "$@" | sort; }
$ diff <(get -mfloat-abi=soft) <(get -mfloat-abi=hard)
26c26,27
< #define __ARM_PCS 1
---
> #define __ARM_FP 14
> #define __ARM_PCS_VFP 1
132a134,139
> #define __FP_FAST_FMA 1
> #define __FP_FAST_FMAF 1
> #define __FP_FAST_FMAF32 1
> #define __FP_FAST_FMAF32x 1
> #define __FP_FAST_FMAF64 1
> #define __FP_FAST_FMAL 1
153,154c160,161
< #define __GCC_IEC_559 0
< #define __GCC_IEC_559_COMPLEX 0
---
> #define __GCC_IEC_559 2
> #define __GCC_IEC_559_COMPLEX 2
299d305
< #define __SOFTFP__ 1
__SOFTFP__
对您来说可能非常有趣(使用特定编译器时)。
Predefined macro to determine if running on a Raspberry?
好吧,您无法知道您的代码将 运行 用于什么,只能知道它 编译 的架构。查看输出:
diff <(ssh myraspberry gcc -dM -E - < /dev/null | sort) <(gcc -dM -E - </dev/null | sort)
这些宏可能听起来很有趣:
< #define __ARM_32BIT_STATE 1
< #define __ARM_ARCH 6
< #define __ARM_ARCH_6__ 1
< #define __ARM_ARCH_ISA_ARM 1
< #define __ARM_ARCH_ISA_THUMB 1
< #define __ARM_EABI__ 1
< #define __ARM_FEATURE_CLZ 1
< #define __ARM_FEATURE_COPROC 15
< #define __ARM_FEATURE_DSP 1
< #define __ARM_FEATURE_LDREX 4
< #define __ARM_FEATURE_QBIT 1
< #define __ARM_FEATURE_SAT 1
< #define __ARM_FEATURE_SIMD32 1
< #define __ARM_FEATURE_UNALIGNED 1
< #define __ARM_FP 12
< #define __ARM_PCS_VFP 1
5.5.1 Hardware floating point
__ARM_FP is set if hardware floating-point is available.
...并继续枚举可能的有效值,如 0x04
、0x6
、0xC
和 0xE
.
NDK 为 armeabi-v7a
设置了 0xC
,为 arm64-v8a
设置了 0xE
我有点困惑,因为 Raspberry 中的 gcc 编译器 OS 设置了它到 12
... 即 0x0C
.