3.20.6 Параметры AVR
Для реализаций AVR определены следующие параметры:
-
-mmcu=mcu -
Задает архитектуру набора команд AVR (ISA) или тип устройства. Значение этого параметра по умолчанию —
avr2.Поддерживаются следующие устройства и ISA AVR. Примечание: Полная поддержка устройства включает загрузочный код
crtmcu.o, заголовочный файл устройстваavr/io*.h, библиотеку устройстваlibmcu.aи файл device-specsspecs-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 -
Считать
int8-разрядным целым числом. Это влияет на размеры всех типов: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