Spec-Zone.ru › GCC 13

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» с ядром Tiny с объёмом памяти программы от 512 байт до 4 Кбайт. mcu = attiny4, attiny5, attiny9, attiny10, attiny102, attiny104, attiny20, attiny40.

avr1

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

-mabsdata

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

-maccumulate-args

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

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

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

-mbranch-cost=cost

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

-mcall-prologues

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

-mdouble=bits
-mlong-double=bits

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

-mgas-isr-prologues

Процедуры обработки прерываний (ISR) могут использовать псевдоинструкцию __gcc_isr , поддерживаемую GNU Binutils. Если этот параметр включён, функцию всё ещё можно отключить для отдельных процедур обработки прерываний с помощью атрибута функции 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 и плашкам компоновщика ниже.

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

Устройство имеет инструкции Read-Modify-Write (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_*.

__WITH_AVRLIBC__

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

__HAVE_DOUBLE_MULTILIB__

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

__HAVE_DOUBLE32__
__HAVE_DOUBLE64__

Определено, если компилятор поддерживает 32-битные двойные и/или 64-битные двойные. Фактическая структура определяется опцией -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 адресные пространства доступны.

-mrmw

Предполагается, что устройство поддерживает инструкции чтения-модификации-записи 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-13.3.0/gcc/AVR-Options.html

Spec-Zone.ru

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