3.18.6 Параметры AVR
Эти параметры определены для реализаций AVR:
-mmcu=mcu-
Укажите архитектуру набора инструкций Atmel AVR (ISA) или тип микроконтроллера (МК).
По умолчанию для этого параметра установлено значение ‘avr2’.
GCC поддерживает следующие устройства AVR и ISA:
avr2-
«Классические» устройства с объёмом памяти программы до 8 Кбайт. mcu =
attiny22,attiny26,at90s2313,at90s2323,at90s2333,at90s2343,at90s4414,at90s4433,at90s4434,at90c8534,at90s8515,at90s8535. avr25-
«Классические» устройства с объёмом памяти программы до 8 Кбайт и инструкцией
MOVW. mcu =attiny13,attiny13a,attiny24,attiny24a,attiny25,attiny261,attiny261a,attiny2313,attiny2313a,attiny43u,attiny44,attiny44a,attiny45,attiny48,attiny441,attiny461,attiny461a,attiny4313,attiny84,attiny84a,attiny85,attiny87,attiny88,attiny828,attiny841,attiny861,attiny861a,ata5272,ata6616c,at86rf401. avr3-
«Классические» устройства с объёмом памяти программы от 16 до 64 Кбайт. mcu =
at76c711,at43usb355. avr31-
«Классические» устройства с объёмом памяти программы 128 Кбайт. mcu =
atmega103,at43usb320. avr35-
«Классические» устройства с объёмом памяти программы от 16 до 64 Кбайт и инструкцией
MOVW. mcu =attiny167,attiny1634,atmega8u2,atmega16u2,atmega32u2,ata5505,ata6617c,ata664251,at90usb82,at90usb162. avr4-
«Улучшенные» устройства с объёмом памяти программы до 8 Кбайт. mcu =
atmega48,atmega48a,atmega48p,atmega48pa,atmega48pb,atmega8,atmega8a,atmega8hva,atmega88,atmega88a,atmega88p,atmega88pa,atmega88pb,atmega8515,atmega8535,ata6285,ata6286,ata6289,ata6612c,at90pwm1,at90pwm2,at90pwm2b,at90pwm3,at90pwm3b,at90pwm81. avr5-
«Улучшенные» устройства с объёмом памяти программы от 16 до 64 Кбайт. mcu =
atmega16,atmega16a,atmega16hva,atmega16hva2,atmega16hvb,atmega16hvbrevb,atmega16m1,atmega16u4,atmega161,atmega162,atmega163,atmega164a,atmega164p,atmega164pa,atmega165,atmega165a,atmega165p,atmega165pa,atmega168,atmega168a,atmega168p,atmega168pa,atmega168pb,atmega169,atmega169a,atmega169p,atmega169pa,atmega32,atmega32a,atmega32c1,atmega32hvb,atmega32hvbrevb,atmega32m1,atmega32u4,atmega32u6,atmega323,atmega324a,atmega324p,atmega324pa,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. Если этот параметр включен, функцию всё ещё можно отключить для отдельных ISR с помощью атрибута функцииno_gccisr. Эта функция активирована по умолчанию, если включена оптимизация (но не с -Og, см. Параметры оптимизации), и если GNU Binutils поддерживает PR21683. -mint8-
Предполагается, что
intявляется 8-битовым целым числом. Это влияет на размеры всех типов:char— 1 байт,int— 1 байт,long— 2 байта, аlong long— 4 байта. Обратите внимание, что этот параметр не соответствует стандартам C, но приводит к меньшему размеру кода. -mmain-is-OS_task-
Не сохранять регистры в
main. Эффект такой же, как привязка атрибутаOS_taskкmain. Активируется по умолчанию, если включена оптимизация. -mn-flash=num-
Предполагается, что размер памяти флэш-памяти составляет num умножить на 64 Кбайт.
-mno-interrupts-
Сгенерированный код несовместим с аппаратными прерываниями. Размер кода меньше.
-mrelax-
Попытаться заменить инструкцию
CALLилиJMPболее короткой инструкциейRCALLилиRJMPприменительно к случаю. Установка -mrelax просто добавляет опцию --mlink-relax в командную строку ассемблера и опцию --relax в командную строку компоновщика.Расслабление переходов выполняется компоновщиком, потому что смещения переходов неизвестны до размещения кода. Поэтому ассемблерный код, сгенерированный компилятором, остается таким же, но инструкции в исполняемом файле могут отличаться от инструкций в ассемблерном коде.
Расслабление должно быть включено, если нужны подпрограммы компоновщика, см. раздел о
EINDи подпрограммах компоновщика ниже. -mrmw-
Предполагается, что устройство поддерживает инструкции чтения-модификации-записи
XCH,LAC,LASиLAT. -mshort-calls-
Предполагается, что
RJMPиRCALLмогут быть направлены на всю память программы.Этот параметр используется внутренне для выбора многолиб.
Это не параметр оптимизации, и устанавливать его вручную не требуется.
-msp8-
Обрабатывать регистр указателя стека как 8-битный регистр, т.е. предполагать, что старший байт указателя стека равен нулю. Как правило, вам не нужно устанавливать этот параметр вручную.
Этот параметр используется компилятором для выбора и сборки многолиб для архитектур
avr2иavr25. Эти архитектуры смешивают устройства сSPHи без него. Для любого параметра, отличного от -mmcu=avr2 или -mmcu=avr25, драйвер компилятора добавляет или удаляет этот параметр из командной строки собственно компилятора, поскольку компилятор тогда знает, имеет ли устройство или архитектура 8-битный указатель стека и, следовательно, регистрSPHили нет. -mstrict-X-
Использовать регистр адреса
Xтак, как это предлагается аппаратным обеспечением. Это означает, чтоXиспользуется только в косвенной, пост-инкрементной или пре-декрементной адресации.Без этого параметра регистр
Xможет использоваться так же, какYилиZ, что затем эмулируется дополнительными инструкциями. Например, загрузка значения с помощью адресацииX+constс небольшим неотрицательнымconst < 64в регистр Rn выполняется следующим образом:adiw r26, const ; X += const ld Rn, X ; Rn = *X sbiw r26, const ; X -= const
-mtiny-stack-
Изменять только младшие 8 битов указателя стека.
-mfract-convert-truncate-
Разрешить использовать усечение вместо округления к нулю для дробных типов с фиксированной точкой.
-nodevicelib-
Не связывать с устройственно-специфической библиотекой AVR-LibC
lib<mcu>.a. -nodevicespecs-
Не добавлять -specs=device-specs/specs-<mcu> в командную строку драйвера компилятора. Пользователь несет ответственность за обеспечение таких подпроцессов, как собственно компилятор, ассемблер и компоновщик, соответствующими параметрами командной строки.
-Waddr-space-convert-
Выдавать предупреждение о преобразованиях между адресными пространствами в случае, когда результирующее адресное пространство не содержится в исходном адресном пространстве.
-Wmisspelled-isr-
Выдавать предупреждение, если ISR написано неправильно, т.е. без префикса __vector. Включено по умолчанию.
3.18.6.1 EIND и устройства с более чем 128 Кбайт флэш-памяти
Указатели в реализации имеют ширину 16 бит. Адрес функции или метки представлен как адрес слова, чтобы косвенные переходы и вызовы могли обращаться к любому адресу кода в диапазоне 64 К слов.
Для облегчения косвенного перехода на устройствах с более чем 128 Кбайт адресного пространства программной памяти существует специальный регистр функции EIND, который служит наиболее значимой частью целевого адреса при использовании инструкций EICALL или EIJMP.
Косвенные переходы и вызовы на этих устройствах обрабатываются компилятором и имеют некоторые ограничения:
- Компилятор никогда не устанавливает
EIND. - Компилятор неявно использует
EINDв инструкцияхEICALL/EIJMPили может считыватьEINDнепосредственно для эмуляции косвенного вызова/перехода с помощью инструкцииRET. - Компилятор предполагает, что
EINDникогда не изменяется во время кода запуска или во время приложения. В частности,EINDне сохраняется/восстанавливается в прологе/эпилоге функции или обработчика прерывания. - Для косвенных вызовов функций и вычисления переходов компоновщик генерирует заглушки. Заглушки — это места перехода, иногда называемые трамплинами. Таким образом, косвенный вызов/переход переходит к такой заглушке. Заглушка содержит прямой переход к нужному адресу.
- Необходимо включить расслабление компоновщика, чтобы компоновщик правильно генерировал заглушки во всех ситуациях. См. параметр компилятора -mrelax и параметр компоновщика --relax. Есть частные случаи, когда компоновщик должен генерировать заглушки, но прерывается без расслабления и без полезного сообщения об ошибке.
- Сценарий компоновки по умолчанию организован для кода с
EIND = 0. Если код должен работать для конфигурации сEIND != 0, необходимо использовать пользовательский сценарий компоновки для размещения секций, имена которых начинаются с.trampolinesв сегмент, на который указываетEIND. - Код запуска из libgcc никогда не устанавливает
EIND. Обратите внимание, что код запуска — это смесь кода из libgcc и AVR-LibC. Для влияния AVR-LibC наEIND, см. руководство пользователя AVR-LibC AVR-LibC user manual. - Разрешается использовать пользовательский код запуска для настройки
EINDна ранней стадии, например, с помощью кода инициализации, расположенного в секции.init3. Такой код выполняется до общего кода запуска, который инициализирует ОЗУ и вызывает конструкторы, но после части кода запуска от AVR-LibC, которая устанавливаетEINDв сегмент, где находится таблица векторов.#include <avr/io.h> static void __attribute__((section(".init3"),naked,used,no_instrument_function)) init3_set_eind (void) { __asm volatile ("ldi r24,pm_hh8(__trampolines_start)\n\t" "out %i0,r24" :: "n" (&EIND) : "r24","memory"); }Символ
__trampolines_startопределён в сценарии компоновки. - Заглушки генерируются автоматически компоновщиком, если выполнены следующие два условия:
- - Адрес метки берётся с помощью модификатора
gs(сокращённо generate stubs), например:LDI r24, lo8(gs(func)) LDI r25, hi8(gs(func))
- - Конечное расположение этой метки находится в сегменте кода вне сегмента, где находятся заглушки.
- - Адрес метки берётся с помощью модификатора
- Компилятор генерирует такие модификаторы
gsдля меток кода в следующих ситуациях:- - Получение адреса функции или метки кода.
- - Вычисление перехода.
- - Если используется функция с сохранением пролога, см. параметр командной строки -mcall-prologues.
- - Таблицы переходов switch/case. Если вы не хотите таких таблиц, вы можете указать параметр командной строки -fno-jump-tables.
- - C и C++ конструкторы/деструкторы, вызываемые во время запуска/остановки.
- - Если инструменты сталкиваются с модификатором
gs()описанным выше.
- Переход к несимволическим адресам, например, так:
int main (void) { /* Call function at word address 0x2 */ return ((int(*)(void)) 0x2)(); }не поддерживается. Вместо этого необходимо настроить заглушку, т.е. функция должна вызываться через символ (
func_4в примере):int main (void) { extern int func_4 (void); /* Call function at byte address 0x4 */ return func_4(); }и приложение должно быть скомпоновано с -Wl,--defsym,func_4=0x4. В качестве альтернативы,
func_4можно определить в сценарии компоновки.
3.18.6.2 Обработка специальных регистров функций RAMPD, RAMPX, RAMPY и RAMPZ
Некоторые устройства AVR поддерживают память большего размера, чем 64 Кбайт, к которой можно получить доступ с помощью 16-битных указателей. Для доступа к местам памяти вне этого диапазона 64 Кбайт используется содержимое регистра RAMP в качестве старшей части адреса: Адрес X, Y, Z конкатенируется соответственно с регистром специальной функции RAMPX, RAMPY, RAMPZ, чтобы получить широкий адрес. Аналогично, RAMPD используется совместно с прямой адресацией.
- Код запуска инициализирует специальные регистры
RAMPнулями. - Если используется пространство имен адресов имен адресов, отличное от общего или
__flash, тоRAMPZустанавливается по мере необходимости перед операцией. - Если устройство поддерживает ОЗУ, большее 64 Кбайт, и компилятор должен изменить
RAMPZ, чтобы выполнить операцию,RAMPZсбрасывается в ноль после операции. - Если устройство поставляется со специфическим регистром
RAMP, префикс/постфикс обработчика прерывания сохраняет/восстанавливает этот SFR и инициализирует его нулями, в случае, если код обработчика прерывания может (неявным образом) использовать его. - ОЗУ размером более 64 Кбайт не поддерживается GCC для AVR-мишеней. Если вы используете встроенный ассемблер для чтения из расположений за пределами 16-битного диапазона адресов и изменяете один из регистров
RAMP, вы должны сбросить его в ноль после доступа.
3.18.6.3 Встроенные макросы AVR
GCC определяет несколько встроенных макросов, чтобы код пользователя мог проверять наличие или отсутствие функций. Почти все следующие встроенные макросы выводятся из возможностей устройства и, таким образом, вызываются опцией командной строки -mmcu=.
Для ещё более специфичных для AVR встроенных макросов см. Пространства имён адресов AVR и Встроенные функции AVR.
__AVR_ARCH__-
Встроенный макрос, который преобразуется в десятичное число, идентифицирующее архитектуру и зависит от опции -mmcu=mcu. Возможные значения:
2,25,3,31,35,4,5,51,6для mcu=
avr2,avr3,avr31,avr35,avr4,avr5,avr51,avr6, соответственно и100,102,103,104,105,106,107для mcu=
avrtiny,avrxmega2,avrxmega3,avrxmega4,avrxmega5,avrxmega6,avrxmega7, соответственно. Если mcu указывает на устройство, этот встроенный макрос устанавливается соответствующим образом. Например, с -mmcu=atmega8 макрос определён как4. __AVR_Device__-
Установка -mmcu=device определяет этот встроенный макрос, который отражает имя устройства. Например, -mmcu=atmega8 определяет встроенный макрос
__AVR_ATmega8__, -mmcu=attiny261a определяет__AVR_ATtiny261A__, и т.д.Имена встроенных макросов следуют схеме
__AVR_Device__, где Device — это имя устройства из руководства пользователя AVR. Разница между Device во встроенном макросе и device в -mmcu=device заключается в том, что последнее всегда в нижнем регистре.Если device не является устройством, а только ядром архитектуры, например, «avr51», этот макрос не определён.
__AVR_DEVICE_NAME__-
Установка -mmcu=device определяет этот встроенный макрос именем устройства. Например, с -mmcu=atmega8 макрос определен как
atmega8.Если device не является устройством, а только ядром архитектуры, например, «avr51», этот макрос не определён.
__AVR_XMEGA__-
Устройство/архитектура относится к семейству устройств XMEGA.
__AVR_HAVE_ELPM__-
Устройство имеет инструкцию
ELPM. __AVR_HAVE_ELPMX__-
Устройство имеет инструкции
ELPM Rn,ZиELPM Rn,Z+. __AVR_HAVE_MOVW__-
Устройство имеет инструкцию
MOVWдля выполнения перемещений регистров-регистров на 16 бит. __AVR_HAVE_LPMX__-
Устройство имеет инструкции
LPM Rn,ZиLPM Rn,Z+. __AVR_HAVE_MUL__-
Устройство имеет аппаратный множитель.
__AVR_HAVE_JMP_CALL__-
Устройство имеет инструкции
JMPиCALL. Это верно для устройств с объёмом памяти программы более 8 Кбайт. __AVR_HAVE_EIJMP_EICALL____AVR_3_BYTE_PC__-
Устройство имеет инструкции
EIJMPиEICALL. Это верно для устройств с объёмом памяти программы более 128 Кбайт. Это также означает, что счётчик команд (PC) имеет ширину 3 байта. __AVR_2_BYTE_PC__-
Счётчик команд (PC) имеет ширину 2 байта. Это верно для устройств с объёмом памяти программы до 128 Кбайт.
__AVR_HAVE_8BIT_SP____AVR_HAVE_16BIT_SP__-
Регистр указателя стека (SP) рассматривается компилятором как 8-битный, соответственно 16-битный регистр. Определение этих макросов зависит от -mtiny-stack.
__AVR_HAVE_SPH____AVR_SP8__-
Устройство имеет специальный регистр SPH (старшая часть указателя стека) или имеет 8-битный указатель стека, соответственно. Определение этих макросов зависит от -mmcu= и в случаях -mmcu=avr2 и -mmcu=avr25 также от -msp8.
__AVR_HAVE_RAMPD____AVR_HAVE_RAMPX____AVR_HAVE_RAMPY____AVR_HAVE_RAMPZ__-
Устройство имеет специальные регистры
RAMPD,RAMPX,RAMPY,RAMPZ, соответственно. __NO_INTERRUPTS__-
Этот макрос отражает опцию командной строки -mno-interrupts.
__AVR_ERRATA_SKIP____AVR_ERRATA_SKIP_JMP_CALL__-
Некоторые устройства AVR (AT90S8515, ATmega103) не должны пропускать 32-битные инструкции из-за аппаратной ошибки. Инструкции пропуска —
SBRS,SBRC,SBIS,SBICиCPSE. Второй макрос определен только в том случае, если__AVR_HAVE_JMP_CALL__также установлен. __AVR_ISA_RMW__-
Устройство имеет инструкции чтения-модификации-записи (XCH, LAC, LAS и LAT).
__AVR_SFR_OFFSET__=offset-
Инструкции, которые могут напрямую обращаться к I/O специальным функциям, таким как
IN,OUT,SBI, и т. д., могут использовать другой адрес, как если бы они обращаются к ОЗУ, напримерLDилиSTS. Этот смещение зависит от архитектуры устройства и должен быть вычтен из адреса ОЗУ, чтобы получить соответствующий I/O адрес. __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-9.5.0/gcc/AVR-Options.html