Руководства, Инструкции, Бланки

Avr Gcc руководство img-1

Avr Gcc руководство

Рейтинг: 4.6/5.0 (1838 проголосовавших)

Категория: Руководства

Описание

Avr gcc руководство


Обзор подходов к созданию роботов с элементами самосознания

Корнеллский робот. Робот университета Мейдзи. Эволюционное моделирование самосознания.

Создание BEAM-роботов - это не просто технологический процесс или увлекательное хобби. BEAM - это целая культура, со своей философией и эстетикой.


Робот "Омнибот" на базе встраиваемого компьютера стандарта PC/104

Робот-теннисист разработан командой механико-математического факультета МГУ.

AVR-GCC. СОВМЕСТИМОСТЬ КОДА

из неопубликованных записок Бибота

В интернете существует множество примеров кода для AVR-GCC. написанного с использованием функций и макросов, которые больше не поддерживаются в новых версиях компилятора. Чтобы использовать эти примеры и понять с помощью них суть работы с портами микроконтроллера, необходимо переписывать код или использовать специальные макроопределения.

Для начинающих осваивать программирование микроконтроллеров AVR такой подход может оказаться сложным. В результате многие переходят на другие компиляторы и больше никогда не используют ставшую для многих культовой среду разработки WinAVR. Хотя существует простой способ решить все проблемы и вновь вернуть отвергнутые разработчиками функции в AVR-GCC. Для этого можно использовать специально созданный myROBOT AVR-GCC PATCH for WinAVR .

Прежде чем мы перейдем к описанию патча, рассмотрим, какие же функции он возвращает. В последних версиях библиотеки avr-libc, входящей в состав компилятора AVR-GCC, использующегося в WinAVR, больше не поддерживаются функции inp. outp. sbi и cbi. Сделано это для оптимальной интерпретации исходного текста программы при ее компиляции и определения, как обращаться к порту - как к регистру или как к ячейке памяти.

Поддержка этих функций отсутствует уже начиная с версии WinAVR-20050214. В том числе отсутствует поддержка столь популярных и бывших для многих удобными bit_is_set и bit_is_clear. Эти функции можно встретить во множестве примеров программ для начинающих, в том числе в популярном проекте сайта "РобоКлуб" под названием "Делаем робота вместе".

Конечно же, никто не призывает пользоваться исключительно "старыми" функциями, патч предназначен вернуть обратную совместимость программам на AVR-GCC. Используя патч, вы не лишаетесь возможности работы с новой нотацией, а только возвращаете возможность использования исключенных функций. Например, проверив в работе какой-либо из найденных в интернете примеров, можно потренироваться, переписав его с использованием нового синтаксиса.

В заключение рассмотрим несколько примеров возможных замен.

Другие статьи

Lf231, Hardware: Программирование микроконтроллеров AVR с использованием GCC

Перевод на Русский:
Пухляков Дмитрий <dm_puh(at)go.com>

Программирование микроконтроллеров AVR с использованием GCC

Микроконтроллер AVR фирмы Atmel - 8-мибитный RISC микроконтроллер общего назначения, внутри которого размещены EEPROM, RAM, АЦП, большое количество портов ввода и вывода, таймеры и последовательный канал UART, реализующий связь по протоколу RS232, и многое другое.

Большой плюс этого микроконтроллера - наличие средств разработки под Linux. И эти средства предоставляет GCC. В этой статье я объясню как установить и пользоваться GCC. Я также покажу, каким образом загрузить исполняемый код в микроконтроллер. Для этого нам понадобится микроконтроллер AT90S4433, кварцевый резонатор на 4МГц, небольшой отрезок кабеля и еще несколько недорогих компонент.

Эта статья является вводной, в следующей статье мы построим ЖКИ дисплей с несколькими кнопками, аналоговым и цифровым входами, аппаратным сторожевым таймером и светодиодами. Конечная цель, построить панель управления для Linux-сервера. Но для начала нам необходимо установить и настроить средства разработки, чему и посвящена эта статья.

Установка: Что для этого необходимо?

Для использования среды разработки GNU C, Вам понадобится следующее программное обеспечение:

Находится здесь:
ftp://ftp.informatik.rwth-aachen.de/pub/gnu/binutils/
или
ftp://gatekeeper.dec.com/pub/GNU/binutils/

Находится здесь:
ftp://ftp.informatik.rwth-aachen.de/pub/gnu/gcc/
или
ftp://gatekeeper.dec.com/pub/GNU/gcc/

Библиотека AVR C находится здесь: http://www.amelek.gda.pl/avr/libc/ Также Вы можете скачать ее отсюда: страница для загрузки

Программатор для AVR находится здесь: http://www.amelek.gda.pl/avr/libc/ Также Вы можете скачать ее отсюда: страница для загрузки

Все программное обеспечение мы установим в папку /usr/local/atmel. Это позволит нам избежать путаницы при ипользовании обычного компилятора С Linux. Создайте папку с помощью команды:

Установка: GNU binutils

