Spec-Zone.ru › GCC 14

3.19.6 Параметры AVR

Эти параметры определены для реализаций AVR:

-mmcu=mcu

Задаёт архитектуру набора команд (ISA) AVR или тип целевого устройства. По умолчанию для этого параметра используется avr2.

Поддерживаются следующие устройства и ISA AVR. Примечание: полная поддержка устройства состоит из кода запуска crtmcu.o, заголовочного файла устройства avr/io*.h, библиотеки устройства libmcu.a и файла device-specs specs-mcu. Компилятор предоставляет только последний в соответствии с поддерживаемыми ниже mcu. Остальное поддерживается библиотекой AVR-LibC либо с помощью файлов atpack от производителя оборудования.

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, ata5795, 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, ata5790, ata5790n, ata5791, ata6613c, ata6614q, ata5782, ata5831, ata8210, ata8510, ata5787, ata5835, ata5700m322, 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, avr64da28, avr64da28s, avr64da32, avr64da32s, avr64da48, avr64da48s, avr64da64, avr64da64s, avr64db28, avr64db32, avr64db48, avr64db64, avr64dd14, avr64dd20, avr64dd28, avr64dd32, avr64du28, avr64du32, avr64ea28, avr64ea32, avr64ea48, avr64sd28, avr64sd32, avr64sd48.

avrxmega3

Устройства «XMEGA» с объёмом объединённой памяти программ и ОЗУ до 64 КиБ, в которых память программ отображается в адресное пространство ОЗУ. mcu = attiny202, attiny204, attiny212, attiny214, attiny402, attiny404, attiny406, attiny412, attiny414, attiny416, attiny416auto, attiny417, attiny424, attiny426, attiny427, attiny804, attiny806, attiny807, attiny814, attiny816, attiny817, attiny824, attiny826, attiny827, attiny1604, attiny1606, attiny1607, attiny1614, attiny1616, attiny1617, attiny1624, attiny1626, attiny1627, attiny3214, attiny3216, attiny3217, attiny3224, attiny3226, attiny3227, atmega808, atmega809, atmega1608, atmega1609, atmega3208, atmega3209, atmega4808, atmega4809, avr16dd14, avr16dd20, avr16dd28, avr16dd32, avr16du14, avr16du20, avr16du28, avr16du32, avr16ea28, avr16ea32, avr16ea48, avr16eb14, avr16eb20, avr16eb28, avr16eb32, avr16la14, avr16la20, avr16la28, avr16la32, avr32da28, avr32da28s, avr32da32, avr32da32s, avr32da48, avr32da48s, avr32db28, avr32db32, avr32db48, avr32dd14, avr32dd20, avr32dd28, avr32dd32, avr32du14, avr32du20, avr32du28, avr32du32, avr32ea28, avr32ea32, avr32ea48, avr32eb14, avr32eb20, avr32eb28, avr32eb32, avr32la14, avr32la20, avr32la28, avr32la32, avr32sd20, avr32sd28, avr32sd32.

avrxmega4

Устройства «XMEGA» с объёмом памяти программ более 64 КиБ и до 128 КиБ. mcu = atxmega64a3, atxmega64a3u, atxmega64a4u, atxmega64b1, atxmega64b3, atxmega64c3, atxmega64d3, atxmega64d4, avr128da28, avr128da28s, avr128da32, avr128da32s, avr128da48, avr128da48s, avr128da64, avr128da64s, avr128db28, avr128db32, avr128db48, avr128db64.

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 «Reduced Tiny» всего с 16 регистрами общего назначения и объёмом памяти программ от 512 Б до 4 КиБ. mcu = attiny4, attiny5, attiny9, attiny10, attiny102, attiny104, 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

Прологи и эпилоги функций разворачиваются в вызовы соответствующих подпрограмм. Размер кода при этом уменьшается.

-mfuse-add
-mno-fuse-add
-mfuse-add=level

Оптимизировать косвенные обращения к памяти на устройствах с сокращённым ядром Tiny. По умолчанию используется level=1 для оптимизаций -Og и -O1, и level=2 для более высоких уровней оптимизации. Допустимые значения для level: 0, 1 и 2.

-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. Активируется по умолчанию, если включена оптимизация.

-mno-interrupts

Сгенерированный код несовместим с аппаратными прерываниями. Размер кода меньше.

-mrelax

Пытаться заменить инструкцию CALL или JMP более короткой инструкцией RCALL или RJMP соответственно, если это применимо. Указание -mrelax просто добавляет параметр --mlink-relax в командную строку ассемблера и параметр --relax в командную строку компоновщика.

Релаксация переходов (jump relaxing) выполняется компоновщиком, так как смещения переходов неизвестны до размещения кода. Следовательно, сгенерированный компилятором код ассемблера остаётся тем же, но инструкции в исполняемом файле могут отличаться от инструкций в коде ассемблера.

Релаксация должна быть включена, если требуются заглушки (stubs) компоновщика; см. раздел о EIND и заглушках компоновщика ниже.

-mrodata-in-ram
-mno-rodata-in-ram

Размещать секции .rodata для данных только для чтения в ОЗУ или в памяти программ соответственно. Для большинства устройств выбора нет, и этот параметр действует скорее как утверждение (assertion).

Начиная с версии 14 и для устройств AVR64* и AVR128*, секция .rodata по умолчанию размещается во флеш-памяти при условии наличия необходимой поддержки в GNU Binutils (PR31124). В этом случае можно использовать -mrodata-in-ram для возврата к прежней схеме размещения с .rodata в ОЗУ.

