Spec-Zone.ru › GCC 14

3.19.6 AVR Параметры

Эти параметры определены для реализаций AVR:

-mmcu=mcu

Укажите архитектуру набора команд AVR (ISA) или тип устройства. По умолчанию для этого параметра установлено значение avr2.

Поддерживаются следующие устройства и наборы команд AVR. Примечание: Полная поддержка устройства включает код загрузки crtmcu.o, заголовок устройства avr/io*.h, библиотеку устройства libmcu.a и файл device-specs specs-mcu. Только последний предоставляется компилятором в соответствии с поддерживаемыми mcu ниже. Остальное поддерживается AVR-LibC или с помощью файлов atpack от производителя оборудования.

avr2

Устройства «классической» серии с объёмом памяти программ до 8 Кбайт. mcu = attiny22, attiny26, at90s2313, at90s2323, at90s2333, at90s2343, at90s4414, at90s4433, at90s4434, at90c8534, at90s8515, at90s8535.

avr25

Устройства «классической» серии с объёмом памяти программ до 8 Кбайт и с инструкцией MOVW. mcu = attiny13, attiny13a, attiny24, attiny24a, attiny25, attiny261, attiny261a, attiny2313, attiny2313a, attiny43u, attiny44, attiny44a, attiny45, attiny48, attiny441, attiny461, attiny461a, attiny4313, attiny84, attiny84a, attiny85, attiny87, attiny88, attiny828, attiny841, attiny861, attiny861a, ata5272, ata6616c, at86rf401.

avr3

Устройства «классической» серии с объёмом памяти программ от 16 до 64 Кбайт. mcu = at76c711, at43usb355.

avr31

Устройства «классической» серии с объёмом памяти программ 128 Кбайт. mcu = atmega103, at43usb320.

avr35

Устройства «классической» серии с объёмом памяти программ от 16 до 64 Кбайт и с инструкцией MOVW. mcu = attiny167, attiny1634, atmega8u2, atmega16u2, atmega32u2, ata5505, ata6617c, ata664251, at90usb82, at90usb162.

avr4

Устройства «улучшенной» серии с объёмом памяти программ до 8 Кбайт. mcu = atmega48, atmega48a, atmega48p, atmega48pa, atmega48pb, atmega8, atmega8a, atmega8hva, atmega88, atmega88a, atmega88p, atmega88pa, atmega88pb, atmega8515, atmega8535, ata5795, ata6285, ata6286, ata6289, ata6612c, at90pwm1, at90pwm2, at90pwm2b, at90pwm3, at90pwm3b, at90pwm81.

avr5

Устройства «улучшенной» серии с объёмом памяти программ от 16 до 64 Кбайт. mcu = 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, atmega324pb, atmega325, atmega325a, atmega325p, atmega325pa, atmega328, atmega328p, atmega328pb, atmega329, atmega329a, atmega329p, atmega329pa, atmega3250, atmega3250a, atmega3250p, atmega3250pa, atmega3290, atmega3290a, atmega3290p, atmega3290pa, atmega406, atmega64, atmega64a, atmega64c1, atmega64hve, atmega64hve2, atmega64m1, atmega64rfr2, atmega640, atmega644, atmega644a, atmega644p, atmega644pa, atmega644rfr2, atmega645, atmega645a, atmega645p, atmega649, atmega649a, atmega649p, atmega6450, atmega6450a, atmega6450p, atmega6490, atmega6490a, atmega6490p, ata5790, ata5790n, ata5791, ata6613c, ata6614q, ata5782, ata5831, ata8210, ata8510, ata5787, ata5835, ata5700m322, ata5702m322, at90pwm161, at90pwm216, at90pwm316, at90can32, at90can64, 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 = atxmega8e5, atxmega16a4, atxmega16a4u, atxmega16c4, atxmega16d4, atxmega16e5, atxmega32a4, atxmega32a4u, atxmega32c3, atxmega32c4, atxmega32d3, atxmega32d4, atxmega32e5, avr64da28, avr64da32, avr64da48, avr64da64, avr64db28, avr64db32, avr64db48, avr64db64, avr64dd14, avr64dd20, avr64dd28, avr64dd32, avr64du28, avr64du32, avr64ea28, avr64ea32, avr64ea48.

