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,ata6289,attiny13,attiny13a,attiny2313,attiny2313a,attiny24,attiny24a,attiny25,attiny261,attiny261a,attiny43u,attiny4313,attiny44,attiny44a,attiny45,attiny461,attiny461a,attiny48,attiny84,attiny84a,attiny85,attiny861,attiny861a,attiny87,attiny88,at86rf401. avr3- «Классические» устройства с 16 Кбайт до 64 Кбайт памяти программы. mcu =
at43usb355,at76c711. avr31- «Классические» устройства с 128 Кбайт памяти программы. mcu =
atmega103,at43usb320. avr35- «Классические» устройства с 16 Кбайт до 64 Кбайт памяти программы и с инструкцией
MOVW. mcu =ata5505,atmega16u2,atmega32u2,atmega8u2,attiny1634,attiny167,at90usb162,at90usb82. avr4- «Улучшенные» устройства с до 8 Кбайт памяти программы. mcu =
ata6285,ata6286,atmega48,atmega48a,atmega48p,atmega48pa,atmega8,atmega8a,atmega8hva,atmega8515,atmega8535,atmega88,atmega88a,atmega88p,atmega88pa,at90pwm1,at90pwm2,at90pwm2b,at90pwm3,at90pwm3b,at90pwm81. avr5- «Улучшенные» устройства с 16 Кбайт до 64 Кбайт памяти программы. mcu =
ata5790,ata5790n,ata5795,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,atmega26hvg,atmega32,atmega32a,atmega32c1,atmega32hvb,atmega32hvbrevb,atmega32m1,atmega32u4,atmega32u6,atmega323,atmega324a,atmega324p,atmega324pa,atmega325,atmega325a,atmega325p,atmega3250,atmega3250a,atmega3250p,atmega3250pa,atmega328,atmega328p,atmega329,atmega329a,atmega329p,atmega329pa,atmega3290,atmega3290a,atmega3290p,atmega3290pa,atmega406,atmega48hvf,atmega64,atmega64a,atmega64c1,atmega64hve,atmega64m1,atmega64rfa2,atmega64rfr2,atmega640,atmega644,atmega644a,atmega644p,atmega644pa,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,atmega1280,atmega1281,atmega1284,atmega1284p,at90can128,at90usb1286,at90usb1287. avr6- «Улучшенные» устройства с 3-байтовым PC, т.е. с более чем 128 Кбайт памяти программы. mcu =
atmega2560,atmega2561. avrxmega2- Устройства «XMEGA» с более чем 8 Кбайт и до 64 Кбайт памяти программы. mcu =
atmxt112sl,atmxt224,atmxt224e,atmxt336s,atxmega16a4,atxmega16a4u,atxmega16c4,atxmega16d4,atxmega32a4,atxmega32a4u,atxmega32c4,atxmega32d4,atxmega32e5,atxmega32x1. 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 =
atmxt540s,atmxt540sreva,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. avr1- Данная ISA реализована минимальным ядром AVR и поддерживается только для ассемблера. mcu =
attiny11,attiny12,attiny15,attiny28,at90s1200.
-maccumulate-args- Складывать исходящие аргументы функции и приобретать/освобождать необходимое пространство стека для исходящих аргументов функции один раз в прологе/эпилоге функции. Без этого параметра исходящие аргументы помещаются в стек перед вызовом функции и извлекаются из него после.
Извлечение аргументов после вызова функции может быть дорогостоящим для AVR, поэтому накопление места в стеке может привести к более компактным исполняемым файлам, поскольку аргументы не нужно удалять из стека после такого вызова функции.
Этот параметр может привести к уменьшению размера кода для функций, которые выполняют несколько вызовов функций, получающих свои аргументы из стека, таких как вызовы функций типа printf.
-
-mbranch-cost=cost - Установите затраты ветвления для инструкций условного перехода на cost. Разумные значения для cost — это небольшие целые неотрицательные числа. По умолчанию стоимость ветвления равна 0.
-mcall-prologues- Прологи/эпилоги функций расширяются как вызовы соответствующих подпрограмм. Размер кода уменьшается.
-mint8- Предполагать
int8-разрядным целым числом. Это влияет на размеры всех типов:char— 1 байт,int— 1 байт,long— 2 байта, аlong long— 4 байта. Обратите внимание, что этот параметр не соответствует стандартам C, но он приводит к уменьшению размера кода. -mno-interrupts- Сгенерированный код несовместим с аппаратными прерываниями. Размер кода уменьшается.
-mrelax- Попытаться заменить
CALLилиJMPинструкцией более короткойRCALLилиRJMPинструкцией, если применимо. Установка-mrelaxпросто добавляет параметр--relaxв командную строку компоновщика при вызове компоновщика.Расслабление прыжков выполняется компоновщиком, потому что смещения прыжков неизвестны до размещения кода. Поэтому ассемблерный код, сгенерированный компилятором, остается тем же, но инструкции в исполняемом файле могут отличаться от инструкций в ассемблерном коде.
Расслабление необходимо включить, если требуются «заглушки» компоновщика (см. раздел «
EIND» и «заглушки» компоновщика ниже). -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 бит указателя стека.
-Waddr-space-convert- Предупреждать о преобразованиях между адресными пространствами в случае, если результирующее адресное пространство не содержится в входящем адресном пространстве.
3.17.5.1 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(сокращенно сгенерировать заглушки) так:LDI r24, lo8(gs(func)) LDI r25, hi8(gs(func))
- Конечное расположение этой метки находится в сегменте кода вне сегмента, где размещаются заглушки.
- Адрес метки берется с помощью модификатора
- Компилятор генерирует такие модификаторы
gsдля меток кода в следующих ситуациях:- Получение адреса функции или метки кода.
- Вычисления goto.
- Если используется функция сохранения преамбулы, см. параметр командной строки
-mcall-prologues. - Таблицы переключения/выбора. Если вы не хотите таких таблиц переключения/выбора, вы можете указать параметр командной строки
-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, преамбула/эпилог обработчика прерывания сохраняет/восстанавливает этот регистр специальной функции и инициализирует его нулем, если код обработчика прерывания может (неявно) использовать его. - ОЗУ, превышающее 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,102,104,105,106,107для mcu=
avr2,avr25,avr3,avr31,avr35,avr4,avr5,avr51,avr6,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_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__- Устройство поддерживает инструкции Read-Modify-Write (XCH, LAC, LAS и LAT).
-
__AVR_SFR_OFFSET__=offset - Инструкции, которые могут напрямую обращаться к регистрам специального назначения ввода-вывода, таким как
IN,OUT,SBI, и т.д., могут использовать другой адрес, чем если бы они обращались к ОЗУ, например, с помощью инструкцийLDилиSTS. Этот смещение зависит от архитектуры устройства и должно быть вычтено из адреса ОЗУ, чтобы получить соответствующий адрес ввода-вывода. __WITH_AVRLIBC__- Компилятор настроен для использования с AVR-Libc. См. параметр конфигурации
--with-avrlibc.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/AVR-Options.html