-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 больше нет необходимости.

Этот параметр также может служить заменой прежнего способа указания пользовательских файлов device-specs, при котором требовалось, чтобы -B some-path указывал на каталог, содержащий папку с именем device-specs, в которой находится файл specs с именем specs-mcu, где mcu задавался с помощью -mmcu=mcu.

-Waddr-space-convert

Предупреждать о преобразованиях между адресными пространствами в случае, если результирующее адресное пространство не содержится во входном адресном пространстве.

-Wmisspelled-isr

Предупреждать о некорректном написании ISR, т. е. без префикса __vector. Включено по умолчанию.

  • EIND и устройства с более чем 128 КиБ флеш-памяти
  • Обработка специальных функциональных регистров RAMPD, RAMPX, RAMPY и RAMPZ
  • Встроенные макросы AVR
  • Внутренние параметры AVR

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

Указатели в этой реализации имеют ширину 16 бит. Адрес функции или метки представлен как пословный адрес, поэтому косвенные переходы и вызовы могут обращаться к любому адресу кода в диапазоне 64 Ки слов.

Чтобы облегчить косвенные переходы на устройствах с объёмом памяти программ более 128 КиБ, существует специальный функциональный регистр EIND, который служит старшей частью целевого адреса при использовании инструкций EICALL или EIJMP.

Косвенные переходы и вызовы на таких устройствах обрабатываются компилятором следующим образом и имеют некоторые ограничения:

  • Компилятор никогда не устанавливает EIND.
  • Компилятор использует EIND неявно в инструкциях EICALL/EIJMP или может считывать EIND напрямую для эмуляции косвенного вызова/перехода с помощью инструкции RET.
  • Компилятор предполагает, что EIND никогда не изменяется во время выполнения кода запуска или работы приложения. В частности, EIND не сохраняется и не восстанавливается в прологе/эпилоге функции или обработчика прерывания.
  • Для косвенных вызовов функций и вычисляемого goto (computed goto) компоновщик генерирует заглушки (stubs). Заглушки — это промежуточные площадки для перехода, иногда также называемые трамплинами (trampolines). Таким образом, косвенный вызов/переход выполняет переход к такой заглушке. Заглушка содержит прямой переход по желаемому адресу.
  • Релаксация компоновщика должна быть включена, чтобы компоновщик корректно генерировал заглушки во всех ситуациях. См. параметр компилятора -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 для меток кода в следующих ситуациях:
    • Взятие адреса функции или метки кода.
    • Вычисляемый goto (computed 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 нулём.
  • Если используется именованное адресное пространство, отличное от generic или __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_ADIW__

Устройство поддерживает инструкции ADIW и SBIW.

__AVR_HAVE_ELPM__

Устройство поддерживает инструкцию ELPM.

__AVR_HAVE_ELPMX__

Устройство поддерживает инструкции ELPM Rn,Z и ELPM Rn,Z+.

__AVR_HAVE_LPMX__

Устройство поддерживает инструкции LPM Rn,Z и LPM Rn,Z+.

__AVR_HAVE_MOVW__

Устройство поддерживает инструкцию MOVW для выполнения 16-битных перемещений между регистрами.

__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_*.

__AVR_HAVE_FLMAP__

Этот макрос определен при выполнении следующих условий:

  • Устройство имеет битовое поле NVMCTRL_CTRLB.FLMAP. Это относится к устройствам AVR64* и AVR128*.
  • На этапе ассемблирования неизвестно, какая эмуляция будет использоваться.

Это подразумевает, что компилятор был сконфигурирован с GNU Binutils, реализующими PR31124.

__AVR_RODATA_IN_RAM__

Этот макрос не определен, когда код компилируется для архитектуры ядра.

Когда код компилируется для устройства, макрос определяется равным 1, если секции .rodata для данных только для чтения расположены в ОЗУ, и равным 0 в противном случае.

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

__WITH_LIBF7_LIBGCC__
__WITH_LIBF7_MATH__
__WITH_LIBF7_MATH_SYMBOLS__

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

3.19.6.4 Внутренние параметры AVR

Следующие параметры используются внутри компилятора и для взаимодействия между файлами specs устройств и непосредственно компилятором. Устанавливать эти параметры вручную не требуется, в частности, они не являются параметрами оптимизации. Неправильное использование этих параметров может привести к неоптимальному или некорректному коду. Они описаны здесь для полноты документации, а также для лучшего понимания файлов specs устройств.

-mn-flash=num

Предполагать, что объем флеш-памяти равен num раз по 64 КиБ. Это определяет, какие адресные пространства __flashN доступны.

-mflmap

Устройство содержит битовое поле FLMAP, расположенное в регистре специальных функций NVMCTRL_CTRLB.

-mrmw

Предполагать, что устройство поддерживает инструкции типа «чтение-модификация-запись» XCH, LAC, LAS и LAT.

-mshort-calls

Предполагать, что RJMP и RCALL могут адресовать всю память программ. Этот параметр используется для генерации и выбора multilib для устройств архитектуры avrxmega3.

-mskip-bug

Генерировать код без пропусков (CPSE, SBRS, SBRC, SBIS, SBIC) через 32-битные инструкции.

-msp8

Обрабатывать регистр указателя стека как 8-битный регистр, то есть предполагать, что старший байт указателя стека равен нулю. Этот параметр используется компилятором для выбора и сборки библиотек multilib для архитектур avr2 и avr25. В этих архитектурах смешаны устройства с наличием и отсутствием SPH.

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

Spec-Zone.ru

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