21 февраля 2014 г.

уровень 2: ассемблер AVRA, среда программирования Geany


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

Нам понадобиться именно последняя версия 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






Среда Разработки Geany



Итак, мы научились компилировать исходный код на ассемблере. Настало время освоить какую-либо Среду Программирования, чтобы можно было сосредоточить все свои способности именно на программировании. Начнем с самой простой - Geany.


В отличие от текстовых редакторов Geany является Средой Разработки, поэтому в ней есть нужные нам три абстрактных действия: компиляция, сборка и запуск. Причем можно задать какие именно команды должны выполняться в этих действиях. Таким образом, мы получаем возможность назначить запуск avra (или gcc-avr если вы пишете на С) на действие "компиляция", и вызов avrdude на "запуск". Действие же "сборка" будем использовать для установки фьюзов.


установка Geany
sudo apt-get install geany


настройка стиля подсветки синтаксиса

Сделаем хороший стиль подсветки синтаксиса ассемблера. Для этого откроем файл: 
gedit ~/.config/geany/filedefs/filetypes.asm
и вставим в редакторе текст вот с этой страницы: http://wiki.geany.org/config/avr_asm
или тоже самое непосредственно из этого файла:
wget http://wiki.geany.org/_export/code/config/avr_asm


Сохраняем filetypes.asm



Автоматизация процесса компиляции, прошивки МК, установки фьюзов

Вариант 1 - простой и универсальный

Теперь запускаем Geany, создаем новый файл или открываем любой исходник .asm, открываем вкладку "Сборка", выбираем пункт "Установить команды сборки".
Видим вот такое окно:


В поля "Скомпилировать" и "Выполнить" (на скрине выделено оранжевым) вводим соответственно команды для компиляции и прошивки в микроконтроллер программы. Впрочем не спешите вводить именно их, далее поймете почему.

Команда для компиляции будет выглядеть так:
    avra --includepath ~/Projects/APPNOTES %f

Команда "Выполнить" задействуем для прошивки контроллера Tiny2313:
    avrdude -p t2313 -c usbasp -U flash:w:%e.hex

Пояснения:
Geany распознает 4 встроенных шаблона:
 %f - имя текущего файла (в нашем случае это Example.asm) 
 %e - имя текущего файла без расширения (Example)
 %d - путь к папке, в которой лежит текущий файл (~/Projects/AVR/Example/)
 %p - путь к текущему проекту (я не разобрался что это значит, но не важно :))

Теперь для того чтобы скомпилировать программу достаточно нажать F8 (или иконку с пирамидой и шаром), а чтобы прошить код в микроконтроллер - F5 (или иконку с шестеренками).


4) Учим распознавать тип микроконтроллера
Все хорошо, но нужно научить Geany самому распознавать тип микроконтроллера и менять опцию -p в команде заливки через avrdude. Это можно сделать заставить Geany находить и анализировать строки вида .include "m8def.inc" (если используется atmega 8) в исходном кода программы, которые указываю тип используемого микроконтроллера и должны быть в каждом asm файле.

Будем использовать такой скрипт:
PART=`grep -m 1 ".include ".*def.inc"" %f | grep -o "(tn|m)[0-9]+" | sed "s/tn/t/g"` && echo "target device: $PART" && avrdude -p $PART -c usbasp -U flash:w:"%e.hex" && exit

Эту строку нужно вбить в поле "Выполнить"

Пояснения:
  PART - строковая переменная PART, в которую заносится результат выполнения скрипта, определяющего тип контроллера
  echo "target device: $PART" - выводим в консоль название распознанного контроллера (просто так, для справки)
  avrdude -p $PART -c usbasp -U flash:w:"%e.hex" - запускаем avrdude, подставляя в него нужную опцию
  grep -m 1 ".include ".*def.inc"" %f -  находит строчку вида .include "[тут что угодно]def.inc", опция -m 1 указывает что не стоит продолжать поиск, если хотя бы 1 строка уже найдена.
  grep -o "(tn|m)[0-9]+" - из найденной строки с помощью шаблона вычленяет название контроллера. Я использую только "меги" и "тиньки", поэтому у меня указаны только tn и m. Вы можете адаптировать скрипт, например для xmega будет (tn|m|x) , для AT90S (tn|m|x|[0-9])  и так далее.
  sed "s/tn/t/g" - заменяет tn на t. так как в аппноутах Tiny2313 например зовется tn2313, а avrdude ее понимает как t2313. 

Есть одна полезная и приятная особенность данного скрипта:  так как для связки команд используется &&, то следующая команда выполняется только в случае успешного завершения предыдущей. Таким образом, если строка .include не была найдена в файле, или при прошивке что-то пошло не так - терминал останется открытым и мы сможем прочитать сообщения о случившихся ошибках.

В конечном виде команда для компиляции будет выглядеть так:
    avra --includepath ~/Projects/APPNOTES %f

А команда для прошивки так:
    PART=`grep -m 1 ".include ".*def.inc"" %f | grep -o "(tn|m)[0-9]+" | sed "s/tn/t/g"` && echo "target device: $PART" && avrdude -p $PART -c usbasp -U flash:w:"%e.hex" && exit





Фьюзы

Утилита avrdude позволяет прошивать и фьюзы, но для этого нужно по даташиту на микроконтроллер заранее вручную пересчитать их в шестнадцатеричную систему и указать avrdude. 

Команда могла бы выглядеть подобным образом:
avrdude -p $PART -c usbasp -U hfuse:w:0xХХ:m  -U lfuse:w:0xYY:m
где XX и YY заранее вычисленные hfuse и lfuse.