avrxmega3

Устройства «XMEGA» серии с объёмом комбинированной памяти программ и ОЗУ до 64 Кбайт, причём память программ видна в адресном пространстве ОЗУ. mcu = attiny202, attiny204, attiny212, attiny214, attiny402, attiny404, attiny406, attiny412, attiny414, attiny416, attiny416auto, attiny417, attiny424, attiny426, attiny427, attiny804, attiny806, attiny807, attiny814, attiny816, attiny817, attiny824, attiny826, attiny827, attiny1604, attiny1606, attiny1607, attiny1614, attiny1616, attiny1617, attiny1624, attiny1626, attiny1627, attiny3214, attiny3216, attiny3217, attiny3224, attiny3226, attiny3227, atmega808, atmega809, atmega1608, atmega1609, atmega3208, atmega3209, atmega4808, atmega4809, avr16dd14, avr16dd20, avr16dd28, avr16dd32, avr16du14, avr16du20, avr16du28, avr16du32, avr16ea28, avr16ea32, avr16ea48, avr16eb14, avr16eb20, avr16eb28, avr16eb32, avr32da28, avr32da32, avr32da48, avr32db28, avr32db32, avr32db48, avr32dd14, avr32dd20, avr32dd28, avr32dd32, avr32du14, avr32du20, avr32du28, avr32du32, avr32ea28, avr32ea32, avr32ea48.

avrxmega4

Устройства «XMEGA» серии с объёмом памяти программ более 64 Кбайт и до 128 Кбайт. mcu = atxmega64a3, atxmega64a3u, atxmega64a4u, atxmega64b1, atxmega64b3, atxmega64c3, atxmega64d3, atxmega64d4, avr128da28, avr128da32, avr128da48, avr128da64, avr128db28, avr128db32, avr128db48, avr128db64.

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 «Reduced Tiny» с всего 16 универсальными регистрами и 512 байт до 4 Кбайт памяти программ. mcu = attiny4, attiny5, attiny9, attiny10, attiny102, attiny104, attiny20, attiny40.

avr1

Эта ISA реализуется минимальным ядром AVR и поддерживается только для ассемблера. mcu = attiny11, attiny12, attiny15, attiny28, at90s1200.

-mabsdata

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

-maccumulate-args

Агрегировать аргументы вызываемой функции и захватить/освободить необходимое место в стеке для аргументов вызываемой функции в начале/конце функции. Без этого параметра аргументы вызываемой функции помещаются в стек перед вызовом функции и извлекаются из него после.

Извлечение аргументов после вызова функции может быть дорогостоящим на AVR, поэтому агрегация места в стеке может привести к более компактным исполняемым файлам, так как аргументы не нужно удалять из стека после такого вызова функции.

Этот параметр может привести к уменьшению размера кода для функций, которые выполняют несколько вызовов функций, получающих свои аргументы из стека, таких как вызовы функций printf-подобного типа.

-mbranch-cost=cost

Установить стоимость переходов для условных инструкций перехода на значение cost. Разумные значения для cost — небольшие неотрицательные целые числа. Стоимость перехода по умолчанию равна 0.

-mcall-prologues

Прологи/эпилоги функций расширяются как вызовы соответствующих подпрограмм. Размер кода уменьшается.

-mfuse-add
-mno-fuse-add
-mfuse-add=level

Оптимизировать косвенные обращения к памяти на устройствах Reduced Tiny. По умолчанию используются level=1 для оптимизаций -Og и -O1, и level=2 для более высоких уровней оптимизации. Допустимые значения для level — 0, 1 и 2.

-mdouble=bits
-mlong-double=bits

Установить размер (в битах) типа double или long double соответственно. Возможные значения для bits — 32 и 64. Допустимость конкретного значения для bits зависит от --with-double= и --with-long-double= параметров конфигурации, и то же самое относится к значениям параметров по умолчанию.

-mgas-isr-prologues

Обработчики прерываний (ISRs) могут использовать псевдоинструкцию __gcc_isr , поддерживаемую GNU Binutils. Если этот параметр включен, данную функцию можно отключить для отдельных ISRs с помощью атрибута функции no_gccisr. Эта функция включена по умолчанию, если оптимизация включена (но не с -Og, см. Параметры, управляющие оптимизацией), и если GNU Binutils поддерживает PR21683.

