Spec-Zone.ru › GCC 4

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
Предполагать int 8-разрядным целым числом. Это влияет на размеры всех типов: 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API