3.18.5 Параметры AVR
Эти параметры определены для реализаций AVR:
-mmcu=mcuУкажите архитектуры набора команд Atmel AVR (ISA) или тип микроконтроллера (МК).
По умолчанию для этого параметра установлено значение ‘avr2’.
GCC поддерживает следующие устройства и ISA AVR:
avr2«Классические» устройства с объемом памяти программ до 8 Кбайт. mcu =
attiny22,attiny26,at90c8534,at90s2313,at90s2323,at90s2333,at90s2343,at90s4414,at90s4433,at90s4434,at90s8515,at90s8535.avr25«Классические» устройства с объемом памяти программ до 8 Кбайт и инструкцией
MOVW. mcu =ata5272,ata6616c,attiny13,attiny13a,attiny2313,attiny2313a,attiny24,attiny24a,attiny25,attiny261,attiny261a,attiny43u,attiny4313,attiny44,attiny44a,attiny441,attiny45,attiny461,attiny461a,attiny48,attiny828,attiny84,attiny84a,attiny841,attiny85,attiny861,attiny861a,attiny87,attiny88,at86rf401.avr3«Классические» устройства с объемом памяти программ от 16 Кбайт до 64 Кбайт. mcu =
at43usb355,at76c711.avr31«Классические» устройства с объемом памяти программ 128 Кбайт. mcu =
atmega103,at43usb320.avr35«Классические» устройства с объемом памяти программ от 16 Кбайт до 64 Кбайт и инструкцией
MOVW. mcu =ata5505,ata6617c,ata664251,atmega16u2,atmega32u2,atmega8u2,attiny1634,attiny167,at90usb162,at90usb82.avr4«Улучшенные» устройства с объемом памяти программ до 8 Кбайт. mcu =
ata6285,ata6286,ata6289,ata6612c,atmega48,atmega48a,atmega48p,atmega48pa,atmega48pb,atmega8,atmega8a,atmega8hva,atmega8515,atmega8535,atmega88,atmega88a,atmega88p,atmega88pa,atmega88pb,at90pwm1,at90pwm2,at90pwm2b,at90pwm3,at90pwm3b,at90pwm81.avr5«Улучшенные» устройства с объемом памяти программ от 16 Кбайт до 64 Кбайт. mcu =
ata5702m322,ata5782,ata5790,ata5790n,ata5791,ata5795,ata5831,ata6613c,ata6614q,ata8210,ata8510,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,atmega3250,atmega3250a,atmega3250p,atmega3250pa,atmega328,atmega328p,atmega328pb,atmega329,atmega329a,atmega329p,atmega329pa,atmega3290,atmega3290a,atmega3290p,atmega3290pa,atmega406,atmega64,atmega64a,atmega64c1,atmega64hve,atmega64hve2,atmega64m1,atmega64rfr2,atmega640,atmega644,atmega644a,atmega644p,atmega644pa,atmega644rfr2,atmega645,atmega645a,atmega645p,atmega6450,atmega6450a,atmega6450p,atmega649,atmega649a,atmega649p,atmega6490,atmega6490a,atmega6490p,at90can32,at90can64,at90pwm161,at90pwm216,at90pwm316,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 =
atxmega16a4,atxmega16a4u,atxmega16c4,atxmega16d4,atxmega16e5,atxmega32a4,atxmega32a4u,atxmega32c3,atxmega32c4,atxmega32d3,atxmega32d4,atxmega32e5,atxmega8e5.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 =
attiny10,attiny20,attiny4,attiny40,attiny5,attiny9.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Прологи/эпилоги функций расширяются как вызовы соответствующих подпрограмм. Размер кода меньше.
-mint8Предполагается, что
intявляется 8-битовым целым числом. Это влияет на размеры всех типов:char— 1 байт,int— 1 байт,long— 2 байта, аlong long— 4 байта. Обратите внимание, что этот параметр не соответствует стандартам C, но приводит к более компактному коду.-mn-flash=numПредполагается, что объем памяти Flash составляет num умножить на 64 Кбайт.
-mno-interruptsСгенерированный код несовместим с аппаратными прерываниями. Размер кода меньше.
-mrelaxПопробуйте заменить
CALLсоответственноJMPинструкцию более короткойRCALLсоответственноRJMPинструкцией, если это возможно. Установка -mrelax просто добавляет параметр --mlink-relax в командную строку ассемблера и параметр --relax в командную строку компоновщика.Разрешение прыжков выполняется компоновщиком, потому что смещения прыжков неизвестны до размещения кода. Поэтому ассемблерный код, сгенерированный компилятором, остается тем же, но инструкции в исполняемом файле могут отличаться от инструкций в ассемблерном коде.
Разрешение необходимо включить, если нужны подпрограммы компоновщика, см. раздел о
EINDи подпрограммах компоновщика ниже.-mrmwПредполагается, что устройство поддерживает инструкции Чтение-Модификация-Запись
XCH,LAC,LASиLAT.-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. -Waddr-space-convert-
Выводить предупреждение о преобразованиях между адресными пространствами в том случае, когда результирующее адресное пространство не содержится в исходном адресном пространстве.
-Wmisspelled-isr-
Выводить предупреждение, если ISR написано неправильно, т.е. без префикса __vector. Включено по умолчанию.
3.18.5.1 EIND и устройства с более чем 128 Кбайт памяти Flash
Указатели в реализации имеют ширину 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 AVR-LibC по руководству пользователя. - Допустимо, чтобы пользовательский код инициализации настраивал
EINDв самом начале, например, с помощью кода инициализации, расположенного в разделе.init3. Такой код выполняется до общего кода инициализации, который инициализирует RAM и вызывает конструкторы, но после части кода инициализации из 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для меток кода в следующих ситуациях:- - Получение адреса функции или метки кода.
- - Вычисление 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.18.5.2 Обработка специальных регистров RAMPD, RAMPX, RAMPY и RAMPZ
Некоторые устройства AVR поддерживают память размером более 64 Кбайт, к которой можно получить доступ с помощью 16-битных указателей. Для доступа к расположениям памяти за пределами этого диапазона 64 Кбайт используется содержимое регистра RAMP в качестве старшей части адреса: Регистр адреса X, Y, Z конкатенируется с регистром специального назначения RAMPX, RAMPY, RAMPZ соответственно, для получения широкого адреса. Аналогично, RAMPD используется совместно с прямой адресацией.
- Код инициализации инициализирует регистры специального назначения
RAMPнулем. - Если используется адресное пространство, отличное от общего или
__flash, тоRAMPZустанавливается как требуется перед операцией. - Если устройство поддерживает RAM размером более 64 Кбайт и компилятору нужно изменить
RAMPZдля выполнения операции,RAMPZсбрасывается в ноль после операции. - Если устройство поставляется со специальным регистром
RAMP, преамбула/эпилог обработчика прерываний сохраняют/восстанавливают этот SFR и инициализируют его нулём, если код обработчика прерываний может (неявно) использовать его. - RAM размером более 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,104,105,106,107для mcu=
avrtiny,avrxmega2,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. Это справедливо для устройств с объемом памяти программы не менее 16 Кбайт. __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. Эта разница в адресе зависит от архитектуры устройства и должна вычитаться из адреса ОЗУ, чтобы получить соответствующий адрес ввода/вывода. __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-7.5.0/gcc/AVR-Options.html