-mint8

Предполагать, что int — 8-битное целое число. Это влияет на размер всех типов: char — 1 байт, int — 1 байт, long — 2 байта, и long long — 4 байта. Обратите внимание, что этот параметр не соответствует стандартам C, но приводит к более компактному коду.

-mmain-is-OS_task

Не сохранять регистры в main. Эффект аналогичен применению атрибута OS_task к main. Данный параметр включён по умолчанию при оптимизации.

-mno-interrupts

Сгенерированный код несовместим с аппаратными прерываниями. Размер кода уменьшается.

-mrelax

Попытаться заменить инструкцию CALL или JMP более короткой инструкцией RCALL или RJMP применительно к ситуации. Установка -mrelax просто добавляет параметр --mlink-relax в командную строку ассемблера и --relax в командную строку компоновщика.

Расслабление прыжков выполняется компоновщиком, так как смещения прыжков неизвестны до размещения кода. Поэтому сгенерированный компилятором ассемблерный код остается тем же, но инструкции в исполняемом файле могут отличаться от инструкций в ассемблерном коде.

Расслабление необходимо включить, если нужны компоновщиковые плашки, см. раздел о EIND и компоновщиковых плашках ниже.

-mrodata-in-ram
-mno-rodata-in-ram

Размещать секции .rodata для данных только для чтения в ОЗУ или в памяти программы. Для большинства устройств нет выбора, и этот параметр скорее действует как утверждение.

Начиная с версии 14 и для устройств AVR64* и AVR128*, .rodata по умолчанию размещается во флеш-памяти, при условии, что есть необходимая поддержка GNU Binutils (PR31124). В этом случае -mrodata-in-ram можно использовать для возврата к старой схеме с .rodata в ОЗУ.

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

-nodevicespecs

Не добавлять -specs=device-specs/specs-mcu в командную строку драйвера компилятора. Пользователь несет ответственность за предоставление подпроцессам (самому компилятору, ассемблеру и компоновщику) соответствующих опций командной строки. Это означает, что пользователь должен предоставить собственный файл device specs с помощью -specs=путь-к-файлу-specs. Больше нет необходимости в опции -mmcu=mcu.

Этот параметр также может служить заменой более старому способу указания пользовательских файлов device-specs, который требовал -B некоторый-путь для указания каталога, который содержит папку с именем device-specs содержащую файл specs с именем specs-mcu, где mcu задавался с помощью -mmcu=mcu.

-Waddr-space-convert

Предупреждать о преобразованиях между адресными пространствами в случае, когда результирующее адресное пространство не содержится в исходном адресном пространстве.

-Wmisspelled-isr

Выдавать предупреждение, если ISR написано неправильно, т.е. без префикса __vector. Включено по умолчанию.

  • EIND и устройства с более чем 128 Кбайт флеш-памяти
  • Обработка регистров специального назначения RAMPD, RAMPX, RAMPY и RAMPZ
  • Встроенные макросы AVR
  • Внутренние параметры AVR

3.19.6.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, которая устанавливает 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.19.6.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.19.6.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, 103, 104, 105, 106, 107

соответственно для mcu=avrtiny, avrxmega2, avrxmega3, 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_ADIW__

Устройство имеет инструкции ADIW и SBIW.

__AVR_HAVE_ELPM__

Устройство имеет инструкцию ELPM.

__AVR_HAVE_ELPMX__

Устройство имеет инструкции ELPM Rn,Z и ELPM Rn,Z+.

__AVR_HAVE_LPMX__

Устройство имеет инструкции LPM Rn,Z и LPM Rn,Z+.

__AVR_HAVE_MOVW__

Устройство имеет инструкцию MOVW для выполнения 16-битных перемещений регистр-регистр.

__AVR_HAVE_MUL__

Устройство имеет аппаратный умножитель.

__AVR_HAVE_JMP_CALL__

Устройство имеет инструкции JMP и CALL. Это справедливо для устройств с объёмом памяти программы более 8 Кбайт.

__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. Этот смещение зависит от архитектуры устройства и должен вычитаться из адреса ОЗУ, чтобы получить соответствующий адрес ввода/вывода.

__AVR_SHORT_CALLS__

