Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: GCC - определить режим компиляции soft/hard fp.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
AHTOXA
Всем привет.
Хочу в тексте программы для Cortex-M3/M4/M4F определять, как она компилируется - с аппаратной плавучкой или с программной.
M3 от M4 я отличить могу - есть дефайны __ARM_ARCH_7M__ для M3 и __ARM_ARCH_7EM__ для M4.
А вот как отличить вариант с "-mfpu=fpv4-sp-d16 -mfloat-abi=hard" и без?
Petka
Цитата(AHTOXA @ Nov 29 2012, 17:22) *
Всем привет.
...
А вот как отличить вариант с "-mfpu=fpv4-sp-d16 -mfloat-abi=hard" и без?

гляньте на:
Код
__ARM_PCS_VFP
__ARM_PCS
__SOFTFP__
ek74
Код
#if defined (__VFP_FP__) && !defined(__SOFTFP__)
   // Используем аппаратную плавучку
#else
  // Используем софтовую плавучку
#endif
AHTOXA
Спасибо, то что надо.
Пробовал три варианта:
  1. -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard
  2. -mcpu=cortex-m4
  3. -mcpu=cortex-m3


__VFP_FP__ - определён в любом случаеsm.gif
__ARM_PCS_VFP - определён только в первом варианте,
__ARM_PCS и __SOFTFP__ определёны в вариантах 2 и 3.

Думаю остановиться на __ARM_PCS_VFP.
AHTOXA
Оказывается, __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__)

klen
вставлю свои 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)

логика понятна.... я на всякий случай . вдруг еще ченить понадобится sm.gif
AHTOXA
Цитата(klen @ Dec 2 2012, 02:40) *
Код
    if (TARGET_SOFT_FLOAT)                \
      builtin_define ("__SOFTFP__");        \
                            \
    if (TARGET_VFP)                    \
      builtin_define ("__VFP_FP__");        \

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

Логика понятна - если есть флажок, то определяем дефайн. Но это не объясняет логику флажковsm.gif
А нет ли какого-либо способа посмотреть весь список встроенных дефайнов?
AHTOXA
Цитата(AHTOXA @ Dec 2 2012, 03:37) *
А нет ли какого-либо способа посмотреть весь список встроенных дефайнов?

Нашёлsm.gif
Код
$(CC) -dM -E - < /dev/null
ReAl
Я предпочитаю как-то так
Код
echo "#include <avr/io.h>" | avr-gcc -E -dM -mmcu=atmega8 - | sort | less

:-)
demiurg_spb
Цитата(ReAl @ Dec 3 2012, 23:30) *
Я предпочитаю как-то так
Супер!
AHTOXA
А я создал в makefile цель
Код
defines:
    $(CC) $(CFLAGS) -dM -E - < /dev/null | sort

Она вываливает в консоль все дефайны: и мои, и встроенные.
(У gcc для arm нет такого универсального инклюда как avr/io.h sm.gif )
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.