22 февраля 2014 г.

Книга: ассемблер AVRA

Ассемблер AVRA

AVRA является ассемблером для AVR микроконтроллеров фирмы Atmel, и он почти полностью согласован с собственным Atmel ассемблером AVRASM32. Если вы решились писать на ассемблере в linux не используя wine и AVRStudio, вам придется работать в AVRA.


Различия между AVRA и атмеловским AVRASM32
Существуют некоторые различия между оригинальным Atmel-овским ассемблером AVRASM32 и AVRA.
  • Поддержка некоторых дополнительных директив препроцессора (.define, .undef, .ifdef, .ifndef, .if, .else, .endif, .elif, .elseif, .warning)
  • Не все параметры командной строки поддерживаются. Указание от дельного файла для eeprom(-e) не поддерживается. Все данные для eeprom помещаются в файл называемый program.eep.hex и всегда в Intel hex формате. Другие форматы hex файлов, помимо Intel на данный момент не поддерживаются.
  • Опережающие ссылки(ссылка на класс, переменную или функцию, которые объявлены, но еще не определены) не поддерживаются для .ifdef и .ifndef директив. Это гарантирует , что директивы такие как .ifdef и .undef будут работать правильно. Если вы знакомы с языком программирования C , вы легко это получите в AVRA. 
  • Расширенная поддержка макросов в AVRA имеет некоторые новые функции для написания гибких макросов. Это должно увеличить возможность повторного использования кода например построить вашу собственную библиотеку.
  • Поддержка отладки, AVRA создает coff файл каждый раз когда сборка завершается успешно. Это файл так же как и в AVR Studio или любой другой coff совместимом отладчике используется для имитации или эмуляции программы.
  • Мета теги времени сборки. Это поможет вам отслеживать версии вашего программного обеспечения, а также может быть использовано для создания заказных серийных номеров.

Особенности спользования директив
AVRA предлагает целый ряд директив, которые не являются частью Atmel ассемблера. Эти директивы должны помочь вам создать универсальный код, который может быть разработан более модульным.

Директива .define
Чтобы задать константу, используйте .define . Это то же самое что и .equ, только более C стиле. Имейте ввиду что AVRA не чувствительна к регистру. Не смешивайте .def и .def ine, потому что .def используется только для регистров. Это сделано для обратной совместимост и с Atmel-овским AVRASM32.
Вот пример того как использовать .define:
.define network 1
Теперь «network» установлена значение 1. Вы можете собрать определенные части вашего кода в зависимости от определителей или переключателей. Вы можете проверить ваши определенные переменные на существование (.ifdef и .ifndef ), а также на значение которое они подcтавляю. В следующем коде показан способ предотвратить сообщение об ошибке при тестировании неопределенной константы. Условные директивы всегда должны заканчиваться директивой .endif
.ifndef network
.define net work 0
.endif



Директивы .if и .else
Три строчки последнего примера устанвливают значения по умолчанию для «network». В следующем примере, вы увидете как мы можем использовать значения по умолчанию. Если не была определена ранее, она устанавливается в ноль. Теперь вы можете проверить , входит ли поддержка сети в процесс сборки.
.if network = 1
.include "include\tcpip.asm"
.else
.include "include\dummynet.asm"
.endif

Во второй части листинга выше вы видите использование .else, которая определяет часть которая будет выполнена если выражение в предыдущем .if не равно. Вы также можете использовать другое выражение для проверки другого выражения. Для этой цели используется .elif , что означает «else if». Всегда закрывайте эту условную часть «.endif »


Директива .error
Эта директива может быть использована чтобы выдавать ошибки, если часть кода достигла того, чего не должна была достигнута. В следующем примере показано как остановить процесс сборки ,если имеет значение то что значение не было установлено.
.ifndef network
.error "network is not configured!" ;the assembler stops here



Директивы .nolist и .list
Вывод списка файлов может быть остановлено этими двумя директивами. После того как только avra обнаруживает при сборке .nolist , это останавливает вывод списка файлов. После того как директива .list обнаружена, она продолжает нормальный вывод файлов.


Директива .includepath
По умолчанию, любой файл, который включается изнутри файла с исходным кодом, должен иметь либо только имя файла полный абсолютный путь к файлу. С директивой .includepath вы можете установить дополнительные пути поиска файлов. Кроме того вы можете добавить множество нужных вам путей. Убедитесь что нет схожих имен файлов в разных включениях, потому что , тогда не ясно какой из них avra использовать.








Установка AVRA в Linux
Нам понадобиться именно последняя версия avra - 1.3.0, а не содержащаяся в стандартном репозитории версия 1.2.3. Почему? Потому, что она спокойно воспринимает записи #ifndef ,#define ,#pragma в заголовочных файлах (эти директивы появились в AVRASMv2), вы конечно можете исправить их на .ifndef , .define, а #pragma игнорировать, но в версии 1.3.0 это уже учтено.
Качаем архив
wget http://downloads.sourceforge.net/project/avra/1.3.0/avra-1.3.0.tar.bz2


распаковываем
tar -xf avra-1.3.0.tar.bz2


переходим в папку с src-файлами
cd avra-1.3.0/src
Для сборки программе очень нужно, чтобы в папке src лежали файлы NEWS, README, AUTHORS и ChangeLog, которых там нет.
README, AUTHORS лежат в соседней папке, перенесем их:
cp ../AUTHORS ../README ../src
Двух других файлов нигде нет, создадим их пустыми :
touch ChangeLog NEWS
Теперь по порядочку выполняем команды:
aclocal
autoconf
automake -a
./configure
sudo make
sudo make install

Все готово. Проверяем:
avra --version
Получаем:
AVRA: advanced AVR macro assembler Version 1.3.0 .......


Теперь скопируем папку includes (содержащую *.def файлов) в /usr/share/avra:
cd ..
sudo mv includes/ /usr/share/avra

Для проверки работы напишем простейшую тестовую программу.
.includepath "/usr/share/avra/includes/" ; Папка с файлами заголовками
.include "m16def.inc" ; Используем ATMega16
; RAM
;=====================================================
.DSEG
; Сегмент ОЗУ
; FLASH
;===================================================
.CSEG
; Кодовый сегмент
; EEPROM
;==================================================
.ESEG
; Сегмент EEPROM
; FLASH
;===================================================
main:
ldi r19 , 0xFF ;
out DDRB, r19
REB:
ldi r17, 0xFF
Program:
out PORTB, r17
rjmp Program

Программа даже не мигает светодиодом, а просто светит всем портом B.
Сохраните файл с расширением .s, например first.s, и перейдя в папку с программой введите:
avra first.s

У вас может выскочить ошибка такого рода:
/usr/share/avra/includes/m16def.inc(534) : Error : Line to long
Это значит, придется открыть /usr/share/avra/includes/m16def.inс и укоротить длиннющий комментарий в 534 строке. После того все должно работать.

В итоге должно вывестись что нибудь вроде этого:
done
Used memory blocks:
Assembly complete with no errors.
Segment usage:
   Code      :        5 words (10 bytes)
   Data       :        0 bytes
   EEPROM:      0 bytes


2 комментария:

  1. How to Play Baccarat - World's #1 Site for 2021
    Baccarat is a classic game where you take your opponent to the dealer's left to 바카라 사이트 pick youtube to mp3 the best 인카지노 hand. The game is played in a set of 3s,

    ОтветитьУдалить
  2. Lucky Club Online Casino Site - LuckyClub Live
    Lucky Club Online Casino Review 2021. Established: 2015. Established: 2015. Established: 2015. Established: 2014. luckyclub Established: 2014.

    ОтветитьУдалить