останется эффективным по директиве .org, но не последует по директивам
.cseg/.eseg/.dseg (каждый сегмент выделяется отдельно).
Синтаксис: |
|
|
.OVERLAP |
|
|
.NOOVERLAP |
|
|
Пример: |
|
|
.overlap |
|
|
.org 0 |
|
; Секция #1. |
rjmp |
default |
|
.nooverlap.org 0 |
; Секция #2. |
|
rjmp |
RESET |
; Здесь нет ошибки. |
.org 0 |
|
; Секция #3. |
rjmp |
RESET |
; Ошибка, так как есть перекрытие с секцией #2. |
Типичное использование этого – устанавливать некоторую форму кода или данных по умолчанию, которые позже могут модифицироваться перекрытием с другими кодом или данными без необходимости вывода сообщения о перекрытии.
#pragma общего назначения
Синтаксис:
1) #pragma warning range byte option – предупреждение о байтовом диапазоне;
2)#pragma overlap option – перекрытие;
3)#pragma error instruction – ошибки инструкций;
4)#pragma warning instruction – предупреждения по поводу инструкций.
Описание:
1.Ассемблер оценивает постоянные целые выражения как 64 - битные знаковые целые. Когда такие выражения использованы как непосредственные операнды, они должны быть включены в количество битов, требующихся команде. Для большинства операндов выход из диапазона вызовет сообщение ошибки "операнд из диапазона". Тем не менее непосредственные байтовые операнды для команд ldi, cpi, ori, andi, subi, sbci имеют несколько возможных интерпретаций, в зависимости от
опции (option):
option = integer: операнд непосредственно оценен как целое, и если его значение за пределами диапазона (-128 ... 255), будет дано предупреждение. Ассемблер не знает, что предполагает пользователь: операнд целым, со знаком или без знака, следовательно, он допускает любое значение со знаком или без знака, которое умещается в байт.
option = overflow (умолчание): операнд оценивается как байт без знака, и любые биты знака будут проигнорированы. Эта опция пригодна
35
при работе с битовыми масками, когда интерпретация целого должна вызывать массу предупреждений, подобно ldi r16, ~ ((1 << 7) | (1 << 3)).
option = none: не выводится никаких предупреждений о диапазоне для байтовых операндов. Не рекомендуется.
2.Если две секции кода, размещенные в памяти директивой .org, перекрываются, передается сообщение об ошибке. Опции модифицируют это поведение следующим образом:
option = ignore: игнорирует условия перекрытия и не выдаются никакие ошибки, никакие предупреждения. Не рекомендуется.
option = warning: при обнаружении перекрытия выдается предупреждение.
option = error: считает перекрытие как ошибку, это рекомендовано устанавливать по умолчанию.
3.Использование инструкций, которые не поддерживаются на выбранном устройстве, вызывает ошибку Ассемблера (поведение по умолчанию).
4.Использование инструкций, которые не поддерживаются на выбранном устройстве, вызывает предупреждение Ассемблера.
#pragma, связанная с маркой МК AVR
Синтаксис:
1)#pragma AVRPART ADMIN PART_NAME string
2)#pragma AVRPART CORE CORE_VERSION version-string
3)#pragma AVRPART CORE INSTRUCTIONS_NOT_SUPPORTED mnemonic[ operand[,operand] ][:...]
4)#pragma AVRPART CORE NEW_INSTRUCTIONS mnemonic
[operand[,operand]][:...]
5)#pragma AVRPART MEMORY PROG_FLASH size
6)#pragma AVRPART MEMORY EEPROM size
7)#pragma AVRPART MEMORY INT_SRAM SIZE size
8)#pragma AVRPART MEMORY INT_SRAM START_ADDR address
Описание:
Эти директивы предназначены для указания различных характеристик
МК и могут быть использованы во включаемом файле (partdef.inc). Естественно, нет причины использовать эти pragma непосредственно в программах пользователя.
Вpragma недопустимы макросы препроцессора. Числовые аргументы
ввыражениях должны быть целыми числами в десятичном, шестнадцатеричном, восьмеричном или двоичном формате. Строковые аргументы не должны быть заключены в кавычки. В рragma определяются следующие характеристики МК:
1. Имя МК, например, ATmega8.
36
2.Версия ядра AVR. Это определяет основные поддерживаемые инструкции. Версии ядра к настоящему времени: V0, V0E, V1, V2 и V2E.
3.Разделенный список инструкций (команд), не поддерживаемых этим МК, относительно версии ядра.
4.Разделенный список дополнительных инструкций (команд), поддерживаемых этим МК, относительно основной версии ядра.
5.Размер флэш-памяти программ в байтах.
6.Размер EEPROM-памяти в байтах.
7.Размер SRAM-памяти в байтах.
8.Стартовый адрес SRAM-памяти 0x60 для основных МК AVR, 0x100 или более для МК с расширенным В/В.
Примеры:
Имейте в виду, что комбинация параметров в этих примерах не описывает реальный МК AVR!
1) #pragma AVRPART ADMIN PART_NAME ATmega32
2) #pragma AVRPART CORE CORE_VERSION V2
3) #pragma AVRPART CORE INSTRUCTIONS_NOT_SUPPORTED movw:break:lpm rd,z
4) #pragma AVRPART CORE NEW_INSTRUCTIONS lpm rd,z+
5) #pragma AVRPART MEMORY PROG_FLASH 131072
6) #pragma AVRPART MEMORY EEPROM 4096
7) #pragma AVRPART MEMORY INT_SRAM START_ADDR 0x60 8) #pragma AVRPART MEMORY INT_SRAM SIZE 4096
# (пустая директива)
Синтаксис:
#
Описание:
Неудивительно, что эта директива ничего не делает. Единственная причина, по которой она существует, это удовлетворить стандарту ANSI C.
3.3.Операторы AVRASM2
(#)Stringification ( выстроить по порядку в строку)
Оператор stringification преобразует в текстовую строку параметр функции, вызывавшей макрос.
Пример:
#define MY_IDENT(X) .db #X, '\n', 0
Если параметр назван подобно этому
MY_IDENT(FooFirmwareRev1),
результатом действия #X будет
.db "FooFirmwareRev1", '\n', 0
37
Примечания:
1.Stringification может быть использован только с параметрами в макросе функционального типа.
2.Значение параметра используется буквально, то есть это не будет расширено перед stringification.
(##) Concatenation (конкатенация – взаимная связь, сцепление) Оператор конкатенации объединяет (конкатенирует) два параметра
препроцессора, формируя новый параметр. Это возможно, когда, по крайней мере, один из параметров является параметром в макросе функционального типа.
Пример:
#define FOOBAR subi #define IMMED(X) X##i #define SUBI(X,Y) X ## Y
Когда макросы IMMED и SUBI вызываются как здесь: IMMED(ld) r16,1
SUBI(FOO,BAR) r16,1
они могут быть расширены как ldi r16,0x1
subi r16,0x1
Примечание:
В функциональном типе макроса аргумент используется буквально, т.е., макрос не будет расширен перед конкатенацией.
Параметр, сформированный конкатенацией, подвергнется дальнейшему расширению. В приведенном примере параметры FOO и BAR сначала конкатенировались в FOOBAR, а затем FOOBAR был расширен в subi.
3.4. Предопределенные макросы
Препроцессор имеет множество предопределенных макросов. Все имена начинаются и заканчиваются двумя подчеркиваниями _ _ без пробела между ними. При этом два подчеркивания сливаются __. Для избежания конфликтов, в определениях макросов пользователи не должны использовать такие подчеркивания в других именах.
Предопределенные макросы встроены или установлены директивой #pragma, как показано в табл. 8.
38
|
|
Предопределенные макросы |
|
Таблица 8 |
||
|
|
|
|
|
||
Имя |
Тип |
Установлен |
|
Описание |
|
|
|
|
|
|
|
||
__AVRASM_VER |
Integer |
Встроен |
Версия Ассемблера, закодированная как |
|
||
SION__ |
|
|
(1000* major + minor) |
|
|
|
__CORE_VER |
String |
#pragma |
Версия ядра. AVR |
|
|
|
SION__ |
|
|
|
|
||
|
|
Формирует формат даты "Jun 28 2006", |
|
|||
__DATE__ |
String |
built-in |
|
|||
см. опцию командной строки -FD |
|
|||||
|
|
|
|
|||
|
|
|
Формирует |
формат |
времени: |
|
__TIME__ |
String |
built-in |
"HH:MM:SS", см. опцию командной |
|
||
|
|
|
строки -FT |
|
|
|
__CENTURY__ |
Integer |
built-in |
Столетие (естественно) 20 |
|
|
|
__YEAR__ |
Integer |
built-in |
Формирует год в столетии (0-99) |
|
||
__MONTH__ |
Integer |
built-in |
Формирует месяц (1-12) |
|
|
|
__DAY__ |
Integer |
built-in |
Формирует день (1-31) |
|
|
|
__HOUR__ |
Integer |
built-in |
Формирует час (0-23) |
|
|
|
__MINUTE__ |
Integer |
built-in |
Формирует минуты (0-59) |
|
|
|
__SECOND__ |
Integer |
built-in |
Формирует секунды (0-59) |
|
|
|
__FILE__ |
String |
built-in |
Имя исходного файла |
|
|
|
__LINE__ |
Integer |
built-in |
Номер текущей строки исходного файла |
|
||
__PART_NAME__ |
String |
#pragma |
Название МК AVR |
|
|
|
__partname__ |
Integer |
#pragma |
Название МК пересылается в величину |
|
||
__PART_NAME__, |
|
|
||||
|
|
|
например: #ifdef __ATmega8__ |
|
|
|
__CORE_corever |
|
|
Версию ядра |
пересылает в |
величину |
|
Integer |
#pragma |
__CORE_VERSION__, |
|
|
||
sion__ |
|
|
например: #ifdef __CORE_V2__ |
|
||
|
|
|
|
|||
4. НАСТРОЙКА АССЕМБЛЕРА
4.1. Опции
Некоторые установки программы могут быть изменены через пункт меню Assembler Options из выпадающего списка Project. Если выбрать этот пункт, то появится диалоговое окно (рис. 2 ).
В прямоугольнике "Hex Output Format " можно выбрать формат выходного файла (как правило, используется интеловский). Однако это не влияет на объектный файл (используемый AVR Studio), который всегда имеет один и тот же формат и расширение OBJ. Если в исходном файле присутствует сегмент EEPROM, то будет также создан файл с расширением EEP. Установки, заданные в данном окне, запоминаются и при следующем запуске программы их нет необходимости переустанавливать.
39