Spec-Zone.ru › GCC 12

3.19.6 Параметры AVR

Для реализаций AVR определены следующие параметры:

-mmcu=mcu

Указать архитектуру набора команд Atmel AVR (ISA) или тип микроконтроллера.

Значение этого параметра по умолчанию — ‘avr2’.

GCC поддерживает следующие устройства AVR и ISA:

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, atmega324pb, 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

Предполагать, что размер флэш-памяти составляет 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. Включено по умолчанию.

3.19.6.1 EIND и устройства с более чем 128 КиБ флэш-памяти

Указатели в реализации имеют ширину 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 (сокращение от generate stubs — «генерировать заглушки»), например:
      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, пролог/эпилог обработчика прерывания сохраняет и восстанавливает этот регистр SFR и инициализирует его нулём, если код обработчика прерывания может неявно его использовать.
  • GCC не поддерживает ОЗУ объёмом более 64 КиБ для целей 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= действует как опция многократной компиляции.

__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 и определена как 2 или 3.

__WITH_LIBF7_LIBGCC__
__WITH_LIBF7_MATH__
__WITH_LIBF7_MATH_SYMBOLS__

Отражает опцию конфигурации --with-libf7={libgcc|math|math-symbols} параметр configure.

Следующая: Опции Blackfin, Предыдущая: Опции ARM, Вверх: Опции подмодели [Оглавление][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/AVR-Options.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API