3.19.6 Параметры AVR
Эти параметры определены для реализаций AVR:
-
-mmcu=mcu -
Задаёт архитектуру набора команд (ISA) AVR или тип целевого устройства. По умолчанию для этого параметра используется
avr2.Поддерживаются следующие устройства и ISA AVR. Примечание: полная поддержка устройства состоит из кода запуска
crtmcu.o, заголовочного файла устройстваavr/io*.h, библиотеки устройстваlibmcu.aи файла device-specsspecs-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,avr64da28s,avr64da32,avr64da32s,avr64da48,avr64da48s,avr64da64,avr64da64s,avr64db28,avr64db32,avr64db48,avr64db64,avr64dd14,avr64dd20,avr64dd28,avr64dd32,avr64du28,avr64du32,avr64ea28,avr64ea32,avr64ea48,avr64sd28,avr64sd32,avr64sd48. 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,avr16la14,avr16la20,avr16la28,avr16la32,avr32da28,avr32da28s,avr32da32,avr32da32s,avr32da48,avr32da48s,avr32db28,avr32db32,avr32db48,avr32dd14,avr32dd20,avr32dd28,avr32dd32,avr32du14,avr32du20,avr32du28,avr32du32,avr32ea28,avr32ea32,avr32ea48,avr32eb14,avr32eb20,avr32eb28,avr32eb32,avr32la14,avr32la20,avr32la28,avr32la32,avr32sd20,avr32sd28,avr32sd32. avrxmega4-
Устройства «XMEGA» с объёмом памяти программ более 64 КиБ и до 128 КиБ. mcu =
atxmega64a3,atxmega64a3u,atxmega64a4u,atxmega64b1,atxmega64b3,atxmega64c3,atxmega64d3,atxmega64d4,avr128da28,avr128da28s,avr128da32,avr128da32s,avr128da48,avr128da48s,avr128da64,avr128da64s,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. Этот параметр действует только на устройствах с сокращённым ядром Tiny, таких как ATtiny40. См. также атрибут переменной
absdata. -
-maccumulate-args -
Накапливать исходящие аргументы функций и выделять/освобождать необходимое пространство стека для исходящих аргументов функций один раз в прологе/эпилоге функции. Без этого параметра исходящие аргументы помещаются в стек перед вызовом функции и извлекаются после него.
Извлечение аргументов из стека после вызова функции может быть ресурсоёмким на AVR, поэтому накопление стекового пространства может уменьшить размер исполняемого файла, так как аргументы не нужно удалять из стека после каждого такого вызова.
Этот параметр может привести к уменьшению размера кода функций, выполняющих несколько вызовов функций, принимающих аргументы через стек, например вызовов printf-подобных функций.
-
-mbranch-cost=cost -
Задаёт стоимость ветвления для инструкций условного перехода равной cost. Разумными значениями для cost являются небольшие неотрицательные целые числа. Значение стоимости ветвления по умолчанию равно 0.
-
-mcall-prologues -
Прологи и эпилоги функций разворачиваются в вызовы соответствующих подпрограмм. Размер кода при этом уменьшается.
-
-mfuse-add -mno-fuse-add-mfuse-add=level-
Оптимизировать косвенные обращения к памяти на устройствах с сокращённым ядром 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 -
Обработчики прерываний (ISR) могут использовать псевдоинструкцию
__gcc_isr, поддерживаемую GNU Binutils. Если этот параметр включён, данную возможность всё ещё можно отключить для отдельных ISR с помощью атрибута функцииno_gccisr. Эта возможность активирована по умолчанию, если включена оптимизация (но не с -Og, см. Параметры, управляющие оптимизацией) и если GNU Binutils поддерживает PR21683. -
-mint8 -
Считать
int8-битным целым числом. Это влияет на размеры всех типов: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 в командную строку компоновщика.Релаксация переходов (jump relaxing) выполняется компоновщиком, так как смещения переходов неизвестны до размещения кода. Следовательно, сгенерированный компилятором код ассемблера остаётся тем же, но инструкции в исполняемом файле могут отличаться от инструкций в коде ассемблера.
Релаксация должна быть включена, если требуются заглушки (stubs) компоновщика; см. раздел о
EINDи заглушках компоновщика ниже. -
-mrodata-in-ram -mno-rodata-in-ram-
Размещать секции
.rodataдля данных только для чтения в ОЗУ или в памяти программ соответственно. Для большинства устройств выбора нет, и этот параметр действует скорее как утверждение (assertion).Начиная с версии 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 в командную строку драйвера компилятора. Пользователь берёт на себя ответственность за передачу соответствующим подпроцессам (собственно компилятору, ассемблеру и компоновщику) надлежащих параметров командной строки. Это означает, что пользователь должен предоставить собственный файл спецификаций устройства с помощью -specs=path-to-specs-file. В параметре -mmcu=mcu больше нет необходимости.
Этот параметр также может служить заменой прежнего способа указания пользовательских файлов device-specs, при котором требовалось, чтобы -B some-path указывал на каталог, содержащий папку с именем
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не сохраняется и не восстанавливается в прологе/эпилоге функции или обработчика прерывания. - Для косвенных вызовов функций и вычисляемого goto (computed goto) компоновщик генерирует заглушки (stubs). Заглушки — это промежуточные площадки для перехода, иногда также называемые трамплинами (trampolines). Таким образом, косвенный вызов/переход выполняет переход к такой заглушке. Заглушка содержит прямой переход по желаемому адресу.
- Релаксация компоновщика должна быть включена, чтобы компоновщик корректно генерировал заглушки во всех ситуациях. См. параметр компилятора -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(сокращение от generate stubs) следующим образом:LDI r24, lo8(gs(func)) LDI r25, hi8(gs(func))
- Окончательное расположение этой метки находится в сегменте кода вне сегмента, где расположены заглушки.
- Адрес метки берётся с помощью модификатора
- Компилятор генерирует такие модификаторы
gsдля меток кода в следующих ситуациях:- Взятие адреса функции или метки кода.
- Вычисляемый goto (computed 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.19.6.2 Обработка специальных функциональных регистров RAMPD, RAMPX, RAMPY и RAMPZ
Некоторые устройства AVR поддерживают объём памяти больше диапазона 64 КиБ, адресуемого 16-битными указателями. Для доступа к ячейкам памяти за пределами этого диапазона 64 КиБ содержимое регистра RAMP используется как старшая часть адреса: адресный регистр X, Y, Z объединяется со специальным функциональным регистром RAMPX, RAMPY, RAMPZ соответственно для получения расширенного адреса. Аналогично, RAMPD используется вместе с прямой адресацией.
- Код запуска инициализирует специальные функциональные регистры
RAMPнулём. - Если используется именованное адресное пространство, отличное от generic или
__flash, тоRAMPZустанавливается должным образом перед выполнением операции. - Если устройство поддерживает ОЗУ размером более 64 КиБ и компилятору требуется изменить
RAMPZдля выполнения операции,RAMPZсбрасывается в ноль после операции. - Если устройство содержит определённый регистр
RAMP, пролог/эпилог ISR сохраняет/восстанавливает этот SFR и инициализирует его нулём на случай, если код ISR может (неявно) использовать его. - ОЗУ размером более 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, если секции
.rodataдля данных только для чтения расположены в ОЗУ, и равным 0 в противном случае. __WITH_AVRLIBC__-
Компилятор сконфигурирован для использования совместно с AVR-Libc. См. параметр конфигурации --with-avrlibc.
__HAVE_DOUBLE_MULTILIB__-
Определен, если -mdouble= действует как параметр multilib.
__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}и определяется как2или3. __WITH_LIBF7_LIBGCC____WITH_LIBF7_MATH____WITH_LIBF7_MATH_SYMBOLS__-
Отражает параметр конфигурации
--with-libf7={libgcc|math|math-symbols}.
3.19.6.4 Внутренние параметры AVR
Следующие параметры используются внутри компилятора и для взаимодействия между файлами specs устройств и непосредственно компилятором. Устанавливать эти параметры вручную не требуется, в частности, они не являются параметрами оптимизации. Неправильное использование этих параметров может привести к неоптимальному или некорректному коду. Они описаны здесь для полноты документации, а также для лучшего понимания файлов specs устройств.
-
-mn-flash=num -
Предполагать, что объем флеш-памяти равен num раз по 64 КиБ. Это определяет, какие адресные пространства
__flashNдоступны. -
-mflmap -
Устройство содержит битовое поле
FLMAP, расположенное в регистре специальных функцийNVMCTRL_CTRLB. -
-mrmw -
Предполагать, что устройство поддерживает инструкции типа «чтение-модификация-запись»
XCH,LAC,LASиLAT. -
-mshort-calls -
Предполагать, что
RJMPиRCALLмогут адресовать всю память программ. Этот параметр используется для генерации и выбора multilib для устройств архитектурыavrxmega3. -
-mskip-bug -
Генерировать код без пропусков (
CPSE,SBRS,SBRC,SBIS,SBIC) через 32-битные инструкции. -
-msp8 -
Обрабатывать регистр указателя стека как 8-битный регистр, то есть предполагать, что старший байт указателя стека равен нулю. Этот параметр используется компилятором для выбора и сборки библиотек multilib для архитектур
avr2иavr25. В этих архитектурах смешаны устройства с наличием и отсутствиемSPH.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-14.4.0/gcc/AVR-Options.html