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 core с программой памяти от 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-
Предполагается, что размер памяти флэш-памяти составляет num раз по 64 КБ.
-mno-interrupts-
Сгенерированный код не совместим с аппаратными прерываниями. Размер кода меньше.
-mrelax-
Попытаться заменить
CALLиJMPинструкциейRCALLиRJMPсоответственно, если это возможно. Установка параметра -mrelax просто добавляет параметр --mlink-relax в командную строку ассемблера и параметр --relax в командную строку линкера.Расслабление переходов выполняется линком, поскольку смещения переходов неизвестны до размещения кода. Поэтому код ассемблера, сгенерированный компилятором, остается неизменным, но инструкции в исполняемом файле могут отличаться от инструкций в коде ассемблера.
Расслабление должно быть включено, если нужны заглушки линкера, см. раздел о
EINDи заглушках линкера ниже. -mrmw-
Предполагается, что устройство поддерживает инструкции Read-Modify-Write
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=path-to-specs-file. Больше нет необходимости в параметре -mmcu=mcu.
Этот параметр также может служить заменой более старому способу задания пользовательских файлов спецификаций устройств, который требовал -B some-path для указания директории, содержащей папку с именем
device-specs, которая содержит файл спецификаций с именемspecs-mcu, где mcu указывался с помощью -mmcu=mcu. -Waddr-space-convert-
Выводить предупреждение о преобразованиях между адресными пространствами в случае, если результирующее адресное пространство не содержится в исходном адресном пространстве.
-Wmisspelled-isr-
Предупреждать о неправильном написании ISR (т.е. без префикса __vector). Включено по умолчанию.
EINDи устройства с более чем 128 Кбайт флэш-памяти- Обработка
RAMPD,RAMPX,RAMPYиRAMPZспециальных регистров - Встроенные макросы AVR
3.19.6.1 EIND и устройства с более чем 128 Кбайт флэш-памяти ¶
Указатели в реализации имеют ширину 16 бит. Адрес функции или метки представлен как адрес слова, чтобы косвенные переходы и вызовы могли обращаться к любому адресу кода в диапазоне 64 К слов.
Для облегчения косвенных переходов на устройствах с более чем 128 Кбайт памяти программы существует специальный регистр EIND, который служит старшей частью целевого адреса при использовании инструкций EICALL или EIJMP.
Косвенные переходы и вызовы на этих устройствах обрабатываются компилятором следующим образом и имеют некоторые ограничения:
- Компилятор никогда не устанавливает
EIND. - Компилятор использует
EINDнеявно в инструкцияхEICALL/EIJMPили может читатьEINDнапрямую, чтобы эмулировать косвенный вызов/переход с помощью инструкцииRET. - Компилятор предполагает, что
EINDникогда не меняется во время кода запуска или во время работы приложения. В частности,EINDне сохраняется/восстанавливается в преамбуле/эпилоге функции или обработчика прерывания. - Для косвенных вызовов функций и вычислений goto линкер генерирует заглушки. Заглушки иногда также называются трамплинами. Таким образом, косвенный вызов/переход переходит к такой заглушке. Заглушка содержит прямой переход к нужному адресу.
- Необходимо включить расслабление линкера, чтобы линкер генерировал заглушки корректно во всех ситуациях. См. параметр компилятора -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для меток кода в следующих ситуациях:- Получение адреса функции или метки кода.
- Вычисление goto.
- Если используется функция с предварительным сохранением, см. параметр командной строки -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, пролог/эпилог обработчика прерываний сохраняет/восстанавливает этот регистр специальных функций и инициализирует его нулём, в случае если код обработчика прерываний может (неявным образом) его использовать. - ОЗУ размером более 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-битные двойные, соответственно 64-битные двойные. Фактическое расположение задаётся опцией -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-11.4.0/gcc/AVR-Options.html