Spec-Zone.ru › GCC 7

3.18.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, 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.

-mabsdata

Предполагается, что к данным в статическом хранилище можно получить доступ с помощью инструкций LDS/STS. Этот параметр оказывает влияние только на уменьшенные устройства Tiny, такие как ATtiny40. Смотрите также absdata атрибут переменной.

-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

Предполагается, что объем памяти Flash составляет 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 бит указателя стека.

-mfract-convert-truncate

Разрешить использование усечения вместо округления к нулю для дробных типов с фиксированной точкой.

-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 не сохраняется/восстанавливается в преамбуле/эпилоге функции или обработчика прерывания.
  • Для косвенных вызовов функций и вычислений goto компоновщик генерирует заглушки. Заглушки — это переходы, иногда также называемые трамплинами. Таким образом, косвенный вызов/переход переходит к такой заглушке. Заглушка содержит прямой переход по нужному адресу.
  • Необходимо включить развязку компоновщика, чтобы компоновщик правильно генерировал заглушки во всех ситуациях. См. параметр компилятора -mrelax и параметр компоновщика --relax. Существуют крайние случаи, когда компоновщик должен сгенерировать заглушки, но прерывается без развязки и без полезного сообщения об ошибке.
  • Скрипт компоновки по умолчанию предназначен для кода с EIND = 0. Если код должен работать с настройкой EIND != 0, необходимо использовать пользовательский скрипт компоновки для размещения разделов, имена которых начинаются с .trampolines, в сегмент, на который указывает EIND.
  • Код инициализации из libgcc никогда не устанавливает EIND. Обратите внимание, что код инициализации — это смесь кода из libgcc и AVR-LibC. О влиянии AVR-LibC на EIND, см. руководство пользователя AVR-LibC AVR-LibC по руководству пользователя.
  • Допустимо, чтобы пользовательский код инициализации настраивал EIND в самом начале, например, с помощью кода инициализации, расположенного в разделе .init3. Такой код выполняется до общего кода инициализации, который инициализирует RAM и вызывает конструкторы, но после части кода инициализации из 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.
    • - Таблицы перехода 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 устанавливается как требуется перед операцией.
  • Если устройство поддерживает RAM размером более 64 Кбайт и компилятору нужно изменить RAMPZ для выполнения операции, RAMPZ сбрасывается в ноль после операции.
  • Если устройство поставляется со специальным регистром RAMP, преамбула/эпилог обработчика прерываний сохраняют/восстанавливают этот SFR и инициализируют его нулём, если код обработчика прерываний может (неявно) использовать его.
  • RAM размером более 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-7.5.0/gcc/AVR-Options.html

Spec-Zone.ru

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