3.17.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,atmega8,atmega8a,atmega8hva,atmega8515,atmega8535,atmega88,atmega88a,atmega88p,atmega88pa,at90pwm1,at90pwm2,at90pwm2b,at90pwm3,at90pwm3b,at90pwm81. avr5-
«Улучшенные» устройства с объёмом памяти программ от 16 Кбайт до 64 Кбайт. mcu =
ata5702m322,ata5782,ata5790,ata5790n,ata5795,ata5831,ata6613c,ata6614q,atmega16,atmega16a,atmega16hva,atmega16hva2,atmega16hvb,atmega16hvbrevb,atmega16m1,atmega16u4,atmega161,atmega162,atmega163,atmega164a,atmega164p,atmega164pa,atmega165,atmega165a,atmega165p,atmega165pa,atmega168,atmega168a,atmega168p,atmega168pa,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,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. 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.
-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-
Предполагается, что размер памяти флеш-памяти составляет 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 битов указателя стека.
-nodevicelib-
Не связывайте с устройственно-специфической библиотекой AVR-LibC
lib<mcu>.a. -Waddr-space-convert-
Предупреждайте о преобразованиях между адресными пространствами в том случае, когда полученное адресное пространство не содержится в исходном адресном пространстве.
-Wmisspelled-isr-
Предупреждайте, если ISR имеет неправильное написание, т.е. без префикса
__vector. Включено по умолчанию.
3.17.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, которая устанавливает__trampolines_startв сегмент, где находится таблица векторов.#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.17.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, то пролог/эпилог обработчика прерываний сохраняет/восстанавливает этот регистр SFR и инициализирует его нулем в случае, если код обработчика прерываний может (неявно) его использовать. - ОЗУ размером более 64 Кбайт не поддерживается GCC для целей AVR. Если вы используете встроенный ассемблер для чтения из расположений за пределами 16-битного диапазона адресов и изменяете один из регистров
RAMP, вы должны сбросить его в ноль после доступа.
3.17.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-5.5.0/gcc/AVR-Options.html