3.18.5 AVR Options
Эти параметры определены для 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.
-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-
Предполагается, что устройство поддерживает инструкции Read-Modify-Write
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.18.5.1 EIND и устройства с более чем 128 Кбайт памяти Flash
Указатели в реализации имеют ширину 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, преамбула/эпилог обработчика прерываний сохраняет/восстанавливает этот регистр и инициализирует его нулём, в случае если код обработчика прерываний может (неявно) его использовать. - ОЗУ, размер которого больше 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-6.5.0/gcc/AVR-Options.html