3.19.6 AVR Options ¶
Эти параметры определены для реализаций AVR:
-mmcu=mcu-
Укажите архитектуры набора команд Atmel AVR (ISA) или тип микроконтроллера.
По умолчанию для этого параметра установлено значение ‘avr2’.
GCC поддерживает следующие устройства и ISA AVR:
avr2-
«Классические» устройства с объемом памяти программ до 8 Кбайт. mcu =
attiny22,attiny26,at90s2313,at90s2323,at90s2333,at90s2343,at90s4414,at90s4433,at90s4434,at90c8534,at90s8515,at90s8535. avr25-
«Классические» устройства с объемом памяти программ до 8 Кбайт и с инструкцией
MOVW. mcu =attiny13,attiny13a,attiny24,attiny24a,attiny25,attiny261,attiny261a,attiny2313,attiny2313a,attiny43u,attiny44,attiny44a,attiny45,attiny48,attiny441,attiny461,attiny461a,attiny4313,attiny84,attiny84a,attiny85,attiny87,attiny88,attiny828,attiny841,attiny861,attiny861a,ata5272,ata6616c,at86rf401. avr3-
«Классические» устройства с объемом памяти программ от 16 Кбайт до 64 Кбайт. mcu =
at76c711,at43usb355. avr31-
«Классические» устройства с объемом памяти программ 128 Кбайт. mcu =
atmega103,at43usb320. avr35-
«Классические» устройства с объемом памяти программ от 16 Кбайт до 64 Кбайт и с инструкцией
MOVW. mcu =attiny167,attiny1634,atmega8u2,atmega16u2,atmega32u2,ata5505,ata6617c,ata664251,at90usb82,at90usb162. avr4-
«Улучшенные» устройства с объемом памяти программ до 8 Кбайт. mcu =
atmega48,atmega48a,atmega48p,atmega48pa,atmega48pb,atmega8,atmega8a,atmega8hva,atmega88,atmega88a,atmega88p,atmega88pa,atmega88pb,atmega8515,atmega8535,ata6285,ata6286,ata6289,ata6612c,at90pwm1,at90pwm2,at90pwm2b,at90pwm3,at90pwm3b,at90pwm81. avr5-
«Улучшенные» устройства с объемом памяти программ от 16 Кбайт до 64 Кбайт. mcu =
atmega16,atmega16a,atmega16hva,atmega16hva2,atmega16hvb,atmega16hvbrevb,atmega16m1,atmega16u4,atmega161,atmega162,atmega163,atmega164a,atmega164p,atmega164pa,atmega165,atmega165a,atmega165p,atmega165pa,atmega168,atmega168a,atmega168p,atmega168pa,atmega168pb,atmega169,atmega169a,atmega169p,atmega169pa,atmega32,atmega32a,atmega32c1,atmega32hvb,atmega32hvbrevb,atmega32m1,atmega32u4,atmega32u6,atmega323,atmega324a,atmega324p,atmega324pa,atmega325,atmega325a,atmega325p,atmega325pa,atmega328,atmega328p,atmega328pb,atmega329,atmega329a,atmega329p,atmega329pa,atmega3250,atmega3250a,atmega3250p,atmega3250pa,atmega3290,atmega3290a,atmega3290p,atmega3290pa,atmega406,atmega64,atmega64a,atmega64c1,atmega64hve,atmega64hve2,atmega64m1,atmega64rfr2,atmega640,atmega644,atmega644a,atmega644p,atmega644pa,atmega644rfr2,atmega645,atmega645a,atmega645p,atmega649,atmega649a,atmega649p,atmega6450,atmega6450a,atmega6450p,atmega6490,atmega6490a,atmega6490p,ata5795,ata5790,ata5790n,ata5791,ata6613c,ata6614q,ata5782,ata5831,ata8210,ata8510,ata5702m322,at90pwm161,at90pwm216,at90pwm316,at90can32,at90can64,at90scr100,at90usb646,at90usb647,at94k,m3000. avr51-
«Улучшенные» устройства с объёмом памяти программ 128 Кбайт. mcu =
atmega128,atmega128a,atmega128rfa1,atmega128rfr2,atmega1280,atmega1281,atmega1284,atmega1284p,atmega1284rfr2,at90can128,at90usb1286,at90usb1287. avr6-
«Улучшенные» устройства с 3-байтовым PC, т.е. с объемом памяти программ более 128 Кбайт. mcu =
atmega256rfr2,atmega2560,atmega2561,atmega2564rfr2. avrxmega2-
Устройства «XMEGA» с объемом памяти программ более 8 Кбайт и до 64 Кбайт. mcu =
atxmega8e5,atxmega16a4,atxmega16a4u,atxmega16c4,atxmega16d4,atxmega16e5,atxmega32a4,atxmega32a4u,atxmega32c3,atxmega32c4,atxmega32d3,atxmega32d4,atxmega32e5. avrxmega3-
Устройства «XMEGA» с объемом объединённой памяти программ и ОЗУ до 64 Кбайт и с памятью программы, видимой в адресном пространстве ОЗУ. mcu =
attiny202,attiny204,attiny212,attiny214,attiny402,attiny404,attiny406,attiny412,attiny414,attiny416,attiny417,attiny804,attiny806,attiny807,attiny814,attiny816,attiny817,attiny1604,attiny1606,attiny1607,attiny1614,attiny1616,attiny1617,attiny3214,attiny3216,attiny3217,atmega808,atmega809,atmega1608,atmega1609,atmega3208,atmega3209,atmega4808,atmega4809. avrxmega4-
Устройства «XMEGA» с объемом памяти программ более 64 Кбайт и до 128 Кбайт. mcu =
atxmega64a3,atxmega64a3u,atxmega64a4u,atxmega64b1,atxmega64b3,atxmega64c3,atxmega64d3,atxmega64d4. avrxmega5-
Устройства «XMEGA» с объемом памяти программ более 64 Кбайт и до 128 Кбайт и ОЗУ более 64 Кбайт. mcu =
atxmega64a1,atxmega64a1u. avrxmega6-
Устройства «XMEGA» с объёмом памяти программ более 128 Кбайт. mcu =
atxmega128a3,atxmega128a3u,atxmega128b1,atxmega128b3,atxmega128c3,atxmega128d3,atxmega128d4,atxmega192a3,atxmega192a3u,atxmega192c3,atxmega192d3,atxmega256a3,atxmega256a3b,atxmega256a3bu,atxmega256a3u,atxmega256c3,atxmega256d3,atxmega384c3,atxmega384d3. avrxmega7-
Устройства «XMEGA» с объемом памяти программ более 128 Кбайт и ОЗУ более 64 Кбайт. mcu =
atxmega128a1,atxmega128a1u,atxmega128a4u. avrtiny-
Устройства «TINY» ядра Tiny с объемом памяти программ от 512 байт до 4 Кбайт. mcu =
attiny4,attiny5,attiny9,attiny10,attiny20,attiny40. avr1-
Эта ISA реализуется минимальным ядром AVR и поддерживается только для ассемблера. mcu =
attiny11,attiny12,attiny15,attiny28,at90s1200.
-mabsdata-
Предполагается, что к данным в статическом хранилище можно получить доступ с помощью инструкций LDS / STS. Этот параметр действует только на уменьшенные устройства Tiny, такие как ATtiny40. См. также
absdataатрибут переменной. -maccumulate-args-
Накапливать аргументы исходящих функций и получать/освобождать необходимое пространство стека для исходящих аргументов функций один раз в предложении/эпилоге функции. Без этого параметра исходящие аргументы помещаются в стек перед вызовом функции и извлекаются из стека после этого.
Извлечение аргументов после вызова функции может быть дорогостоящим на AVR, поэтому накопление пространства стека может привести к уменьшению исполняемых файлов, поскольку аргументы не нужно удалять из стека после такого вызова функции.
Этот параметр может привести к сокращению размера кода для функций, которые выполняют несколько вызовов функций, получающих свои аргументы в стеке, таких как вызовы функций, подобных printf.
-mbranch-cost=cost-
Установите стоимость ветвления для инструкций условного ветвления в cost. Разумные значения для cost — это небольшие неотрицательные целые числа. Стоимость ветвления по умолчанию — 0.
-mcall-prologues-
Предложения/эпилоги функций расширяются как вызовы соответствующих подпрограмм. Размер кода меньше.
-mdouble=bits-mlong-double=bits-
Установите размер (в битах) типа
doubleилиlong doubleсоответственно. Возможные значения для bits — 32 и 64. Разрешение конкретного значения для bits зависит от--with-double=и--with-long-double=параметров конфигурации, и то же самое относится к значениям параметров по умолчанию. -mgas-isr-prologues-
Подпрограммы обработки прерываний (ISR) могут использовать псевдоинструкцию
__gcc_isr, поддерживаемую GNU Binutils. Если этот параметр включен, функция по-прежнему может быть отключена для отдельных ISR с помощью атрибута функцииno_gccisr. Эта функция активируется по умолчанию, если оптимизация включена (но не с -Og, см. Параметры, управляющие оптимизацией), и если GNU Binutils поддерживает PR21683. -mint8
-
Предполагается, что
intявляется 8-битным целым числом. Это влияет на размеры всех типов:charсоставляет 1 байт,intсоставляет 1 байт,longсоставляет 2 байта, аlong longсоставляет 4 байта. Обратите внимание, что этот параметр не соответствует стандартам C, но приводит к меньшему размеру кода. -mmain-is-OS_task-
Не сохранять регистры в
main. Эффект аналогичен добавлению атрибутаOS_taskкmain. Он активируется по умолчанию, если включена оптимизация. -mn-flash=num-
Предполагается, что объем памяти Flash составляет num умноженное на 64 КБ.
-mno-interrupts-
Сгенерированный код несовместим с аппаратными прерываниями. Размер кода меньше.
-mrelax-
По возможности, заменить
CALLсоответственноJMPинструкцией более короткойRCALLсоответственноRJMPинструкцией. Установка -mrelax просто добавляет параметр --mlink-relax в командную строку ассемблера и параметр --relax в командную строку компоновщика.Расслабление переходов выполняется компоновщиком, поскольку смещения переходов неизвестны до размещения кода. Поэтому, код ассемблера, сгенерированный компилятором, остается неизменным, но инструкции в исполняемом файле могут отличаться от инструкций в коде ассемблера.
Расслабление необходимо включать, если нужны отладочные участки компоновщика, см. раздел о
EINDи отладочных участках компоновщика ниже. -mrmw-
Предполагается, что устройство поддерживает инструкции «Чтение-Модификация-Запись»
XCH,LAC,LASиLAT. -mshort-calls-
Предполагается, что
RJMPиRCALLмогут охватывать всю память программы.Этот параметр используется внутренне для выбора многокомпиляционных библиотек. Это не параметр оптимизации, и вам не нужно его устанавливать вручную.
-msp8-
Обрабатывать регистр указателя стека как 8-битный регистр, т.е. предполагать, что старший байт указателя стека равен нулю. В целом, вам не нужно устанавливать этот параметр вручную.
Этот параметр используется компилятором для выбора и сборки многокомпиляционных библиотек для архитектур
avr2иavr25. Эти архитектуры смешивают устройства с поддержкой и без поддержкиSPH. Для любого значения, кроме -mmcu=avr2 или -mmcu=avr25, драйвер компилятора добавляет или удаляет этот параметр в командной строке собственно компилятора, потому что компилятор знает, имеет ли устройство или архитектура 8-битный указатель стека и, следовательно, регистрSPHили нет. -mstrict-X-
Использовать регистр адреса
Xтаким образом, как это предложено аппаратным обеспечением. Это означает, чтоXиспользуется только в косвенной, пост-инкрементной или пре-декрементной адресации.Без этого параметра регистр
Xможет использоваться так же, какYилиZ, которые затем эмулируются дополнительными инструкциями. Например, загрузка значения с помощью адресацииX+constс небольшим неотрицательнымconst < 64в регистр Rn выполняется какadiw r26, const ; X += const ld Rn, X ; Rn = *X sbiw r26, const ; X -= const
-mtiny-stack-
Изменить только младшие 8 битов указателя стека.
-mfract-convert-truncate-
Разрешить использовать усечение вместо округления к нулю для дробных типов с фиксированной точкой.
-nodevicelib-
Не связывать с устройственно-специфической библиотекой AVR-LibC
lib<mcu>.a. -nodevicespecs-
Не добавлять -specs=device-specs/specs-mcu в командную строку драйвера компилятора. Пользователь несет ответственность за предоставление подпроцессам (например, собственному компилятору, ассемблеру и компоновщику) соответствующих параметров командной строки. Это означает, что пользователь должен предоставить свой собственный файл спецификаций устройства с помощью -specs=путь-к-файлу-спецификаций. Больше нет необходимости в параметре -mmcu=mcu.
Этот параметр также может служить заменой старому способу указания пользовательских файлов спецификаций устройства, который требовал -B некоторый-путь для указания каталога, содержащего папку
device-specs, которая содержит файл спецификацийspecs-mcu, где mcu указывался параметром -mmcu=mcu. -Waddr-space-convert-
Выводить предупреждение о преобразованиях между адресными пространствами в случае, если результирующее адресное пространство не содержится в исходном адресном пространстве.
-Wmisspelled-isr-
Выводить предупреждение, если ISR имеет ошибку написания, т. е. без префикса __vector. Включено по умолчанию.
EINDи устройства с более чем 128 КБ Flash- Обработка
RAMPD,RAMPX,RAMPYиRAMPZспециальных регистров функций - Встроенные макросы AVR
3.19.6.1 EIND и устройства с более чем 128 КБ Flash памяти ¶
Указатели в реализации имеют ширину 16 бит. Адрес функции или метки представлен как адрес слова, чтобы косвенные переходы и вызовы могли обращаться к любому адресу кода в диапазоне 64 К слов.
Для облегчения косвенных переходов на устройствах с более чем 128 КБ адресного пространства программы существует специальный регистр функции EIND, который служит старшей частью целевого адреса при использовании инструкций EICALL или EIJMP.
Косвенные переходы и вызовы на этих устройствах обрабатываются компилятором следующим образом и подчиняются некоторым ограничениям:
- Компилятор никогда не устанавливает
EIND. - Компилятор использует
EINDнеявно в инструкцияхEICALL/EIJMPили может напрямую считыватьEINDдля эмуляции косвенного вызова/перехода посредством инструкцииRET. - Компилятор предполагает, что
EINDникогда не изменяется во время кода загрузки или во время приложения. В частности,EINDне сохраняется/восстанавливается в преамбуле/эпилоге функции или обработчика прерываний. - Для косвенных вызовов функций и вычисления переходов компоновщик генерирует заглушки. Заглушки иногда также называются трамплинами. Таким образом, косвенный вызов/переход переходит к такой заглушке. Заглушка содержит прямой переход по нужному адресу.
- Необходимо включить расслабление компоновщика, чтобы компоновщик правильно генерировал заглушки во всех ситуациях. См. параметр компилятора -mrelax и параметр компоновщика --relax. В некоторых особых случаях компоновщик должен генерировать заглушки, но прерывается без расслабления и без полезного сообщения об ошибке.
- Файл скрипта компоновщика по умолчанию организован для кода с
EIND = 0. Если код должен работать с настройкамиEIND != 0, необходимо использовать пользовательский файл скрипта компоновщика для размещения секций, имена которых начинаются с.trampolines, в сегменте, к которому указываетEIND. - Код загрузки из libgcc никогда не устанавливает
EIND. Обратите внимание, что код загрузки представляет собой комбинацию кода из libgcc и AVR-LibC. Для влияния AVR-LibC наEIND, см. справочник по AVR-LibC. - Пользовательский код загрузки может законно установить
EINDна ранней стадии, например, с помощью кода инициализации, расположенного в секции.init3. Такой код выполняется до общего кода загрузки, который инициализирует ОЗУ и вызывает конструкторы, но после фрагмента кода загрузки из AVR-LibC, который устанавливаетEINDв сегмент, где находится таблица векторов.#include <avr/io.h> static void __attribute__((section(".init3"),naked,used,no_instrument_function)) init3_set_eind (void) { __asm volatile ("ldi r24,pm_hh8(__trampolines_start)\n\t" "out %i0,r24" :: "n" (&EIND) : "r24","memory"); }Символ
__trampolines_startопределен в файле скрипта компоновщика. - Заглушки генерируются автоматически компоновщиком, если выполнены следующие два условия:
- Адрес метки берется с помощью модификатора
gs(сокращенно от сгенерировать заглушки), например:LDI r24, lo8(gs(func)) LDI r25, hi8(gs(func))
- Конечное расположение этой метки находится в сегменте кода вне сегмента, где находятся заглушки.
- Адрес метки берется с помощью модификатора
- Компилятор генерирует такие модификаторы
gsдля меток кода в следующих ситуациях:- Получение адреса функции или метки кода.
- Вычисление переходов.
- Если используется функция предварительного сохранения, см. параметр командной строки -mcall-prologues.
- Таблицы переходов switch/case. Если вы не хотите такие таблицы переходов, вы можете указать параметр командной строки -fno-jump-tables.
- Конструкторы/деструкторы C и C++, вызываемые во время загрузки/выгрузки.
- Если инструменты столкнутся с модификатором
gs()(описанном выше).
- Переход к несимвольному адресу, например,
int main (void) { /* Call function at word address 0x2 */ return ((int(*)(void)) 0x2)(); }Вместо этого должна быть создана заглушка, т. е. функция должна вызываться через символ (
func_4в примере):int main (void) { extern int func_4 (void); /* Call function at byte address 0x4 */ return func_4(); }и приложение должно быть скомпоновано с -Wl,--defsym,func_4=0x4. В качестве альтернативы,
func_4может быть определено в файле скрипта компоновщика.
3.19.6.2 Обработка специальных регистров функций RAMPD, RAMPX, RAMPY и RAMPZ ¶
Некоторые устройства AVR поддерживают память, превышающую диапазон 64 Кбайт, к которой можно получить доступ с помощью 16-битных указателей. Для доступа к ячейкам памяти за пределами этого диапазона 64 Кбайт используется содержимое регистра RAMP: Регистр адресации X, Y, Z соответственно конкатенируется с регистром специальной функции RAMPX, RAMPY, RAMPZ, чтобы получить расширенный адрес. Аналогично, RAMPD используется совместно с прямой адресацией.
- Код запуска инициализирует регистры специальных функций
RAMPнулём. - Если используется пространство имён, отличное от общего или
__flash, тоRAMPZустанавливается в соответствии с необходимостью перед операцией. - Если устройство поддерживает ОЗУ размером более 64 Кбайт, и компилятору нужно изменить
RAMPZдля выполнения операции, тоRAMPZсбрасывается в ноль после операции. - Если устройство имеет специфический регистр
RAMP, то преамбула/эпилог ISR сохраняет/восстанавливает этот SFR и инициализирует его нулём, в случае если код ISR может (неявным образом) его использовать. - ОЗУ размером более 64 Кбайт не поддерживается GCC для целевых платформ AVR. Если вы используете встроенный ассемблер для чтения из расположений вне 16-битного диапазона адресов и изменяете один из регистров
RAMP, вы должны сбросить его в ноль после доступа.
3.19.6.3 Встроенные макросы AVR ¶
GCC определяет несколько встроенных макросов, чтобы код пользователя мог проверить наличие или отсутствие функций. Почти все следующие встроенные макросы выводятся из возможностей устройства и, таким образом, вызываются опцией командной строки -mmcu=.
Для ещё большего числа встроенных макросов, специфичных для AVR, см. Пространства имён AVR и Встроенные функции AVR.
__AVR_ARCH__-
Встроенный макрос, который отображается в виде десятичного числа, определяющего архитектуру и зависящего от опции -mmcu=mcu. Возможные значения:
2,25,3,31,35,4,5,51,6для mcu=
avr2,avr25,avr3,avr31,avr35,avr4,avr5,avr51,avr6,соответственно и
100,102,103,104,105,106,107для mcu=
avrtiny,avrxmega2,avrxmega3,avrxmega4,avrxmega5,avrxmega6,avrxmega7, соответственно. Если mcu указывает на устройство, этот встроенный макрос устанавливается соответствующим образом. Например, с -mmcu=atmega8 макрос определяется как4. __AVR_Device__-
Установка -mmcu=device определяет этот встроенный макрос, который отражает имя устройства. Например, -mmcu=atmega8 определяет встроенный макрос
__AVR_ATmega8__, -mmcu=attiny261a определяет__AVR_ATtiny261A__, и т.д.Имена встроенных макросов следуют схеме
__AVR_Device__, где Device — имя устройства из руководства пользователя AVR. Разница между Device во встроенном макросе и device в -mmcu=device заключается в том, что последнее всегда в нижнем регистре.Если device не является устройством, а только ядром архитектуры, например «avr51», этот макрос не определяется.
__AVR_DEVICE_NAME__-
Установка -mmcu=device определяет этот встроенный макрос именем устройства. Например, при -mmcu=atmega8 макрос определяется как
atmega8.Если device не является устройством, а только ядром архитектуры, например ‘avr51’, этот макрос не определяется.
__AVR_XMEGA__-
Устройство / архитектура принадлежит семейству устройств XMEGA.
__AVR_HAVE_ELPM__-
Устройство имеет инструкцию
ELPM. __AVR_HAVE_ELPMX__-
Устройство имеет инструкции
ELPM Rn,ZиELPM Rn,Z+. __AVR_HAVE_MOVW__-
Устройство имеет инструкцию
MOVWдля выполнения перемещений регистр-регистр по 16 бит. __AVR_HAVE_LPMX__-
Устройство имеет инструкции
LPM Rn,ZиLPM Rn,Z+. __AVR_HAVE_MUL__-
Устройство имеет аппаратный умножитель.
__AVR_HAVE_JMP_CALL__-
Устройство имеет инструкции
JMPиCALL. Это относится к устройствам с более чем 8 Кбайт программной памяти. __AVR_HAVE_EIJMP_EICALL____AVR_3_BYTE_PC__-
Устройство имеет инструкции
EIJMPиEICALL. Это относится к устройствам с более чем 128 Кбайт программной памяти. Это также означает, что программный счётчик (PC) имеет ширину 3 байта. __AVR_2_BYTE_PC__-
Программный счётчик (PC) имеет ширину 2 байта. Это относится к устройствам с объёмом программной памяти до 128 Кбайт.
__AVR_HAVE_8BIT_SP____AVR_HAVE_16BIT_SP__-
Регистр указателя стека (SP) обрабатывается компилятором как 8-битный, соответственно, 16-битный регистр. Определение этих макросов зависит от опции -mtiny-stack.
__AVR_HAVE_SPH____AVR_SP8__-
Устройство имеет регистр SPH (старшая часть указателя стека) или имеет 8-битный указатель стека, соответственно. Определение этих макросов зависит от -mmcu=, а в случае -mmcu=avr2 и -mmcu=avr25 также от -msp8.
__AVR_HAVE_RAMPD____AVR_HAVE_RAMPX____AVR_HAVE_RAMPY____AVR_HAVE_RAMPZ__-
Устройство имеет регистры
RAMPD,RAMPX,RAMPY,RAMPZсоответственно. __NO_INTERRUPTS__-
Этот макрос отражает опцию командной строки -mno-interrupts.
__AVR_ERRATA_SKIP____AVR_ERRATA_SKIP_JMP_CALL__-
Некоторые устройства AVR (AT90S8515, ATmega103) не должны пропускать 32-битные инструкции из-за аппаратной ошибки. Инструкции пропуска —
SBRS,SBRC,SBIS,SBICиCPSE. Второй макрос определяется только в том случае, если__AVR_HAVE_JMP_CALL__также установлен. __AVR_ISA_RMW__-
Устройство имеет инструкции чтения-модификации-записи (XCH, LAC, LAS и LAT).
__AVR_SFR_OFFSET__=offset-
Инструкции, которые могут напрямую адресовать регистры специальных функций ввода/вывода, такие как
IN,OUT,SBIи т.д., могут использовать другой адрес, как если бы они адресовались инструкцией для доступа к ОЗУ, напримерLDилиSTS. Этот смещение зависит от архитектуры устройства и должен быть вычтен из адреса ОЗУ, чтобы получить соответствующий адрес ввода/вывода. __AVR_SHORT_CALLS__-
Установлена опция командной строки -mshort-calls.
__AVR_PM_BASE_ADDRESS__=addr-
Некоторые устройства поддерживают чтение из флэш-памяти с помощью инструкций
LD*. Флэш-память отображается в адресном пространстве данных со смещением__AVR_PM_BASE_ADDRESS__. Если этот макрос не определён, эта функция недоступна. Если определён, адресное пространство линейное, и нет необходимости помещать.rodataв ОЗУ. Это обрабатывается файлом описания линкера по умолчанию и в настоящее время доступно дляavrtinyиavrxmega3. Ещё удобнее, нет необходимости использовать адресные пространства, такие как__flash, или функции, такие как атрибутprogmemиpgm_read_*. __WITH_AVRLIBC__-
Компилятор настроен для использования с AVR-Libc. См. опцию конфигурации --with-avrlibc.
__HAVE_DOUBLE_MULTILIB__-
Определяется, если -mdouble= действует как опция multilib.
__HAVE_DOUBLE32____HAVE_DOUBLE64__-
Определяется, если компилятор поддерживает 32-битные double соответственно 64-битные double. Фактическое расположение задаётся опцией -mdouble=.
__DEFAULT_DOUBLE__-
Размер в битах
double, если -mdouble= не установлена. Для проверки расположенияdoubleв программе используйте встроенный макрос__SIZEOF_DOUBLE__. __HAVE_LONG_DOUBLE32____HAVE_LONG_DOUBLE64____HAVE_LONG_DOUBLE_MULTILIB____DEFAULT_LONG_DOUBLE__-
То же самое, но для
long doubleвместоdouble. __WITH_DOUBLE_COMPARISON__-
Отражает опцию конфигурации
--with-double-comparison={tristate|bool|libf7}configure option и определяется как2или3. __WITH_LIBF7_LIBGCC____WITH_LIBF7_MATH____WITH_LIBF7_MATH_SYMBOLS__-
Отражает опцию конфигурации
--with-libf7={libgcc|math|math-symbols}configure option.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-10.5.0/gcc/AVR-Options.html