Spec-Zone.ru › GCC 5

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
END_OF_DOCUMENT_MARKER

Используйте регистр адресации 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

Spec-Zone.ru

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