Учитывая высокую вероятность ошибки и крайнюю трагичность последствий этой ошибки, такой вариант прошивки фьюзов применять не станем. Вместо этого будем использовать графическую оболочку к avrdude - AVR8_Burn-O-Mat

Вот сайт этой программы: http://avr8-burn-o-mat.aaabbb.de/avr8_burn_o_mat_avrdude_gui_en.html

Качаем deb-пакет с сайта, устанавливаем...
У меня пакет уставлиться не захотел, выдавая ошибку
  dpkg: ошибка при обработке параметра avr8-burn-o-mat-2.1.2-all.deb (--install):
  анализ файла «/var/lib/dpkg/tmp.ci/control» около строки 2 пакета «avr8-burn-o-mat»:
  ошибка в строке Version «REPLACE_PROG_VERSION»: номер версии не начинается с цифры

Желающие могут скачать Sourcecode AVR8_Burn-O-Mat, и откомпилировать :), остальным  же предлагаю воспользоваться "починенным" пакетом, действуем так:
wget http://radiokot.ru/articles/52/02.zip
unzip 02.zip
dpkg -i 
avr8-burn-o-mat-2.1.2.deb

При первом запуске AVR8_Burn-O-Mat потребуется его настроить. Переходим во вкладку Settings - AVRDUDE
Видим вот такое окно:

Сюда нужно ввести путь к avrdude, к файлу с ее настройками, тип вашего программатора и порт к которому он подключен. В общем, ставим все как на скрине.
Все, после этого выбираем нужный контроллер, жмем Fuses и правим их как надо.

Перед исправлением фьюзов сначала обязательно их считывайте с кристалла! Да и вообще, поаккуратней с ними :)

Можно запуск avr8-burn-o-mat повесить на оставшееся свободным действие "Сборка". 


ИТОГО:
Работать в Geany стало достаточно удобно.
Скомпилировать - F8, или иконка с пирамидой и шаром.
Прошить - F5, или иконка с шестеренкой.
Править фьюзы - F9, или иконка с кирпичем.


___
http://radiokot.ru/articles/52/
http://greenoakst.blogspot.ru/2012/07/usbasp-ubuntu.html
http://homes-smart.ru/index.php/oborudovanie/arduino/proshivka-mikrokontrollerov-atmega-cherez-usbasp - как шить фьюзы
http://crafting.be/2013/08/avr-assemblers/







Вариант 2 - на основе MAKE файлов

Это достаточно удобная система, но может сперва показаться слишком запутанной. В папке с каждым проектом создается Makefile в котором указывается указываем модель контроллера, фьюзы, путь к компилятору и его конкретный вариант avra/gavrasm/gcc-avr, модель программатора и программа прошивки.

Если в процессе разработки мы понимаем, что далее требуется начать работать с другой конфигурацией и контроллером, редактируем три строчки в начале make-файла.

Этот принцип применим и работает в самых различных операционных системах.



Итак, создадим новый проект в Geany. В настройках выбирем: Сборка- Установить команды сборки
Появится такое меню:


Настоим - для этого нужно прописать следующие команды (названия произвольные):
 "Скомпилировать"  make compile FILE=%e
 "Прошить"              make program FILE=%e
 "Очистить"             make clean FILE=%e
 "Взвесить"             make size FILE=%e

Теперь нужно написать собственно сам make-file и положить его в папку проекта.
Это удобная система, потом при любом проекте указываем модель контроллера, фьюзы  и готово. По моему даже лучше чем выбирать из списка всё это в окнах настройки проекта. Естественно, makefile можно создать и получше  но тут будет совсем простой для простых проектов.
Не забываем про табуляцию перед командой, иначе будет ошибка. 

Файл выглядит так:
# Makefile for programming AVR in Geany
#Параметры проекта:

MK=t13
LFuse=0x7A
HFuse=0xFF

# Более глобальные переменные. 
ASM=avra
ISP=avrdude
INCLUDEDIR=/usr/share/avra/includ

compile:
    $(ASM) -I $(INCLUDEDIR) -l $(FILE) $(FILE).asm 2>&1|grep -v PRAGMA
program : $(FILE).hex
    $(ISP) -c usbasp -p $(MK)  -U flash:w:$(FILE).hex:i -U lfuse:w:$(LFuse):m -U hfuse:w:$(HFuse):m
clean:
    rm -f $(FILE).cof $(FILE).eep.hex $(FILE).hex $(FILE).obj *~
size:
    avr-size  $(FILE).hex

Теперь правим его под себя - указываем тип своего МК и fuse. 
Не забываем про табуляцию перед командой, иначе будет ошибка. Также, некоторые редакторы вставляют в файл свои невидимые символы BOM в результате чего тоже будет ошибка. Советую править Makefile используя geany, с ним проблем невидимых символов и табуляции не будет. 


Обычно выдается ошибка такого вида:
Makefile:1: *** пропущен разделитель.  Останов.

Впрочем, можно не мучатся и просто скачать данный образец:
wget https://sites.google.com/site/httpavrprogblogspotru/Makefile

ИТОГ:
В Geany доступны автоматические действия:
"Компилировать
" - 
или иконка с пирамидой и шаром, или F8
"Взвесить" -
"Прошить
" - иконка с шестеренкой, или F9


Все "наши" созданные команды содержатся в пункте верхнего меню Сборка.




___
http://blogelectronshica.blogspot.ru/2012/02/avr-geany.html

Комментариев нет:

Отправить комментарий