Пакет binulils содержит низкоуровневые средства необходимые для создания объектных файлов. Он включает в себя ассемблер AVR (avr-as), линкер (avr-ld), библиотеку средств управления библиотеками (avr-ranlib, avr-ar), программы для создания исполняемых модулей загружаемых в память программ микроконтроллера (avr-objcopy), дизассемблер(avr-objdump) и утилиты avr-strip и avr-size.

Для установки пакета binutils выполните следующие команды:

bunzip2 -c binutils-2.11.2.tar.bz2 | tar xvf -
cd binutils-2.11.2
./configure --target=avr --prefix=/usr/local/atmel
make
make install

Добавьте строку /usr/local/atmel/lib в файле /etc/ld.so и обновите кэш линкера командой /sbin/ldconfig.

Установка: AVR gcc

avr-gcc - собственно компилятор С.

Для его установки используйте следующие команды:

tar zxvf gcc-core-3.0.3.tar.gz
cd gcc-core-3.0.3
./configure --target=avr --prefix=/usr/local/atmel --disable-nls --enable-language=c
make
make install

Установка: Библиотека AVR C

Библиотека AVR C до сих пор находится в стадии разработки и поэтому процесс установки может немного изменяться от версии к версии. Я рекомендую использовать версию указанную выше в таблице, для приведенной мной процедуры установки. Именно эту версию я использовал при создании программ описанных в этой и последующих статьях.

Установите следующие пременные среды (синтаксис bash):
export CC=avr-gcc
export AS=avr-as
export AR=avr-ar
export RANLIB=avr-ranlib
export PATH=/usr/local/atmel/bin:$

/configure --prefix=/usr/local/atmel/avr --target=avr --enable-languages=c --host=avr
make
make install

Установка: Программатор

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

Наилучшим образом для этих целей подходит uisp для Linux. Он может быть использован прямо из make-файла. Вам только нужно будет добавить строку "make load" в make-файл и созданный Вами код будет загружен в микроконтроллер сразу после компиляции.

uisp устанавливается следующими командами:

tar zxvf uisp-20011025.tar.gz
cd uisp-20011025/src
make
cp uisp /usr/local/atmel/bin

Небольшая тестовая программа

Начнем с небольшого тестового проекта. Его основная задача проверить работоспособность установленного программного обеспечения. Нам предстоит скомпилировать, загрузить и проверить небольшую программу. Эта программа всего лишь должна заставить моргать светодиод.

Для этого я предлагаю Вам изготовить небольшую отладочную плату, в будущем Вы можете ее модифицировать и использовать для своих целей. Вы можете использовать макетную плату. Однако не пытайтесь поставить на нее непосредственно микроконтроллер с кварцем, так как такие платы, как правило, не предназначены для высокочастотных цепей, лучше подключить выходные линии микроконтроллера к макетной плате с помощью коротких проводников. Кварц и конденсаторы разместите в непосредственной близости от микроконтроллера.

Сопротивления на схеме между микроконтроллером и разъемом для подключения программатора в нашем случае необязательны, они могут понадобиться, в случае если Вы захотите в дальнейшем задействовать выводы порта В.

Необходимые компоненты

Вам понадобятся детали, перечисленные ниже в таблице. Все они достаточно распространенные и недорогие. Самая дорогая деталь в списке - микроконтроллер, его стоимость около 7.30 EUR. Также возможно, что его не окажется в ближайшем к радиомагазине, но он всегда есть в продаже у крупных дистрибьюторов электронных компонент ( например, www.reichelt.de,www.conrad.de, и т.д. наверняка похожие компании есть и в вашей стране).

AT90S4433,8-битный RISC микроконтроллер ф.Atmel - 1 шт.

Панелька для микросхем 14 ножек - 2 шт.
или
панелька 28 ножек( ширина 7,5 мм) - 1 шт.
Купить необходимую панельку на 28 ножек будет гораздо сложнее,т.к. обычно такие панельки имеют ширину 14 мм вместо требуемой 7.5 мм.

Резистор 10 кОм (цветовая маркировка: коричневый, черный, оранжевый) - 1 шт.
Резистор 470 Ом (цветовая маркировка: желтый, пурпурный, коричневый) - 3 шт.
Резистор 1 кОм (цветовая маркировка: коричневый, черный, красный) - 1 шт.
Резистор 220 Ом (цветовая маркировка: красный, красный, коричневый) - 1 шт.
Кварцевый резонатор 4МГц - 1 шт.
Конденсатор керамический 27 пФ - 2 шт.

Любой разъем на 5 контактов, я обычно покупаю разъем в виде полоски на много контактов и отламываю необходимый мне кусок на 5 контактов.

Монтажная плата - 1 шт.

25-ти контактный разъем DB25 для подключения к параллельному порту - 1 шт.

Светодиод - 1 шт.

Макетная плата. Мы ей не пользовались, но я считаю, что она будет весьма кстати, если Вы захотите продолжить эксперименты с AVR. Рекомендую поместить микроконтроллер вместе с кварцем и конденсаторами на монтажной плате и подключать его входы и выходы с помощью коротких проводов к макетной плате.

