Материал: 1755

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

зависимости от множества обстоятельств: одно в пакетном и другое в диалоговом режимах. Эффект директив формата должен быть протестирован. Рекомендовано помещать следующую строку в исходный файл для тестирования:

#message "__DATE__ =" __DATE__ "__TIME__ =" __TIME__

Она напечатает величину даты и времени макроса, когда программа ассемблирована, чтобы облегчать проверку (см. директиву #message).

Несколько важных описателей формата strftime (подробнее см. руководство по strftime(3)):

%Y – год, 4 цифры; %y – год, 2 цифры;

%m – номер месяца (01–12); %b – укороченное имя месяца; %B – полное имя месяца;

%d – день месяца (01–31);

%a – укороченное имя дня недели; %A – полное имя дня недели;

%H – час, 24-часовые часы (00–23); %I – час, 12-часовые часы (01–12);

%p – "до" или "после полудня" для 12-часовых часов; %M – минуты (00–59);

%S – секунды (00–59).

4.3.Преобразователь XML

Вэтом подразделе рассматриваются следующие вопросы:

Размещение и вызов.

Примеры:

Создание включаемого файла Ассемблера. Создание заголовочного файла для компилятора IAR. Создание заголовочного файла для GCC.

Соглашения об именах файлов.

Преобразователь XML является отдельным средством командной строки, используемым для создания включаемых файлов Ассемблера и заголовочных файлов Cи из файлов описания МК (XML), используемых

AVR Studio.

Все включаемые файлы для AVR Ассемблера в дистрибутиве AVR Studio получены с помощью этого средства. Оно же используется для получения заголовочных файлов для компиляторов Cи: AVR GCC, IAR и "generic". У программы преобразователя XML пока нет графического интерфейса пользователя, и она должна быть вызвана из командной строки.

45

4.3.1. Размещение и вызов

Преобразователь XML располагается здесь:

C:\Program Files\Atmel\AVR Tools\AvrStudio4\xmlconvert.exe

Для доступа к папке преобразователя XML нужно прописать путь к нему. Это можно сделать так: откройте окно DOS, используя меню Пуск > Все программы > Стандартные > Командная строка, и введите следующую команду:

PATH = %PATH%;"C:\Program Files\Atmel\AVR Tools\AvrStudio4"

Напечатав после командного приглашения xmlconvert без аргументов, вы получите сообщение об использовании этой программы:

xmlconvert: No source file specified не определен исходный файл

Использование: xmlconvert[-foutput-format][-o outdir][-1nbclV] infile… Выходные форматы: a[vrasm] | g[cc] | i[ar] | c[c] (generic c)

Опции:

-1 = Don't generate AVRASM2 #pragma's не генерирует AVRASM2 #pragma's.

-n = Don't warn about bad names не предупреждает о плохих именах. -b = use DISPLAY_BITS attribute to limit bit definitions – использование

DISPLAY_BITS атрибута для ограничения битовых определений.

-c = Add some definitions for compatibility with old files добавлять некоторые определения для совместимости со старыми файлами.

-l = Produce linker file (IAR only) компоновка файла (IAR только)

-q = Allow linked register quadruple (32-bit) – допускается объединение четырех регистров (32 бита).

-V = print xmlconvert version number распечатка номера версии xmlconvert.

Файлы описания МК AVR находятся в папке:

C:\Program Files\Atmel\AVR Tools\Partdescriptionfiles. Для каждого МК по одному файлу.

4.3.2. Примеры

Рассмотрим несколько примеров:

1. Создание включаемого файла Ассемблера для АТmega128. Создайте папку С:\Tmp. Запишите в командной строке следующий

текст:

xmlconvert -c -o c:\Tmp "C:\Program Files\Atmel\AVR Tools\ Partdescriptionfiles\ATmega128.xml"

Эта команда создает включаемый файл для АТmega128 в папке C: \Tmp. Если опция -o опущена, выходной файл будет расположен в той же

46

папке, что и входной файл. Обращение к выходному файлу будет C: \Tmp\m128def.inc.

Примечание:

Опция -c должна быть всегда использована, если созданные файлы должны быть совместимыми с существующими файлами.

2.Создание заголовочных файлы для всех МК для компилятора IAR C. Введите в командной строке текст:

cd "C:\Program Files\Atmel\AVR Tools\Partdescriptionfiles" xmlconvert - c -n -fiar -l -o C:\Work\tmp *.xml

При использовании нескольких входных файлов ставится команда cd в начале исходной папки. Опция -fiar определяет выходные файлы IAR, опция -l запрашивает компоновщик созданных файлов, опция -n подавляет некоторые предупреждающие сообщения.

Примечание:

Файловое средство компоновщика отчасти экспериментальное и в зависимости от МК может потребоваться редактирование результирующего файла перед его применением. Пожалуйста, обратитесь

кописаниям IAR об этих файлах.

3.Создание заголовочного файла для компилятора AVR GCC для всех

МК.

cd "C:\Program Files\Atmel\AVR Tools\Partdescriptionfiles" xmlconvert -c -n -fgcc -o C:\Work\tmp *.xml

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

4.3.3. Соглашения об именах файлов

XML-файлы описания МК всегда называются devicename.xml. Используются следующие соглашения для определения имени inc-файлов для МК различных семейств AVR (где nnn – число в наименовании МК,

например, 2313 в ATtiny2313):

Классическая серия AVR: AT90Snnn –> nnndef.inc. Пример: AT90S8515 –> 8515def.inc.

Серия Tiny AVR: ATtinynnn –> tnnnndef.inc. Пример: ATtiny13 –> tn13def.inc.

Серия Mega AVR: ATmegannn –> mnnndef.inc. Пример: ATmega644 –> m644def.inc.

Серия CAN AVR: AT90CANnnn –> cannnndef.inc. Пример: AT90CAN128 –> can128def.inc.

Серия PWM AVR: AT90PWMnnn –> pwmnnndef.inc. Пример: AT90PWM3 –> pwm3def.inc.

47

При создании заголовочных файлов для Cи-компиляторов (IAR, GCC) преобразователь XML следует за соглашениями, используемыми изготовителями компилятора. Например, как IAR, так и GCC называют файл заголовка ATmega128: iom128.h. Преобразователь XML подчиняется этим соглашениям, поскольку они известны и документированы.

Если выбран формат ''generic C'', файлы заголовка называются device.h, например, ATmega128.h.

4.4. Сообщения об ошибках

После компиляции программы появляется окно сообщений, в котором будут перечислены все обнаруженные компилятором ошибки. При выборе строки с сообщением об ошибке строка исходного файла, в которой найдена ошибка, становится красной. Если же ошибка находится во вложенном файле, то этого подсвечивания не произойдёт.

Если по строке в окне сообщений дважды щелкнуть правой кнопкой, то окно с указанной ошибкой становится активным и курсор помещается в начале строки содержащей ошибку. Если же файл с ошибкой не открыт (например, вложенный файл), то он автоматически откроется.

Учтите, что если вы внесли изменения в исходные тексты (добавили или удалили строки), то информация о номерах строк в окне сообщений не является корректной, пока вы не перекомпилировали текст.

Дефекты выявленные в Ассемблере 2 AVR:

Дефект #4146: продолжение строки не работает в макро вызовах. Программная иллюстрация этого дефекта:

.macro m ldi @0, @1 .endm m r16,\

0

При этом нет ошибки в определении макроса (#define).

Потеря конца строки в конце файла. Проблема с последней строкой исходного файла состоит в том, что AVRASM2 пропускает конец строки. Сообщения об ошибке могут ссылаться на неправильные имя файла/номера строки. В некоторых случаях причиной могут быть синтаксические ошибки в последней строке включаемых файлов.

Комментарии в вызовах макроса. Есть известный дефект,

вызывающий синтаксические ошибки в ситуациях, когда комментарии Cистиля (/* */, //) использованы в строке с макровызовами.

Операторы инкремента/декремента. Операторы инкремента/

декремента (++/--) распознаются Ассемблером, но могут вызвать сообщение о синтаксической ошибке. Если символы --1 вызовут синтаксическую ошибку, напишите этот символы через пробел: - -1.

48

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

Пример:

.ifdef FOO

nop ; здесь некоторый код

.endif rjmp label

; далее некоторый код

.equ FOO = 100 label:

nop

В этом примере FOO не определяется на данном этапе использования её в условии, и намерения программиста не ясны. Следующий, повидимому, разумный пример вызовет тот же тип ошибки:

.org LARGEBOOTSTART

;нижеследующее устанавливает RAMPZ: Z указывает на объект

;данных во флэш-памяти и обычно для использования с ELPM. ldi ZL, low (cmdtable * 2)

ldi ZH, high (cmdtable * 2)

.if ((cmdtable * 2) > 65535) ldi r16, 1

sts RAMPZ, r16

.endif

; далее следует код: cmdtable: .db "foo", 0x0

Причина этого в том, что результат вычисления условия повлияет на значение адреса метки, которое, в свою очередь, может повлиять на результат вычисления условия, и так далее.

Вплоть до AVRASM 2.0.30 включительно эти ситуации не всегда правильно обнаруживались, вызывая непонятные сообщения об ошибках. Начиная с версии 2.0.31 явных сообщений об ошибках не было.

С условными операторами препроцессора (#if/#ifdef) ситуация отчетливо выраженная и этот тип ошибки никогда не произойдет.

Сообщения об ошибках. Иногда сообщения об ошибках могут быть трудными для понимания. Даже простая опечатка может привести к сообщению об ошибке, подобно этому:

myfile.asm(30): ошибка: синтаксическая ошибка, неожиданный FOO, где FOO представляет малопонятную тарабарщину. Ссылочные имя файла и номер строки при этом правильные.

Defined неправильно распознаётся как ключевое слово Ассемблера.

Ключевое слово defined (см. на стр.18 определение функции DEFINED)

49