3.18.5 Параметры 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,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-
Прологи/эпилоги функций расширяются как вызовы соответствующих подпрограмм. Размер кода меньше.
-mgas-isr-prologues-
Обработчики прерываний (ISR) могут использовать псевдоинструкцию
__gcc_isr, поддерживаемую GNU Binutils. Если этот параметр включен, функцию всё ещё можно отключить для отдельных ISRs с помощью атрибута функцииno_gccisr. Эта функция активируется по умолчанию, если включена оптимизация (но не с -Og, см. Параметры оптимизации), и если GNU Binutils поддерживают PR21683. -mint8-
Предполагается, что
intявляется целым 8-битным числом. Это влияет на размеры всех типов:charзанимает 1 байт,intзанимает 1 байт,longзанимает 2 байта, аlong longзанимает 4 байта. Обратите внимание, что этот параметр не соответствует стандартам C, но приводит к меньшему размеру кода. -mmain-is-OS_task-
Не сохранять регистры в
main. Эффект такой же, как при добавлении атрибутаOS_taskкmain. Он активируется по умолчанию, если включена оптимизация. -mn-flash=num-
Предполагается, что размер флеш-памяти равен num умноженному на 64 КБ.
-mno-interrupts-
Сгенерированный код несовместим с аппаратными прерываниями. Размер кода меньше.
-mrelax-
По возможности заменить инструкцию
CALLсоответственноJMPна более короткую инструкциюRCALLсоответственноRJMP. Установка -mrelax просто добавляет параметр --mlink-relax в командную строку ассемблера и параметр --relax в командную строку компоновщика.Расслабление прыжков выполняется компоновщиком, потому что смещения прыжков неизвестны до размещения кода. Поэтому ассемблерный код, сгенерированный компилятором, остается неизменным, но инструкции в исполняемом файле могут отличаться от инструкций в ассемблерном коде.
Расслабление необходимо включить, если нужны подпрограммы компоновщика, см. раздел о
EINDи подпрограммах компоновщика ниже. -mrmw-
Предполагается, что устройство поддерживает инструкции Read-Modify-Write
XCH,LAC,LASиLAT. -mshort-calls-
Предполагается, что
RJMPиRCALLмогут быть ориентированы на всю память программы.Этот параметр используется в основном для выбора многоязычных библиотек. Это не параметр оптимизации, и вам не нужно устанавливать его вручную.
-msp8-
Рассматривать регистр указателя стека как 8-битный регистр, т.е. предполагать, что старший байт указателя стека равен нулю. В общем случае вам не нужно устанавливать этот параметр вручную.
Этот параметр используется компилятором для выбора и построения многоязычных библиотек для архитектур
avr2иavr25. Эти архитектуры объединяют устройства сSPHи без него. Для любого значения, отличного от -mmcu=avr2 или -mmcu=avr25, драйвер компилятора добавляет или удаляет этот параметр из командной строки собственно компилятора, так как компилятор затем знает, имеет ли устройство или архитектура 8-битный указатель стека и, следовательно, регистрSPHили нет. -mstrict-X-
Использовать регистр адреса
Xтак, как это предлагается аппаратурой. Это означает, чтоXиспользуется только в косвенной, пост-инкрементной или пре-декрементной адресации.Без этого параметра регистр
Xможет использоваться так же, какYилиZ, что затем эмулируется дополнительными инструкциями. Например, загрузка значения с адресациейX+constс небольшим неотрицательнымconst < 64в регистр Rn выполняется какadiw r26, const ; X += const ld Rn, X ; Rn = *X sbiw r26, const ; X -= const
-mtiny-stack-
Изменять только младшие 8 бит указателя стека.
-mfract-convert-truncate-
Разрешить использование усечения вместо округления к нулю для дробных типов с фиксированной точкой.
-nodevicelib-
Не использовать библиотеку устройства, специфичную для AVR-LibC,
lib<mcu>.a. -nodevicespecs-
Не добавлять -specs=device-specs/specs-<mcu> в командную строку драйвера компилятора. Пользователь несёт ответственность за обеспечение таких подпроцессов, как собственно компилятор, ассемблер и компоновщик, соответствующими параметрами командной строки.
-Waddr-space-convert-
Выводить предупреждение о преобразованиях между адресными пространствами в случае, если полученное адресное пространство не содержится в исходном адресном пространстве.
-Wmisspelled-isr-
Выводить предупреждение, если ISR написан неправильно, т.е. без префикса __vector. Включено по умолчанию.
3.18.5.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(сокращённо генерировать подпрограммы), например: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.18.5.2 Обработка специальных регистров RAMPD, RAMPX, RAMPY и RAMPZ
Некоторые устройства AVR поддерживают память размером более 64 КБ, к которой можно получить доступ с помощью 16-битных указателей. Для доступа к ячейкам памяти за пределами этого диапазона 64 КБ используется содержимое регистра RAMP в качестве старшей части адреса: регистр адреса X, Y, Z объединяется с регистром RAMPX, RAMPY, RAMPZ соответственно, чтобы получить широкий адрес. Аналогичным образом, RAMPD используется совместно с прямой адресацией.
- Код запуска инициализирует специальные регистры
RAMPнулями. - Если используется пространство имён с именем, отличное от универсального или
__flash, тоRAMPZустанавливается по мере необходимости перед операцией. - Если устройство поддерживает ОЗУ больше, чем 64 Кбайт, и компилятору нужно изменить
RAMPZ, чтобы выполнить операцию,RAMPZсбрасывается до нуля после операции. - Если устройство поставляется с определённым регистром
RAMP, префикс/суффикс ISR сохраняет/восстанавливает этот SFR и инициализирует его нулями, в случае, если код ISR может (неявно) его использовать. - ОЗУ размером более 64 Кбайт не поддерживается GCC для AVR-мишеней. Если вы используете встроенный ассемблер для чтения из областей памяти вне 16-битного диапазона адресов и изменяете один из регистров
RAMP, вы должны сбросить его до нуля после доступа.
3.18.5.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__-
Устройство имеет инструкции Read-Modify-Write (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.
Далее: Опции Blackfin, Предыдущее: Опции ARM, Вверх: Опции подмодели [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-8.5.0/gcc/AVR-Options.html