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» с ядром 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. Включено по умолчанию.
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