Jump to content

    

GCC - определить режим компиляции soft/hard fp.

Всем привет.

Хочу в тексте программы для Cortex-M3/M4/M4F определять, как она компилируется - с аппаратной плавучкой или с программной.

M3 от M4 я отличить могу - есть дефайны __ARM_ARCH_7M__ для M3 и __ARM_ARCH_7EM__ для M4.

А вот как отличить вариант с "-mfpu=fpv4-sp-d16 -mfloat-abi=hard" и без?

Share this post


Link to post
Share on other sites
Всем привет.

...

А вот как отличить вариант с "-mfpu=fpv4-sp-d16 -mfloat-abi=hard" и без?

гляньте на:

__ARM_PCS_VFP
__ARM_PCS
__SOFTFP__

Share this post


Link to post
Share on other sites
#if defined (__VFP_FP__) && !defined(__SOFTFP__)
   // Используем аппаратную плавучку
#else
  // Используем софтовую плавучку
#endif

Share this post


Link to post
Share on other sites

Спасибо, то что надо.

Пробовал три варианта:

  1. -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard
  2. -mcpu=cortex-m4
  3. -mcpu=cortex-m3

 

__VFP_FP__ - определён в любом случае:)

__ARM_PCS_VFP - определён только в первом варианте,

__ARM_PCS и __SOFTFP__ определёны в вариантах 2 и 3.

 

Думаю остановиться на __ARM_PCS_VFP.

Share this post


Link to post
Share on other sites

Оказывается, __ARM_PCS_VFP не совсем подходит.

Дело в том, вариантов всего не три, а четыре:

  1. -mcpu=cortex-m3
  2. -mcpu=cortex-m4
  3. -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard
  4. -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp
Как я понял, червёртый вариант тоже использует сопроцессор, и отличается от -mfloat-abi=hard соглашениями о вызовах.

Вот что определено для каждого из этих вариантов:

  1. __SOFTFP__, __ARM_PCS
  2. __SOFTFP__, __ARM_PCS
  3. __ARM_PCS_VFP
  4. __ARM_PCS
Таким образом, чтобы определить вариант с использованием сопроцессора нужна следующая конструкция:

#if (!defined __SOFTFP__)

 

Share this post


Link to post
Share on other sites

вставлю свои 5 копее - вот макрос в исходниках котрый втыкает дефаны:

/* Target CPU builtins.  */
#define TARGET_CPU_CPP_BUILTINS()            \
  do                            \
    {                            \
    if (TARGET_DSP_MULTIPLY)            \
       builtin_define ("__ARM_FEATURE_DSP");    \
        if (TARGET_ARM_QBIT)                \
           builtin_define ("__ARM_FEATURE_QBIT");    \
        if (TARGET_ARM_SAT)                \
           builtin_define ("__ARM_FEATURE_SAT");    \
    if (unaligned_access)                \
      builtin_define ("__ARM_FEATURE_UNALIGNED");    \
    if (TARGET_ARM_FEATURE_LDREX)                \
      builtin_define_with_int_value (            \
        "__ARM_FEATURE_LDREX", TARGET_ARM_FEATURE_LDREX);    \
    if ((TARGET_ARM_ARCH >= 5 && !TARGET_THUMB)        \
         || TARGET_ARM_ARCH_ISA_THUMB >=2)            \
      builtin_define ("__ARM_FEATURE_CLZ");            \
    if (TARGET_INT_SIMD)                    \
      builtin_define ("__ARM_FEATURE_SIMD32");        \
                                \
    builtin_define_with_int_value (                \
      "__ARM_SIZEOF_MINIMAL_ENUM",                \
      flag_short_enums ? 1 : 4);                \
    builtin_define_with_int_value (                \
      "__ARM_SIZEOF_WCHAR_T", WCHAR_TYPE_SIZE);        \
    if (TARGET_ARM_ARCH_PROFILE)                \
      builtin_define_with_int_value (            \
        "__ARM_ARCH_PROFILE", TARGET_ARM_ARCH_PROFILE);    \
                                \
    /* Define __arm__ even when in thumb mode, for    \
       consistency with armcc.  */            \
    builtin_define ("__arm__");            \
    if (TARGET_ARM_ARCH)                \
      builtin_define_with_int_value (        \
        "__ARM_ARCH", TARGET_ARM_ARCH);        \
    if (arm_arch_notm)                \
      builtin_define ("__ARM_ARCH_ISA_ARM");    \
    builtin_define ("__APCS_32__");            \
    if (TARGET_THUMB)                \
      builtin_define ("__thumb__");            \
    if (TARGET_THUMB2)                \
      builtin_define ("__thumb2__");        \
    if (TARGET_ARM_ARCH_ISA_THUMB)            \
      builtin_define_with_int_value (        \
        "__ARM_ARCH_ISA_THUMB",            \
        TARGET_ARM_ARCH_ISA_THUMB);            \
                            \
    if (TARGET_BIG_END)                \
      {                        \
        builtin_define ("__ARMEB__");        \
        builtin_define ("__ARM_BIG_ENDIAN");    \
        if (TARGET_THUMB)                \
          builtin_define ("__THUMBEB__");        \
        if (TARGET_LITTLE_WORDS)            \
          builtin_define ("__ARMWEL__");        \
      }                        \
        else                        \
      {                        \
        builtin_define ("__ARMEL__");        \
        if (TARGET_THUMB)                \
          builtin_define ("__THUMBEL__");        \
      }                        \
                            \
    if (TARGET_SOFT_FLOAT)                \
      builtin_define ("__SOFTFP__");        \
                            \
    if (TARGET_VFP)                    \
      builtin_define ("__VFP_FP__");        \
                            \
    if (TARGET_ARM_FP)                \
      builtin_define_with_int_value (        \
        "__ARM_FP", TARGET_ARM_FP);            \
    if (arm_fp16_format == ARM_FP16_FORMAT_IEEE)        \
      builtin_define ("__ARM_FP16_FORMAT_IEEE");        \
    if (arm_fp16_format == ARM_FP16_FORMAT_ALTERNATIVE)    \
      builtin_define ("__ARM_FP16_FORMAT_ALTERNATIVE");    \
        if (TARGET_FMA)                    \
          builtin_define ("__ARM_FEATURE_FMA");        \
                            \
    if (TARGET_NEON)                \
      {                        \
        builtin_define ("__ARM_NEON__");        \
        builtin_define ("__ARM_NEON");        \
      }                        \
    if (TARGET_NEON_FP)                \
      builtin_define_with_int_value (        \
        "__ARM_NEON_FP", TARGET_NEON_FP);        \
                            \
    /* Add a define for interworking.        \
       Needed when building libgcc.a.  */        \
    if (arm_cpp_interwork)                \
      builtin_define ("__THUMB_INTERWORK__");    \
                            \
    builtin_assert ("cpu=arm");            \
    builtin_assert ("machine=arm");            \
                            \
    builtin_define (arm_arch_name);            \
    if (arm_arch_xscale)                \
      builtin_define ("__XSCALE__");        \
    if (arm_arch_iwmmxt)                \
          {                        \
        builtin_define ("__IWMMXT__");        \
        builtin_define ("__ARM_WMMX");        \
      }                        \
    if (arm_arch_iwmmxt2)                \
      builtin_define ("__IWMMXT2__");        \
    if (TARGET_AAPCS_BASED)                \
      {                        \
        if (arm_pcs_default == ARM_PCS_AAPCS_VFP)    \
          builtin_define ("__ARM_PCS_VFP");        \
        else if (arm_pcs_default == ARM_PCS_AAPCS)    \
          builtin_define ("__ARM_PCS");        \
        builtin_define ("__ARM_EABI__");        \
      }                        \
    if (TARGET_IDIV)                \
      builtin_define ("__ARM_ARCH_EXT_IDIV__");    \
    } while (0)

логика понятна.... я на всякий случай . вдруг еще ченить понадобится :)

Share this post


Link to post
Share on other sites
    if (TARGET_SOFT_FLOAT)                \
      builtin_define ("__SOFTFP__");        \
                            \
    if (TARGET_VFP)                    \
      builtin_define ("__VFP_FP__");        \

логика понятна.... я на всякий случай . вдруг еще ченить понадобится :)

Логика понятна - если есть флажок, то определяем дефайн. Но это не объясняет логику флажков:)

А нет ли какого-либо способа посмотреть весь список встроенных дефайнов?

Share this post


Link to post
Share on other sites
А нет ли какого-либо способа посмотреть весь список встроенных дефайнов?

Нашёл:)

$(CC) -dM -E - < /dev/null

Share this post


Link to post
Share on other sites

Я предпочитаю как-то так

echo "#include <avr/io.h>" | avr-gcc -E -dM -mmcu=atmega8 - | sort | less

:-)

Share this post


Link to post
Share on other sites

А я создал в makefile цель

defines:
    $(CC) $(CFLAGS) -dM -E - < /dev/null | sort

Она вываливает в консоль все дефайны: и мои, и встроенные.

(У gcc для arm нет такого универсального инклюда как avr/io.h :) )

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this