AHTOXA 18 29 ноября, 2012 Опубликовано 29 ноября, 2012 · Жалоба Всем привет. Хочу в тексте программы для Cortex-M3/M4/M4F определять, как она компилируется - с аппаратной плавучкой или с программной. M3 от M4 я отличить могу - есть дефайны __ARM_ARCH_7M__ для M3 и __ARM_ARCH_7EM__ для M4. А вот как отличить вариант с "-mfpu=fpv4-sp-d16 -mfloat-abi=hard" и без? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Petka 0 29 ноября, 2012 Опубликовано 29 ноября, 2012 · Жалоба Всем привет. ... А вот как отличить вариант с "-mfpu=fpv4-sp-d16 -mfloat-abi=hard" и без? гляньте на: __ARM_PCS_VFP __ARM_PCS __SOFTFP__ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ek74 0 29 ноября, 2012 Опубликовано 29 ноября, 2012 · Жалоба #if defined (__VFP_FP__) && !defined(__SOFTFP__) // Используем аппаратную плавучку #else // Используем софтовую плавучку #endif Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 29 ноября, 2012 Опубликовано 29 ноября, 2012 · Жалоба Спасибо, то что надо. Пробовал три варианта: -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mcpu=cortex-m4 -mcpu=cortex-m3 __VFP_FP__ - определён в любом случае:) __ARM_PCS_VFP - определён только в первом варианте, __ARM_PCS и __SOFTFP__ определёны в вариантах 2 и 3. Думаю остановиться на __ARM_PCS_VFP. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 1 декабря, 2012 Опубликовано 1 декабря, 2012 · Жалоба Оказывается, __ARM_PCS_VFP не совсем подходит. Дело в том, вариантов всего не три, а четыре: -mcpu=cortex-m3 -mcpu=cortex-m4 -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp Как я понял, червёртый вариант тоже использует сопроцессор, и отличается от -mfloat-abi=hard соглашениями о вызовах. Вот что определено для каждого из этих вариантов: __SOFTFP__, __ARM_PCS __SOFTFP__, __ARM_PCS __ARM_PCS_VFP __ARM_PCS Таким образом, чтобы определить вариант с использованием сопроцессора нужна следующая конструкция: #if (!defined __SOFTFP__) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 1 декабря, 2012 Опубликовано 1 декабря, 2012 · Жалоба вставлю свои 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) логика понятна.... я на всякий случай . вдруг еще ченить понадобится :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 1 декабря, 2012 Опубликовано 1 декабря, 2012 · Жалоба if (TARGET_SOFT_FLOAT) \ builtin_define ("__SOFTFP__"); \ \ if (TARGET_VFP) \ builtin_define ("__VFP_FP__"); \ логика понятна.... я на всякий случай . вдруг еще ченить понадобится :) Логика понятна - если есть флажок, то определяем дефайн. Но это не объясняет логику флажков:) А нет ли какого-либо способа посмотреть весь список встроенных дефайнов? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 2 декабря, 2012 Опубликовано 2 декабря, 2012 · Жалоба А нет ли какого-либо способа посмотреть весь список встроенных дефайнов? Нашёл:) $(CC) -dM -E - < /dev/null Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 3 декабря, 2012 Опубликовано 3 декабря, 2012 · Жалоба Я предпочитаю как-то так echo "#include <avr/io.h>" | avr-gcc -E -dM -mmcu=atmega8 - | sort | less :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 4 декабря, 2012 Опубликовано 4 декабря, 2012 · Жалоба Я предпочитаю как-то такСупер! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 4 декабря, 2012 Опубликовано 4 декабря, 2012 · Жалоба А я создал в makefile цель defines: $(CC) $(CFLAGS) -dM -E - < /dev/null | sort Она вываливает в консоль все дефайны: и мои, и встроенные. (У gcc для arm нет такого универсального инклюда как avr/io.h :) ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться