3.19.6 AVR Параметры
Эти параметры определены для реализаций AVR:
-
-mmcu=mcu -
Укажите архитектуру набора команд AVR (ISA) или тип устройства. По умолчанию для этого параметра установлено значение
avr2.Поддерживаются следующие устройства и наборы команд 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,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. Включено по умолчанию.
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