Установлена опция командной строки -mshort-calls.

__AVR_PM_BASE_ADDRESS__=addr

Некоторые устройства поддерживают чтение из флэш-памяти с помощью инструкций LD*. Флэш-память отображается в адресном пространстве данных со смещением __AVR_PM_BASE_ADDRESS__. Если этот макрос не определён, эта функция недоступна. Если определён, адресное пространство линейно и нет необходимости помещать .rodata в ОЗУ. Это обрабатывается по умолчанию файлом описания линковщика, и в настоящее время доступно для avrtiny и avrxmega3. Более удобно, нет необходимости использовать адресные пространства, такие как __flash, или функции, такие как атрибут progmem и pgm_read_*.

__AVR_HAVE_FLMAP__

Этот макрос определён при соблюдении следующих условий:

  • Устройство имеет бит NVMCTRL_CTRLB.FLMAP. Это относится к устройствам AVR64* и AVR128*.
  • В момент сборки ассемблером неизвестно, какая эмуляция будет использоваться.

Это подразумевает, что компилятор настроен с GNU Binutils, которые реализуют PR31124.

__AVR_RODATA_IN_RAM__

Этот макрос не определён, когда код компилируется для базовой архитектуры.

Когда код компилируется для устройства, макрос определён как 1, если секции только для чтения данных размещены в ОЗУ; и определён как 0 в противном случае.

__WITH_AVRLIBC__

Компилятор настроен для совместной работы с AVR-Libc. См. опцию конфигурации --with-avrlibc.

__HAVE_DOUBLE_MULTILIB__

Определён, если -mdouble= выступает как опция многокомпиляции.

__HAVE_DOUBLE32__
__HAVE_DOUBLE64__

Определён, если компилятор поддерживает 32-битный double соответственно 64-битный double. Фактическое расположение задаётся опцией -mdouble=.

__DEFAULT_DOUBLE__

Размер в битах double, если -mdouble= не задана. Для тестирования расположения double в программе используйте встроенный макрос __SIZEOF_DOUBLE__.

__HAVE_LONG_DOUBLE32__
__HAVE_LONG_DOUBLE64__
__HAVE_LONG_DOUBLE_MULTILIB__
__DEFAULT_LONG_DOUBLE__

Аналогично вышесказанному, но для long double вместо double.

__WITH_DOUBLE_COMPARISON__

Отражает опцию конфигурации --with-double-comparison={tristate|bool|libf7} configure и определён как 2 или 3.

__WITH_LIBF7_LIBGCC__
__WITH_LIBF7_MATH__
__WITH_LIBF7_MATH_SYMBOLS__

Отражает опцию конфигурации --with-libf7={libgcc|math|math-symbols} configure.

3.19.6.4 Внутренние параметры AVR

Следующие параметры используются внутри компилятора и для связи между файлами спецификаций устройства и самим компилятором. Вам не нужно устанавливать эти параметры вручную, в частности, они не являются параметрами оптимизации. Неправильное использование этих параметров может привести к неэффективному или неправильному коду. Они документированы для полноты картины и для лучшего понимания файлов спецификаций устройств.

-mn-flash=num

Предполагается, что размер флэш-памяти равен num умноженному на 64 КБ. Это определяет, какие адресные пространства __flashN доступны.

-mflmap

Устройство имеет поле FLMAP в специальном регистре NVMCTRL_CTRLB.

-mrmw

Предполагается, что устройство поддерживает инструкции Read-Modify-Write XCH, LAC, LAS и LAT.

-mshort-calls

Предполагается, что RJMP и RCALL могут обращаться к всей программе памяти. Этот параметр используется для генерации и выбора многоязычных библиотек для устройств архитектуры avrxmega3.

-mskip-bug

Генерировать код без пропусков (CPSE, SBRS, SBRC, SBIS, SBIC ) над 32-битными инструкциями.

-msp8

Обращаться к регистру указателя стека как к 8-битному регистру, т.е. предполагать, что старший байт указателя стека равен нулю. Этот параметр используется компилятором для выбора и построения многоязычных библиотек для архитектур avr2 и avr25. Эти архитектуры смешивают устройства с и без SPH.

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-14.2.0/gcc/AVR-Options.html

Spec-Zone.ru

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