Еще Вам понадобится 5-тивольтовый стабилизированный источник питания или батарейка на 4.5 В.

Изготавливаем программатор

AT90S4433 поддерживает режим внутрисхемного программирования.
Это означает, что Вам не нужно вытаскивать микроконтроллер из платы каждый раз, когда Вам необходимо его перепрограммировать. Опять-таки покупка готового программатора обойдется Вам в 50-150 EUR. В нашем случае Вы обойдетесь без лишних накладных расходов. С помощью Linux, uisp и свободного параллельного порта Вы сможете создать хороший и простой программатор. И этот программатор представляет собой простой кабель. Распайка этого кабеля выглядит следующим образом:

Pin on parallel port


Длина кабеля не должна превышать 70 см.

Пишем программу

Используя gcc Вы можете писать программы для AT90S4433 на чистом С. Знание AVR ассемблера может быть полезным, но необязательным. В состав AVR libc входит avr-libc-reference документирующий большинство ее функций. Harald Leitner написал документацию по использованию AVR и GCC( haraleit.pdf,286Kb. оригинал находится на http://www.avrfreaks.net/AVRGCC ) с огромным количеством полезных примеров. Со страницы Atmel (www.atmel.com далее по ссылкам: products->8 bit risc -> Datasheets) Вы можете загрузить полное описание на микроконтроллер (копия: avr4433.pdf ,2361Kb). В нем дано описание внутренних регистров и описание использования CPU.

При создании программ для 4433 Вам необходимо помнить о том, что в вашем распоряжении всего 128 байт ОЗУ и 4К ПЗУ. Поэтому не стоит объявлять огромные структуры данных и длинные строки. Также избегайте использования множественных вложенных вызовов подпрограмм и рекурсивных функций. Объявление переменной вроде
char string[90];
уже чрезмерно. Тип данных "целое"(integer) имеет размерность в 16 бит. Если Вам необходимо короткое целое (small integer) используйте
unsigned char i; /* 0-255 */
Тем не менее, Вы будете удивлены тому, какие большие программы Вы сможете создать для этого микроконтроллера. Это действительно мощный процессор!

Итак, перейдем от теории к практике. Напишем программу, заставляющую мигать светодиод через интервалы 0.5 сек. Программа не такая уж полезная, но вполне достаточная для проверки установленной нами среды разработки и программатора.

void main(void)
<
/* enable PD5 as output */
sbi(DDRD,PD5);
while (1) <
/* led on, pin=0 */
cbi(PORTD,PD5);
delay_ms(500);
/* set output to 5V, LED off */
sbi(PORTD,PD5);
delay_ms(500);
>
>

Приведенный выше фрагмент программы наглядно демонстрирует насколько просто создается программа. Здесь приведена только основная функция, подпрограмма delay_ms включена в полный листинг программы (avrledtest.c). Перед использованием ножки PD5 микроконтроллера ее необходимо сконфигурировать на вывод, установив бит PD5 в регистре управления направлением работы линий порта D (DDRD(Data Direction Register for port D)). После этого Вы можете контролировать ножку PD5 устанавливая ее в 0В с помощью функции cbi(PORTD,PD5)( clear bit PD5(сбросить бит PD5)) или в 5В с помощью функции sbi(PORTD,PD5)(set bit PD5(установить бит PD5)). Значение "PD5" определено в io4433.h, который подключен через io.h. Далее следует бесконечный цикл (while(1)<>), внутри которого и происходит управление светодиодом. Вас не должно пугать, что наша программа получилась зацикленной. Если Вы уже создавали программы для многопользовательских / многозадачных систем, таких как Linux, Вы должны знать, что ваша программа никогда не должна содержать неблокированный бесконечый цикл. Потому что такой цикл приведет к напрасным затратам процессорного времени и резкому снижению производительности системы. Но не в случае с AVR. У нас не многозадачная система и нет программ, выполняющихся параллельно с нашей программой. У нас нет даже операционной системы. Поэтому мы можем позволить себе замкнутый цикл.

Компилируем и загружаем программу

В начале убедитесь, что переменная среды PATH содержит путь /usr/locsl/atmel/bin. Если необходимо отредактируйте ваш .bash_profile или .tcshrc. добавив:

export PATH=/usr/local/atmel/bin:$ (for bash)
setenv PATH /usr/local/atmel/bin:$ (for tcsh)

Для программирования AVR мы используем параллельный порт и программу uisp. Uisp в свою очередь использует интерфейс ppdev кернела. Поэтому необходимо убедиться, что у Вас загружены следующие модули:

# /sbin/lsmod
parport_pc
ppdev
parport

С помощью команды /sbin/lsmod проверьте, что они загружены, в противном случае, находясь под root, загрузите их с помощью

modeprobe parport
modeprobe parport_pc
modeprobe ppdev

Будет неплохо, если эти команды будут выполняться автоматически при запуске операционной системы. Для этого Вы можете занести их в скрипт rc ( для RedHat это /etc/rc.d/rc.local ).
Для использования обычным пользователем интерфейса ppdev Вам необходимо разрешить это, выполнив, находясь под root, команду

chmod 666 /dev/parport0

при этом необходимо удостовериться, что на этом порту нет программы обслуживания принтера. В противном случае Вам придется остановить её перед подключением программатора. Теперь все готово для компиляции и загрузки программы в микроконтроллер.
Архив с нашей тестовой программой (avrledtest-0.1.tar.gz ) включает и make-файл. Все что Вам нужно, набрать:

make
make load

После этого программа будет откомпилирована и загружена. Я не рассматриваю детально все выполняемые при этом команды. Вы можете посмотреть их в Makefile. Я даже не помню их все наизусть. Я просто помню, что необходимо набрать "make load". В дальнейшем, когда Вы будете писать свои программы, просто поменяйте в Makefile все попадающиеся "avrledtest" на название своей программы.

Немного о binutils

Некоторые из программ пакета binutils, могут вызвать гораздо больший интерес, чем процесс компиляции программы.

avr-objdump -h avrledtest.out

Результатом вышеприведенной команды будет информация о размере различных секций нашей программы. text - собственно программа загружаемая в ПЗУ микроконтроллера. data - инициализированные переменные, такие как
static char str[]="hello";
и .bss - неинициализированные глобальные переменные. Обе секции равны нулю в нашем случае. eeprom описывает переменные хранящиеся в eeprom микроконтроллера. Их я еще никогда не использовал. И наконец .stab и .stabstr информация для отладчика, к конечному коду, загружаемому в микроконтроллер отношения не имеет. Используя команду avr-size, можно получить эту же информацию, но в краткой форме:

При работе с AT90S4433 Вам необходимо следить, чтобы суммарный размер text+data+bss не превышал 4К и размер data+bss+stack (размер стека не отображается, т.к. величина непостоянная и зависящая от количества вложенных вызовов в программе) не превышал 128 байт.

Также заслуживает внимания команда

avr-objdump -S avrledtest.out

Она выводит ассемблерный листинг вашей программы.

Заключение

Итак, теперь у Вас есть достаточно информации, чтобы начинать писать программы для AVR с использованием GCC. В дальнейшем на LinuxFocus ожидается серия статей, описывающих применение этой связки в гораздо более сложных и интересных проектах.

Ссылки Страница отзывов

У каждой заметки есть страница отзывов. На этой странице вы можете оставить свой комментарий или просмотреть комментарии других читателей.

Rapidfolder15: Дневник

Руководство Avr Gcc

Руководство Avr Gcc

Входящий в состав пакета кросскомпилятор AVR - GCC поддерживает не только WinAVR и AVR Studio - справочное руководство Сборник статей из.

Так как микроконтроллеры AVR имеют Гарвардскую архитектуру, для каждого типа памяти SRAM, FLASH, EEPROM у них выделено отдельное адресное пространство. Каждая из этих типов памяти имеет собственное специальное назначение. Если данные не изменяются в течение работы программы, то они должны быть сохранены в памяти либо FLASH, либо EEPROM. В другом случае, если данные переменной часто используются и постоянно изменяются, то такая переменная должна быть сохранена в памяти SRAM. Где какие данные разместить - решает разработчик программы. Важное правило, которое следует учитывать - работа с разными типами памяти требует разных операций и способов доступа. Обычно когда на C просто определяют переменную наподобие int a, компилятор автоматически помещает её в SRAM. Но если Вы захотите, то можете разместить константы в памяти EEPROM и даже в памяти FLASH. Для памяти SRAM для размещения переменных не нужно указывать никакого специального синтаксиса, но для EEPROM и FLASH нужно использовать специальные методы для декларации переменных. Несмотря на указание const при декларации констант, компилятор все равно для их хранения использует ОЗУ (при старте программы они просто копируются из flash в RAM). Это несомненно полезно с точки зрения быстродействия кода, но для программ, активно использующих ОЗУ и/или имеющих большой объем констант (например, строковых), памяти ОЗУ может оказаться недостаточно. Обойти проблему позволяет атрибут PROGMEM и подпрограммы для работы с данными из flash. Их можно использовать, если включить заголовочный файл avr\\pgmspace.h. Функции заголовка подробно описаны в C:\\WinAVR-20090313\\doc\\avr-libc\\avr-libc-user-manual\\pgmspace_8h.html. Принцип работы gcc, описание проблемы подробно описаны в файле C:\\WinAVR-20090313\\doc\\avr-libc\\avr-libc-user-manual\\pgmspace.html. Далее дан его почти дословный перевод. [Данные в памяти программ] Многие микроконтроллеры AVR оборудованы недостаточым количеством памяти RAM для хранения данных и констант, однако они имеют в своем распоряжении гораздо больший объем памяти программ (flash). Во flash вполне могли бы поместиться константы, что сэкономит драгоценное место в RAM. Однако микроконтроллеры AVR имеют гарвардскую архитектуру, в которой четко разделены память программ (flash) и память данных (RAM), и каждая имеет свое отдельное адресное пространство. Имеется связанная с этим некоторая проблема, чтобы сохранять данные констант во flash, и затем считывать эти данные в программе AVR. Проблема усугубляется еще тем, что язык C был разработан не для гарвардской архитектуры, а для архитектуры фон Неймана, где код и данные сосуществуют в едином, общем адресном пространстве. Поэтому любой компилятор для гарвардской архитектуры, например AVR, должен иметь разные методы для работы с разными адресными пространствами. Некоторые компиляторы C (например IAR Embedded Workbench for AVR) используют нестандартные ключевые слова, либо расширяют стандартный синтаксис. Набор инструментов WinAVR/gcc используют другой способ. Компилятор GCC имеет специальное ключевое слово __attribute__, которое используется для подсоединения различных атрибутов к функциям, определениям, переменным и типам. Это ключевое слово сопровождается спецификацией атрибута в двойных круглых скобках. В AVR GCC имеется специальный атрибут progmem. Он используется при декларации данных, и говорит компилятору поместить данные в памяти программ (flash). Библиотека AVR-Libc предоставляет простой макрос PROGMEM, который задает синтаксис GCC-атрибута progmem. Эта макрокоманда была создана для удобства конечного пользователя, как мы увидим далее. Макрос PROGMEM задан в заголовочном файле < avr/pgmspace.h >. Поскольку сложно модифицировать GCC для создания нового расширения синтаксиса C, вместо этого avr-libc имеет макросы для получения данных из flash. Они также размещены в заголовке < avr/pgmspace.h >. [О ключевом слове const] Многие пользователи полагают, что использование ключевого слова const декларирует размещение данных в памяти программ (flash). Это происходит из-за неверного понимания назначения ключевого слова const. Ключевое слово const говорит компилятору, что данные "только для чтения", и не более того. Это упрощает для компилятора некоторые преобразования, и предотвращает некорректное использование этих переменных. Например, const используется многими функциями в качестве модификатора типа параметра. Это говорит компилятору, что функция будет использовать этот параметр только для чтения, и не будет изменять содержимое параметра. Таким образом, const всего лишь указывает на метод использования данных, и совсем не говорит о том, где должны эти данные храниться. Если это слово использовать как средство определить хранение данных, то мы окажемся в проигрыше, так как это изменит его семантику в других ситуациях, например в параметре функции. [Сохранение данных в памяти программ и получение их оттуда] Предположим, у Вас есть некоторые глобальные данные: unsigned char mydata[11][10] = < < 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09>, < 0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13>, < 0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D>, < 0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27>, < 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31>, < 0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B>, < 0x3C,0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45>, < 0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F>, < 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59>, < 0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63>, < 0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D> >; Теперь Ваши данные хранятся в памяти программ. Можно скомпилировать, слинковать, и проверить карту памяти - массив mydata будет лежать в правильной секции. Но теперь код, получающий данные не будет работать, так как начало массива все равно интерпретируется компилятором как адрес в пространстве данных. Проблема в том, что для AVR GCC несвойственно знать, что данные могут лежать в пространстве программ. Решение проблемы довольно простое. Сначала нам надо получить адрес необходимых данных. Он равен &(mydata [j]). После этого можно использовать макрос для чтения данных из памяти программ по этому адресу: Теперь мы разместили массив string_table во flash, и массив string_table является массивом указателей на строки. Каждый указатель при этом указывает на строку во flash, где строка и хранится. Например, Вы хотите скопировать строку из flash в буфер RAM (например в автоматическую переменную внутри функции, расположенную в стеке). Для это нужно сделать следующее: void foo(void) < char buffer[10]; for (unsigned char i = 0; i < 5; i++) < strcpy_P(buffer, (PGM_P)pgm_read_word(&(string_table ))); // Display buffer on LCD. > return; > Смысл приведенного кода очевиден - получение данных из массива происходит через указатель, выбираемый как 16-битное беззнаковое целое макросом pgm_read_word. Далее строка копируется функцией strcpy_P. Имеется множество функций для манипуляции строками в памяти программ с индексом _P, работающих так же, как и обычные строковые функции. Все эти функции с индексом _P также определены в заголовке <avr/pgmspace.h>. [Предостережение] Макрос и функции, используемые для получения данных из flash, генерируют некоторый дополнительный код, который больше по объему, чем код доступа к памяти RAM. Таким образом, это создает дополнительный расход памяти программ и замедление работы кода. Этот дополнительный расход и замедление достаточно малы, поэтому выигрыш при размещении данных во flash получается значительный. Однако об этом необходимо знать, чтобы при необходимости минимизировать количество обращений к памяти внутри одной функции и/или цикла. В этом может помочь поучительный просмотр дизассемблированного кода компилятора. [Строки и константы FLASH в IAR] Среда разработки IAR Embedded Workbench for AVR также имеет специальные средства для размещения данных и констант в памяти программ. Для этого используется специальный заголовок pgmspace.h. Для манипуляции с данными из FLASH используются специальные функции с суффиксом _P: sprintf_P, strcpy_P, sscan_P и т. д. Для объявления данных во FLASH служит ключевое слово __flash. Например: #include. //Обычный буфер в RAM: char buffer [256]; //Текст, хранящийся в памяти программ (FLASH): __flash char message[] = "Hello, world!\\r\ "; //Работа с данными FLASH: sprintf_P(buffer, "%s", message);

AVR-GCC: руководство по встраиванию кода на ассемблере

AVR Studio +gcc: как разместить строки и константы на flash

  • Задумывалась эта книга как справочное руководство по avr - libc, и большая ее часть состояла из моих собственных переводов.
  • Руководство по встраиванию кода ассемблера в код на C для компилятора AVR GCC.
  • Принцип работы gcc, описание проблемы подробно описаны в файле C:\ WinAVR-20090313\doc\ avr - libc \ avr - libc -user- manual \pgmspace.html. Далее дан.
  • Данное руководство предназначено для пользователей Salvo, При создании приложений Salvo с компилятором GNU avr - gcc, вместе.

Начнем с простого, самого простого. Запускай студию, выбирай там новый проект, в качестве компилятора AVR GCC и вписывай.

На этом же сайте, например, подробнейший мануал по подключению и системе команд этого Писал в пятой AVR Studio, то есть писал под avr - gcc.

Компилятор GNU C (gcc) для микроконтроллеров Atmel AVR RISC предоставляет специальные возможности для встраивания кода на ассемблере в программы на языке C. Это очень полезная возможность может использоваться для ручной оптимизации критических частей программного обеспечения или для использования специфических инструкций микроконтроллера, которые не доступны на языке C. Имейте в виду, что этот документ не касается модуля, полностью написанного на языке ассемблера.

Make extcoff = Convert ELF to AVR Extended COFF (for use with AVR Studio tuning, see gcc manual and avr - libc documentation # -Wall.

Ирина Викторовна. 27.07.2016 в 16:58
Здравствуйте, предлагаем Вам услуги комплексного продвижения вашего сайта, подробнее с нашими услугами Вы можете ознакомиться по ссылке http://www.anacron.ru/ Извините за беспокойство.

Программирование AVR в Linux - Научно-промышленная лаборатория Полюс

Программирование AVR в Linux

25 апреля 2013 года

Введение

Не секрет, что большая часть инженерного софта является коммерческой и работает исключительно в операционной системе Windows. Тем не менее и в Linux есть неплохие свободные программы, решающие многие практические задачи. В этой статье дан обзор технологии разработки программ для микроконтроллеров AVR при помощи свободного ПО, имеющегося в ОС ALT Linux.

Готовим софт.

Установим необходимые программы, набрав в консоли:
su -
password:
apt-get install avr-gcc avr-libc avr-binutils avrdude

Первые три программы это компилятор GCC для AVR с библиотеками, а четвертая - утилита программирования. Надо отметить, что в старых дистрибутивах ALT Linux (4-ая и 5-ая платформа) в avr-binutils была ошибка (компилятор не находил пути к заголовочным файлам). В 6-м Альте начиная с версии avr-binutils-2.21 эта ошибка исправлена [1]. Для проверки создадим в домашней папке текстовый файл main.c следующего содержания:

Пробуем скомпилировать его под микроконтроллер ATMEGA16 набрав в консоли от имени пользователя:
$ avr-gcc -mmcu=atmega16 -Os -o main.o main.c
$ avr-objcopy -O ihex main.o main.hex

Должны появится два файла: объектный main.o и файл прошивки main.hex.

Программатор и отладочная плата.

Чтобы залить прошивку в микроконтроллер Вам понадобится программатор. Лично я пользуюсь программатором для COM порта. Но можно собрать и USB программатор. Наиболее прост и дешев USBASP [2]. однако его придется где-то запрограммировать, а чтобы он работал устойчиво нужно после 1 контакта разъема USB поставить два диода, которые понизят напряжение питания микроконтроллера до 3,8 В.

Для прототипирования схем удобно воспользоваться платой Pinboard. Помимо разной полезной периферии там имеется переходник USB/RS232 и бутлоадер от Мартина Томаса позволяющие загружать программы прямо по USB. У меня тоже есть такая плата, поэтому вкратце опишу ее запуск [3]. В консоли набираем команду:

$ avrdude -p m16 -c avr109 -P /dev/ttyUSB0 -b 19200

Затем жмем кнопку сброса на плате и сразу же вводим эту команду. Если все в порядке плата ответит:

Connecting to programmer:
Found programmer: Id = "AVRBOOT"; type = S
Software Version = 0.8; No Hardware Version given.
Programmer supports auto addr increment.
Programmer supports buffered memory access with buffersize=128 bytes.
Programmer supports the following devices:
Device code: 0x75
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e9403
avrdude done. Thank you.

Теперь можно изменить команду:
$ avrdude -p m16 -c avr109 -P /dev/ttyUSB0 -b 19200 -U flash:w:main.hex

и прошить в плату нашу тестовую программу. Ничего особенного не произойдет, лишь загорится зеленый светодиод подключенный к ножке PD7 O

Конечно, пользоваться командной строкой не всегда удобно. Легче применить графическую оболочку AVRFuse. В ее настройках на вкладке Program выбираем Device Atmega16, в списке Programmer находим avr109, а на вкладке Settings пишем Port location /dev/ttyUSB0 и Baudrate 19200 Далее на вкладке Program выбираем Input file и наш файл с прошивкой, затем жмем кнопку сброса на плате, и сразу же кнопку Program.

IDE для программирования на Си.

К сожалению, в Linux нет программ, аналогичных по функциональности IDE Avr Studio. Существовал способ [4] позволяющий запустить ее под wine, но с тех пор скрипт winetricks несколько раз поменялся, часть библиотек была перемещена или переименована и, в общем, все тут довольно сложно. Есть avr-плагины для Eclipce и CodeBlock, но настройка их трудоемка, а особых удобств в отладке нету. Остается воспользоваться IDE KontrollerLab. Программа довольно аскетичная, но необходимый минимум функционала все же имеет.

Устанавливаем ее:
su -
password:
apt-get install kontrollerlab

Сразу же закроем мешающее окошко терминала. Далее в главном меню Project выберем New Project, дадим ему имя и откроем. Следом File/New/C Source, присвоим имя исходнику. Переходим к свойствам проекта. Project/Configure project на вкладке Common выбираем настройки процессора CPU: Atmega16, clock 16 000 000. На вкладке Compiler ставим галку напротив -g: Produce debugging information. Чтобы отладка работала выберем Optimization level 0 (без оптимизации) и сохраним эти настройки как исходные Set as default.
После отладки потребуется сменить уровень оптимизации на s (оптимизация по размеру) и повторно скомпилировать исходник.

Скопируем в исходник наш тестовый файл main.c и скомпилируем его нажав Rebuild all. Для отладки выберем в главном меню Debug/PC only debugging затем Enable и Restart. Жмем кнопочку Step into и шагаем по строкам программы. Справа в окошке memory view показано содержимое ячеек ОЗУ и регистров. В списке выбираем нужный регистр, например DDRD, и смотрим как он меняется. Окошко можно убрать или восстановить в меню View/Show memory view.

А вот значения именованных Си переменных посмотреть нельзя, да еще надо поискать, в какие ячейки памяти забросил их компилятор. Но можно определить вспомогательную регистровую переменную и копировать байты нужной переменной в нее. Для регистровых переменных разрешено брать регистры r2-r7 [5]. Пример:

#include <avr/io.h>
#define lo8(x) ((x)& 0xFF)
#define hi8(x) ((x)>>8)
register unsigned char l asm ( "r3" ) ;
register unsigned char h asm ( "r4" ) ;

int main ( void )
<
unsigned int test ;
test = 0x110 ; l = lo8 ( test ) ; h = hi8 ( test ) ;
DDRD |= 1 << 7 ;
PORTD |= 1 << 7 ;
PORTB = test ;
test = 0x20 ; l = lo8 ( test ) ; h = hi8 ( test ) ;
return 0 ;
>

Осталось настроить программирование. Идем в Project/Configure programmer. На вкладке Choose programmer выбираем галку Avrdude. Далее на вкладке Avrdude настроим наш программатор. Для Pinboard выберем Baud = 19200, Specify programmer type = Atmel AppNote AVR109 Boot Loader и Specify connection port Serial port = /dev/ttyUSB0
Далее все просто, жмем сброс на плате и следом Upload (круглую синюю кнопку со стрелкой вверх) O.

Терминальная программа.

Чаще всего микроконтроллер и компьютер связываются по протоколу UART. Соответственно, понадобится преобразователь RS232/UART или USB/UART на FT232RL и терминальная утилита. В KontrollerLab она имеется (см. пункт меню View/Show serial terminal), но я предпочитаю программу Cutecom от Александра Нуендорфа. Ставим ее как обычно:

# apt-get install cutecom

Программа может посылать и принимать текстовые символы, строки и 16-ричные HEX числа и сохранять информацию в log файл, но работает лишь с первыми 4-мя COM портами /dev/ttyS0. /dev/ttyS3 .
Если в компьютере нет COM порта и используется переходник USB/UART, то он опознается в Linux как устройство /dev/ttyUSB0.
Чтобы сделать его виртуальным COM портом ttyS2 надо от рута скомандовать [6] :

rm /dev/ttyS2
ln -s /dev/ttyUSB0 /dev/ttyS2

И на время текущего сеанса система будет видеть USB устройство как виртуальный COM порт.
Чтобы не вводить каждый раз эти команды можно добавить их в скрипт автозапуска rc.local. Если его не существует, то создадим его с правами 755:

# touch /etc/rc.d/rc.local
# chmod 755 /etc/rc.d/rc.local

И напишем в нем (не забыв добавить в конце файла пустую строку):
#!/bin/sh
rm / dev / ttyS2
ln -s / dev / ttyUSB0 / dev / ttyS2
exit 0

Ассемблер.

Для программирования AVR обычно используют стандартный ассемблер Atmel и, гораздо реже, ассемблер avr-gcc. Последний отличается запутанным синтаксисом, но его приходится использовать для ассемблерных вставок в Си код [7,8].
Среди свободных ассемблеров наиболее близок к стандартному проект Avra, подробнее см [9]. Его установка в Alt Linux p6 обычная:

# apt-get install avra

Еще надо добавить файлы макроопределений (они находятся в архиве ) скопировав содержимое папки Asm1 в каталог /usr/share/avra
У Atmel есть два варианта ассемблера. Хотя hex файлы будут безошибочно компилироваться для обоих вариантов, лучше использовать первый, иначе Avra засыплет предупреждениями "PRAGMA directive currently ignored".

К сожалению, программной отладки в Avra нет, поэтому придется использовать ретро-технологию — текстовый редактор Geany + железный контроль (мигание светодиодами, посылка контрольных байт по UART).
Настройка Geany для работы с Avra не сложная [10]. Сначала сделаем подсветку кода. Для этого скопируем в домашнюю папку в скрытую директорию

/.config/geany/filedefs файл filetypes.asm с этой страницы. Затем в Geany в меню Сборка/Установить команды сборки в пункте Команды для языка: Файл Assembler в графе Скомпилировать пишем команду avra "%f"

Далее создаем файл test.asm со следующим содержанием:

И компилируем его нажав кнопку Скомпилировать текущий файл (на рисунке отмечена красной стрелкой).

Geany может не только компилировать, но и записывать прошивку. Для этого в меню Сборка/Установить команды сборки в пункте Команды для языка: Файл Assembler жмем кнопку после цифры 2 и в появившемся окошке вводим _Сборка, а в поле Команда вводим команду прошивки.
Для Pinboard она выглядит так: avrdude "%f" -p m16 -c avr109 -P /dev/ttyUSB0 -b 19200 -U flash:w:%e.hex
В ней %f и %e - спецификаторы Geany, %f подставляет подставляет полное имя ассемблерного файла, а %e его имя без расширения. Для прошивки жмем кнопку Собрать текущий файл.

Отладка программ на ассемблере.

Как уже говорилось применяем ретро-технологию; текстовый редактор + посылка контрольных байт по uart. Подключим микроконтроллер к переходнику rs232/uart или usb/uart и поместим в конце отлаживаемого кода две процедуры: uart_init (инициализация uart) и uart_snt (передача байта). Чтобы посмотреть значение какого-нибудь регистра (обозначим его псевдонимом xreg) пишем команды:

Вот пример отладочного кода (взято у Ревича и Ди Хальта O ):

Прошиваем микроконтроллер, запускаем Cutecom и открываем порт. Затем подаем питание на микроконтроллер и в окне терминала побегут строки с символами "A". Все работает, но на практике, для устойчивой работы протокола UART символы лучше передавать не сразу друг за другом, а с некоторой задержкой.

Выводы.

Таким образом программирование микроконтроллеров AVR в ALT Linux вполне решаемая задача.
Желаю Вам творческих успехов!

Ссылки. Комментарии

#1. 18 мая 2013 года, 01:47. Dion пишет:

Спасибо за статью! KontrollerLab только с C работает? Ассемблер не поддерживает?

#2. 18 мая 2013 года, 11:54. Андрей пишет:

Поддерживается gnu ассемблер avr-gcc. Но он неудобный, чтобы использовать символические имена регистров нужно весь текст замусорить макросами подстановки _SFR_IO_ADDR и не разобрался, как располагать в нем байты данных по фиксированным адресам (наподобие .org .db .dw в атмеловском ассемблере).

Еще в ассемблере avr-gcc есть любопытная бага. Чтобы использовать _SFR_IO_ADDR ассемблерный файл обязательно должен иметь расширением большую букву S, если будет маленькая s происходит ошибка компиляции.

;led.S
#include <avr/io.h>
sbi _SFR_IO_ADDR(DDRB), 2
sbi _SFR_IO_ADDR(PORTB), 2

led.S компилируется, а led.s нет:

[andrew@localhost bags]$ avr-gcc -c -mmcu=attiny44 -o led.out led.s
led.s: Assembler messages:
led.s:3: Error: constant value required
led.s:3: Error: `,' required
led.s:3: Error: constant value required
led.s:3: Error: garbage at end of line
led.s:4: Error: constant value required
led.s:4: Error: `,' required
led.s:4: Error: constant value required
led.s:4: Error: garbage at end of line

[andrew@localhost bags]$ avr-gcc -c -mmcu=attiny44 -o led.out led.S
[andrew@localhost bags]$ avr-objcopy -j .text -O ihex led.out led.hex

В File/New Kontrollerlab создается ассемблерный файл с маленькой s. Поэтому, чтобы нормально работать с ассемблером лучше cоздать пустой проект, затем в блокноте пустой файл с расширением S и уже после открыть его в контроллерлабе.

#3. 18 мая 2013 года, 14:24. Dion пишет:

Понятно. Спасибо. Останусь на Geany с avra. Хардкор, так хардкор)

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