用于确定树莓派上是否 运行 的预定义宏?

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

嗯,根据Arm C Language Extensions

5.5.1 Hardware floating point
__ARM_FP is set if hardware floating-point is available.

...并继续枚举可能的有效值,如 0x040x60xC0xE.

NDK 为 armeabi-v7a 设置了 0xC,为 arm64-v8a 设置了 0xE 我有点困惑,因为 Raspberry 中的 gcc 编译器 OS 设置了它到 12... 即 0x0C.