Spec-Zone.ru › GCC 6

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

Spec-Zone.ru

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