Spec-Zone.ru › GCC 15

3.20.6 Параметры AVR

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

-mmcu=mcu

Задает архитектуру набора команд AVR (ISA) или тип устройства. Значение этого параметра по умолчанию — 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

«Усовершенствованные» устройства с трехбайтовым счетчиком команд (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. Этот параметр влияет только на устройства Reduced Tiny, например ATtiny40. См. также атрибут переменной absdata.

-mcvt

Использовать компактную таблицу векторов. Некоторые устройства поддерживают CVT только с четырьмя записями: 0=сброс, 1=NMI, 2=прерывания с приоритетом 1, 3=прерывания с приоритетом 0. Этот параметр подключает загрузочный код из crtmcu-cvt.o вместо обычного crtmcu.o. Помимо создания компактной таблицы векторов, загрузочный код установит бит CPUINT_CTRLA.CPUINT_CVT, включающий CVT на устройстве.

Если вы не хотите, чтобы загрузочный код устанавливал CPUINT_CTRLA.CPUINT_CVT, можно определить символ __init_cvt, чтобы соответствующий код больше не подключался из libmcu.a. Например, можно выполнить компоновку с -Wl,--defsym,__init_cvt=0.

Загрузочный код CVT доступен начиная с AVR-LibC v2.3.

-mdouble=bits
-mlong-double=bits

Задает размер (в битах) типа double или long double соответственно. Допустимые значения bits — 32 и 64. Допустимость конкретного значения bits зависит от параметров --with-double= и --with-long-double= configure; то же относится и к значениям параметров по умолчанию.

-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-call-main

Не запускать main с помощью

XCALL  main
XJMP   exit

Вместо этого поместите main в секцию .init9, чтобы вызов не требовался. Устанавливая этот параметр, пользователь гарантирует, что main не вернет управление.

Этот параметр можно использовать на устройствах с очень ограниченными ресурсами, чтобы сэкономить несколько байтов кода и стека. Он работает ожидаемым образом начиная с AVR-LibC v2.3. В более старых версиях прироста производительности не будет.

-mno-interrupts

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

-mrelax

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

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

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

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

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

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

-mtiny-stack

Изменять только младшие 8 бит указателя стека.

-mfract-convert-truncate

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

-nodevicelib

Не выполнять компоновку с библиотекой устройств AVR-LibC libmcu.a.

Обратите внимание: начиная с AVR-LibC v2.3 эта библиотека содержит код, необходимый для правильной работы программы. В частности, в ней находятся части загрузочного кода, например: __init_sp для инициализации указателя стека символом __stack, __init_cvt для настройки аппаратуры на использование компактной таблицы векторов с -mcvt, __call_main для вызова main и exit, а также __do_flmap_init для настройки FLMAP согласно символу __flmap.

-nodevicespecs

Не добавлять -specs=device-specs/specs-mcu в командную строку драйвера компилятора. Пользователь самостоятельно отвечает за передачу соответствующих параметров командной строки таким дочерним процессам, как собственно компилятор, ассемблер и компоновщик. Это означает, что пользователь должен указать собственный файл device specs с помощью -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. Включено по умолчанию.

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

3.20.6.1 Параметры оптимизации AVR

Следующие параметры предназначены исключительно для оптимизации. Упомянутые выше параметры -mgas-isr-prologues, -mmain-is-OS_task, -mno-call-main и -mrelax являются лишь почти параметрами оптимизации, поскольку в редких случаях различия в генерируемом ими коде имеют значение.

-maccumulate-args

Накапливать передаваемые аргументы функции и выделять/освобождать необходимое пространство стека для них один раз в прологе/эпилоге функции. Без этого параметра перед вызовом функции аргументы помещаются в стек, а после вызова извлекаются из него. См. также параметр оптимизации -fdefer-pop.

Извлечение аргументов после вызова функции на AVR может быть затратным, поэтому накопление пространства стека может уменьшить размер исполняемого файла, поскольку после вызова функции аргументы не требуется удалять из стека.

Этот параметр может уменьшить размер кода функций, выполняющих несколько вызовов функций, получающих аргументы из стека, например printf-подобных функций.

-mbranch-cost=cost

Задает стоимость ветвления для условных инструкций перехода равной cost. Подходящие значения cost — небольшие неотрицательные целые числа. Стоимость ветвления по умолчанию равна 0.

-mcall-prologues

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

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

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

-mfuse-move
-mno-fuse-move
-mfuse-move=level

Выполнять этап оптимизации после повторной загрузки, который пытается объединять инструкции перемещения и разбивать многобайтовые инструкции на 8-битные операции. По умолчанию для уровня оптимизации -O1 используется level=3, а для более высоких уровней оптимизации — level=23. Допустимые значения level находятся в диапазоне 0 … 23, который представляет собой смешанное значение по основанию 3:2:2:2. Каждая цифра управляет отдельным аспектом оптимизации.

-mfuse-move2

Выполнять этап оптимизации после комбинирования, который пытается объединять инструкции перемещения.

-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
-msplit-bit-shift

Разбивать многобайтовые сдвиги с постоянным смещением на сдвиг со смещением, кратным байту, и остаточный сдвиг со смещением, не кратным байту. Эта оптимизация включена по умолчанию для -O2 и более высоких уровней, включая -Os, но не включая -Oz. Разбиение сдвигов с постоянным смещением, кратным 8, управляется параметром -mfuse-move.

-msplit-ldst

Разбивать многобайтовые операции загрузки и сохранения на несколько операций загрузки и сохранения байтов. Эта оптимизация включена по умолчанию для -O2 и более высоких уровней.

-muse-nonzero-bits

Включить оптимизации, возможные только в том случае, если некоторые биты регистра всегда равны нулю. Эта оптимизация включена по умолчанию для -O2 и более высоких уровней.

3.20.6.2 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 (сокращение от generate stubs, «создать заглушки»), например:
      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.20.6.3 Обработка специальных функциональных регистров RAMPD, RAMPX, RAMPY и RAMPZ

Некоторые устройства AVR поддерживают память размером более диапазона 64 КиБ, доступного с помощью 16-разрядных указателей. Для доступа к ячейкам памяти за пределами этого диапазона 64 КиБ содержимое регистра RAMP используется в качестве старшей части адреса: адресный регистр X, Y, Z объединяется соответственно со специальным функциональным регистром RAMPX, RAMPY, RAMPZ для получения расширенного адреса. Аналогично, RAMPD используется вместе с прямой адресацией.

  • Код запуска инициализирует специальные функциональные регистры RAMP нулем.
  • Если используется именованное адресное пространство, отличное от generic или __flash, перед операцией при необходимости устанавливается RAMPZ.
  • Если устройство поддерживает ОЗУ размером более 64 КиБ и компилятору необходимо изменить RAMPZ для выполнения операции, после операции RAMPZ сбрасывается в ноль.
  • Если устройство имеет специальный регистр RAMP, пролог/эпилог обработчика прерывания сохраняет/восстанавливает этот SFR и инициализирует его нулем на случай, если код обработчика может (неявно) его использовать.
  • GCC не поддерживает ОЗУ размером более 64 КиБ для целей AVR. Если для чтения из ячеек за пределами 16-разрядного адресного диапазона используется встроенный ассемблер и изменяется один из регистров RAMP, после доступа его необходимо сбросить в ноль.

3.20.6.4 Встроенные макросы 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_CVT__

Код компилируется с параметром -mcvt для использования компактной таблицы векторов.

__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_SIGNAL_N__

Компилятор поддерживает атрибуты функций signal(num) и interrupt(num) с аргументом num, задающим номер обработчика прерывания.

__HAVE_DOUBLE_MULTILIB__

Определяется, если параметр -mdouble= используется как параметр multilib.

__HAVE_DOUBLE32__
__HAVE_DOUBLE64__

Определяется, если компилятор поддерживает 32-разрядный или 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.20.6.5 Внутренние параметры AVR

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

-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-15.3.0/gcc/AVR-Options.html

Spec-Zone.ru

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