Atmel studio linux аналог

Обновлено: 06.07.2024

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

Дистрибутивов Linux существует огромное количество, мы будем исходить из того, что вы используете Debian или один из дистрибутивов, основанных на Debian, например популярный дистрибутив Ubuntu. В дистрибутивах, основанных не на Debian, изменится только процедура установки программных пакетов. Мы будем использовать только свободное программное обеспечение, с открытым исходным кодом и, разумеется, полностью бесплатное.

Без чего не обойтись

Необходимый минимум программного обеспечения, которое нам понадобится:

gcc-avr - это та часть мощной GNU Complier Collection (GCC), которая будет осуществлять кросс-компиляцию для целевой архитектуры микроконтроллеров AVR. GCC используется для сборки самого Linux, он поддерживает стандарты языка Си ISO C90 (ANSI-C), ISO C99, а также собственные расширения языка Си. GCC поддерживает огромное количество архитектур процессоров. Код, скомпилированный с помощью GCC для одной из платформ, потребует минимальных правок (или не потребует правок вообще) при компиляции для другой целевой платформы.

binutils-avr - ассемблер, компоновщик и некоторые полезные утилиты.

avr-libc - стандартная библиотека Си для Atmel AVR.

avrdude - утилита для работы с программаторами.

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

gdb-avr - отладчик для AVR.

avarice - интерфейс между avr-gdb и AVR JTAG ICE.

simulavr - симулятор Atmel AVR.

Чтобы установить нужные программные пакеты, откроем терминал и выполним следующую команду:

sudo apt-get install gcc-avr binutils-avr avr-libc avrdude gdb-avr avarice simulavr

Подождем некоторое время, пока пакеты будут загружены из репозитория и установлены и посмотрим, что теперь есть хорошего в нашей системе:

ls /usr/bin | grep avr

Это список программ, которые мы получили. Удобство использования Linux заключается не только в том, что все необходимое мы загрузили и установили одной командой, но и в том, что у нас теперь есть исчерпывающа справка по использованию этих инструментов. Чтобы воспользоваться этой справкой, достаточно набрать в терминале

man <имя программы>

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

Интегрированная среда разработки

Мы установим мощную IDE Eclipse, которую сможем использовать не только для программирования микроконтроллеров, но и при желании, для написания программ практически на любом языке для host-платформы. Eclipse - это кросс-платформенный инструмент для построения интегрированных сред разработки, реализуемых в виде плагинов, написанный на Java. Вы можете использовать Eclipse не только на Linux, но и в других операционных системах. Единственный минус этого решения - требовательность к объему оперативной памяти в некоторых случаях. Если на вашей машине меньше 2 Gb оперативной памяти, то мы рекомендовали бы добавить планочку, на всякий случай.

Не будем бегать по сети в поисках Eclipse, посмотрим, что доступно в репозитории:

apt-cache search eclipse

Нам понадобится базовый пакет eclipse и инструменты разработчика на C/C++ eclipse-cdt. Устанавливаем, особо не рефлексируя:

sudo apt-get install eclipse eclipse-cdt

Запустим Eclipse и добавим плагин для удобной работы с AVR, который, помимо всего прочего, обеспечит нам возможность работать с различными моделями программаторов. При запуске Eclipse попросит указать директорию, где будут храниться исходники проектов, выбирайте любое имя на свое усмотрение (директория не должна существовать, Eclipse создаст ее самостоятельно). После того, как Eclipse запустился, пройдем по меню

Help -> Install new software. -> Add.

Копируем этот URL в поле "Location" в оконе "Add repository" Eclipse, жмем "Ok". Eclipse подгрузит список доступного ПО из репозитория, отмечаем чекбокс напротив AVR Eclipse Plugin и жмем "Next". Последующие шаги мастера установки проходим, ни от чего не отказываясь. После установки плагина Eclipse захочет перезапуститься, в наших интересах ему это позволить. IDE готова к работе. Теперь разберемся с программатором.

Подключаем программатор


Для начала воткнем в машину тот программатор, который есть под рукой. Допустим, у нас оказался AVR-910. Для этого программатора понадобится драйвер Prolific, этот драйвер уже присутствует в стандартном ядре Linux и дополнительных телодвижений не потребуется. Если же под рукой оказался популярный программатор AVR910 by PROTTOSS, то возможно, придется его немного допилить.

После втыкания программатора в разъем USB, у нас появится новое устройство. В Linux устройства отображаются в файловую систему и мы можем читать, писать в них и изменять права доступа так же, как мы делаем это с обычными файлами. Устройств в каталоге /dev довольно много, поэтому, чтобы быстро обнаружить новое, воспользуемся стандартными консольными утилитами в терминале:

Мы обнаружили, что в каталоге /dev появилось устройство ttyUSB0. Посмотрим, сможем ли мы с ним работать, хватит ли у нас прав:

ls -l /dev/ttyUSB0

crw-rw---- 1 root dialout 188, 0 окт. 22 14:49 /dev/ttyUSB0

Мы видим, что для устройства заданы разрешения на чтение и запись для пользователя root и группы dialout. Пользователи, не входящие в эту группу, работать с устройством не смогут. Проверим список групп, в которые мы входим:

groups

owlet adm cdrom sudo dip plugdev lpadmin sambashare vboxusers

Так как группы dialout мы не видим, то придется добавить себя в эту группу:

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

groups

owlet adm dialout cdrom sudo dip plugdev lpadmin sambashare vboxusers

Все в порядке, запускаем Eclipse и.

Настройка Eclipse и первый проект

. попробуем создать проект:

File -> New -> C Project

Придумаем имя проекта и выберим тип - AVR Cross Target Application -> Empty Project. Жмем "Finish", и переходим к настройкам проекта - в панели Project Explorer жмем правой кнопкой мыши на нашем проекте и выбираем "Properties" в выпавшем меню. Чего тут только нет. Нас интересуют вкладки "AVR" и "C/C++ Build".

Сначала идем в AVR -> AVRDude -> Programmer -> Programmer Configuration -> New. . Придумываем имя нашему программатору (например, AVR-910). Теперь нужно выбрать тип программатора. В списке доступных типов мы не находим ничего, похожего на 910. Поэтому кликаем все подряд. Когда доберемся до "Atmel Low Cost Serial Programmer", то увидим в окошке справа:

id = "avr910";
desc = "Atmel Low Cost Serial Programmer";
type = avr910;

Это то, что нужно, оставляем этот выбор. Теперь выберем устройство, как мы помним, у нас это /dev/ttyUSB0. Записываем это в поле "Override default port". Это все, жмем "Ok". И устанавливаем только что созданный профиль в качестве значения в поле "Programmer configuration". Идем дальше.

AVR -> Target Hardware -> MCU Type. Если программатор подключен к макетной плате с микроконтроллером (или микроконтроллер воткнут в программатор), то пробуем нажать "Load from MCU". Если MCU Type прочитался и установился корректно, то скорее всего, тип программатьора на предыдущем шаге мы выбрали верно. Если это не так, то нужно еще раз проверить тип программатора, его работоспособность, наличие контакта на макетке. Устанавливаем MCU Clock Frequency в то значение, которое у нас имеется.

Можно еще походить по вкладкам AVR -> AVRDude -> . и обнаружить настройки чтения и записи Fuse и Lock-битов и некоторые другие опции, но пока нам это не нужно и мы идем дальше.

Вкладка C/C++ Build -> Settings -> AVR Compiler -> Miscellaneous -> Other flags - добавляем опцию -g для того, чтобы в ассемблерном листинге мы смогли видеть исходные строки на Си. Посмотрите другие разделы C/C++ Build -> Settings -> AVR Compiler - тут можно установить настройки оптимизации компилятора и другие полезные параметры.

Сохраняем изменения в параметрах проекта и добавим одно полезное сочетание клавиш в нашу IDE: Window -> Preferences -> General -> Keys ищем команду Upload Progect и назначаем сочетание клавиш (например, Ctrl+Alt+U). И там же мы видим, что на комаду Build All уже назначено сочетание Shift+Ctrl+B. Эти две комбинации мы будем вызывать для перекомпиляции исходников и прошивки микроконтроллера.

Теперь нам осталось создать файл main.c (жмем правой лапкой мышки на проекте, New -> File), написать тестовую программу скомпилировать ее и прошить железку. Можно посмотреть ассемблерный листинг получившегося кода, открыв файл <имя проекта>.lss, который появится в директории "Debug" или "Release" в проекте (в зависимости от текущего профиля) после компиляции.

Если все прошло удачно, скорее сносите проприетарные операционные системы со своей машины и будьте свободны. О средствах отладки для AVR под Linux мы напишем в следующей статье.

Рассмотрим процесс преобразования исходного кода в машинный код, пригодный для записи в память микроконтроллера. Узнаем какие есть программные инструменты в операционной системе Linux для компиляции и прошивки программ в микроконтроллеры используя языки программирования Си и Ассемблер. Увидим какие есть среды разработки (IDE) для написания и обработки исходного кода под AVR в Linux.

Компиляция программы и HEX

Давайте разберемся как происходит компиляция, подготовка и запись программы в микроконтроллер AVR. Допустим что мы будем писать программу на языке Си для AVR микроконтроллера, вот что будет происходить в процессе работы:

  1. Написанный нами текст исходного кода (source code) программы на универсальном языке Си сохраняется в файл с расширением ".c";
  2. Содержимое файла ".c" передается на обработку программе-компилятору (compiler), которая переводит понятный нам код на языке Си в объектные машинные коды и создает на выходе файл с расширением ".obj";
  3. Такой бинарный файл не подходит для прямой записи в память микроконтроллера, поэтому его следует подготовить. Производим извлечение необходимых порций машинного кода и получаем на выходе текстовый файл с расширением ".hex" в формате Intel HEX;
  4. Производим запись файла с расширением ".hex" во внутреннюю энергонезависимую память микроконтроллера;
  5. Программа готова к выполнению в микроконтроллере!

Intel HEX - это специальный формат файлов, который служит для представления двоичных данных в текстовом виде. Данный формат позволяет указывать с точностью до байта в какие адреса нужно поместить те или иные данные в памяти микроконтроллера.

Intel HEX format

Рис. 1. Структура файла в формате Intel HEX.

Программное обеспечение для AVR в Linux

В пакетах программного обеспечения для Linux содержатся десятки тысяч программ и утилит.

Давайте же посмотрим что у нас есть в пакетах для нашего дистрибутива Linux по ключевому слову "avr", выполним поиск командой:

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

Для начала нам будет интересно вот что:

  • avr-libc - Стандартная библиотека C предназначенная для совместного использования с GCC специально под Atmel AVR;
  • avra - Ассемблер для AVR микроконтроллеров (AVRAssevmler);
  • avrdude - Программное обеспечение для программирования (прошивки) Atmel AVR микроконтроллеров;
  • avrdude-doc - Документация к программе avrdude для чтения в оффлайн режиме, формат HTML;
  • binutils-avr - Набор утилит для работы с данными для AVR микроконтрллеров (avr-objcopy, avr-size и другие);
  • gcc-avr - Компилятор языка GNU C, кросс-компилятор для AVR;
  • gdb-avr - Отладчик (GNU Debugger) для AVR микроконтроллеров;
  • simulavr - Консольный симулятор для Atmel AVR микроконтроллеров.

Установим весь этот набор ПО одной командой:

С этим набором программного обеспечения и каким-то редактором текста уже можно писать программы и прошивать микроконтроллеры AVR.

При помощи avra мы сможем скомпилировать исходный код на Ассемблере (sample_program.asm) и сразу же получить на выходе готовый HEX-файл (sample_program.hex) для записи в флешь-память микроконтроллера.

С помощью gcc-avr можно произвести компиляцию исходного кода на языке Си и получить на выходе объектный файл с машинными кодами (sample_program.obj), который потом при помощи программы avr-objcopy, что входит в комплект утилит binutils-avr, переконвертируем в HEX-формат (sample_program.hex) для записи в флешь-память AVR чипа.

При помощи программы avr-size из комплекса утилит binutils-avr мы сможем узнать размер секций, а также общий размер данных в получившемся HEX-файле чтобы убедиться что программа поместится в памяти микроконтроллера.

Мощная программа avrdude даст нам возможность считать и записать прошивку в микроконтроллер. Мы сможем записать в микроконтроллер прошивку в HEX-формате (sample_program.hex) которая была получена после компиляции программы на Ассемблере, Си или другом компиляторе для AVR.

В программном симуляторе simulavr мы сможем произвести симуляцию работы программы, посмотреть содержимое регистров микроконтроллера в процессе выполнения программы.

Какие редакторы исходного кода и среды разработки подойдут для программирования AVR микроконтроллеров в Linux? - в принципе любые редакторы с удобной вам подсветкой синтаксиса для языков программирования Си и Ассемблера.

Ниже рассмотрим некоторые из редакторов и сред программирования, которые можно оптимизировать под свои нужды для удобного программирования AVR микроконтроллеров в Linux и не только.

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

Легковесная и свободная программа Geany - это кроссплатформенная (Linux, FreeBSD, MacOS, Windows) среда разработки для различных языков программирования (поддерживается около 50 языков) с множеством настроек, плагинов, красивой подсветкой синтаксиса и другими удобными фишками. Из плюсов в отношении разработки для AVR у программной среды Geany можно отметить:

  • Красивая подсветка кода, есть специально разработанный пресет для Ассемблера AVR
  • Встроенный терминал, удобно отслеживать процесс компиляции, прошивки, установки фьюзов и т.п.
  • Возможность настройки кнопочек Compile, Build, Run под команды для компиляции и прошивки программы в микроконтроллер
  • Простой и приятный настраиваемый интерфейс

Установка Geany в Linux производится одной командой:

Примерный вид программы с открытым исходным кодом на Ассемблере приведен ниже.

Geany Linux AVR

Рис. 2. Универсальная среда для разработчика программ - Geany в Linux.

CodeBlocks

Еше одна очень функциональная свободная кроссплатформенная среда разработки - это CodeBlocks. Данная среда поддерживает множество различных компиляторов и языков, есть встроенная поддержка GNU ARM GCC Compiler, GNU AVR GCC Compiler, есть поддержка плагинов и подсветку синтаксиса в коде. Очень мощная среда для программирования со встроенной поддержкой проектов для AVR и ARM.

Установить CodeBlocks можно командой:

Вот как выглядит данная среда разработки:

CodeBlocks Linux AVR

Рис. 3. Среда разработки Code:Blocks.

NetBeans

Очень удобная свободная интегрированная среда разработки приложений (IDE). Поддерживает множество языков программирования:Java, Python, PHP, JavaScript, C, C++ и другие. Поддержка ASM есть в плагине для C, C++. NetBeans - универсальная, качественная и очень мощная среда разработки с множеством возможностей и удобств для разработчиков.

NetBeans for AVR microcontrollers

Рис. 4. NetBeans - универсальная среда разработки.

NetBeans поддерживает более 200 (на текущий момент 09.2015) различных плагинов под разные языки программирования и технологии, в этой среде можно все настроить под себя и сделать по своему вкусу. К тому же NetBeans может работать в портабельном режиме, что весьма удобно если все инструменты носить с собой на флешке.

При разработке программ для AVR эта среда представляет удобства в качестве редактора исходного кода, в котором есть дерево проекта, сортировка по функциям, проверка синтаксиса и многое другое.

KDE Advanced Text Editor или же кратко Kate - это мощный универсальный редактор что входит в состав среды рабочего стола KDE.

Kate AVR Assembler

Рис. 5. Kate - универсальный редактор текстов и исходного кода.

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

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

Нано гибок в настройке, поддерживает подсветку синтаксиса и прост в управлении.

Для установки редактора Nano нужно выполнить команду:

Вот как выглядит исходный код файла на ассемблере в редакторе nano:

редактор Nano для AVR Ассемблер

Рис. 6. Консольный редактор Nano для программирования AVR микроконтроллеров.

Kontrollerlab

Нашел недавно интересную программу под названием kontrollerlab, которая представляет собою среду заточенную под разработку программного обеспечения для микроконтроллеров. Данная программа является эволюционным продолжением набора утилит xavrtools.

Для работы в программе используются avr-gcc, avrdude, последовательный терминал (serial terminal) для удобной отладки, kate - как основной редактор кода встроенный в среду разработки.

Kontrollerlab

Рис. 7. Kontrollerlab - среда разработки ПО для микроконтроллеров.

Программу можно скомпилировать из исходных кодов или же скачать готовые пакеты для Linux - *.deb или *.rpm.

AVRStudio

Отличная и бесплатная среда от самой ATMEL - это AVRStudio. Версии что работает под Linux не было и нет, к сожалению. Но тем не менее, по отзывам и статьям в интернете можно судить что версия 4.19 вполне удачно запускается и работает под wine (транслятор что позволяет запускать Windows-программы на Linux и Unix).

AVRStudio 4

Рис. 8. Программа AVRStudio 4.

К тому же можно использовать виртуальную машину VirtualBox, пробросив в нее USB-программатор через реальный USB порт.

AVRStudio - очень удобная среда разработки под AVR микроконтроллеры с отличным симулятором, так что под Линукс можно и ее завести, приложив некоторые усилия.

На настройке и использовании AVRStudio под Linux я останавливаться не буду, для этого позже будет написана отдельная статья, сейчас важно чтобы вы знали что такая программа есть и что она работает в Линукс.

Заключение

Мы познакомились с программными инструментами для программирования AVR микроконтроллеров в Linux, узнали о рабочих средах и редакторах исходного кода для написания программ.

В следующей статье мы настроим среду программирования Geany для удобной работы по написанию и прошивке программ в микроконтроллеры.

Ни для кого не секрет, что микроконтроллеры семейства AVR прочно вошли в практику домашних поделок. Кроме того, уже несколько лет наблюдается массовое (на грани эпидемии) увлечение отладочными платами типа Arduino, построенными на базе все тех же AVR. Не буду судить, хорошо это или плохо, ибо статей на эту тему на ресурсе более чем достаточно. Хочу уберечь и моего читателя от споров на тему «что такое Arduino и хорошо это или плохо». Статья не об этом.

Рано или поздно для любого «ардуиньщика» (при условии что он хочет выйти на более высокий профессиональный уровень) наступает момент когда в рамках платформы Arduino ему становится тесно и он начинает задумываться о том а что же в действительности происходит под капотом. И ответы на все его вопросы уже есть, например в виде замечательного курса «AVR. Учебный курс» от глубокоуважаемого DIHALT. Если вы пользователь OS Windows, то и недостатка в инструментах разработки у вас не будет, достаточно бесплатной Atmel Studio, закрывающей все вопросы разработки ПО для МК AVR.

Хоть я и тимлид в коллективе разработчиков ПО прикладного уровня, вопросы «железа» которое в нашей конторе делается на базе AVR с недавних пор стали интересовать меня очень остро. Возникло желание хорошо разобраться во всех аспектах разработки ПО для МК. И так как я являюсь убежденным приверженцем использования в разработке OS на базе ядра Linux, меня заинтересовал вопрос, а как там в линуксах: можно/нельзя ли писать и отлаживать ПО, зашивать его в кристалл с тем же (или примерно тем же) уровнем удобства, который нам доступен в Windows. Тех кого тоже интересует этот вопрос, и в особенности тех, кому тема поста кажется надуманной, приглашаю под кат.

Что касается разработки на C/C++, в среде линукс с этим особых проблем и нет, в виду общей ориентированности этой системы на использование данного языка и наличия достойного набора инструментария. Однако, тот же DIHALT, например, утверждает что программирование для МК неотделимо от знания ассемблера, в чем я с ним соглашусь, в виду логичности его тезисов, изложенных в «Учебном курсе» и собственного (пусть небольшого) опыта системной разработки под x86.

Руководствуясь тезисом, что от асма AVR нам никуда не уйти и сидим мы под линуксом, попробуем посмотреть на то, как можно писать и отлаживать программы. Я использую дистрибутив Arch Linux, поэтому в своем повествовании буду опираться на его экосистему.

Сразу скажу, что связку Atmel Studio + wine я предлагать не буду. Не люблю я wine (хоть и пользуюсь по необходимости). Остановимся на нативных средствах, прежде всего компиляторов, обзор которых в сети и личные ковырялки дали выход на триумвират gavrasm, avra и avr-as. Выбор произошел по двум противоречивым критериям: поддержка синтаксиса предлагаемого Atmel и возможность отладки прошивки по шагам в эмуляторе. Последнее для меня более важно, а в плоскости курса @DIHAL так прям вообще необходимо для понимания процесса работы микроконтроллера. Общность синтаксиса с компиляторами от Atmel дает, опять таки с моей точки зрения, лишь возможность без труда адаптировать проекты Atmel Studio к работе в линуксах, что весьма сомнительное преимущество, ибо тот же avr-as существует и под Windows. Предлагаю читателю обзор перечисленной троицы.

gavrasm и avra

Поддерживают синтаксис Atmel. Первый нашелся в AUR и устанавливается командой


Собирается обоими компиляторами сразу в *.hex и результат работы выглядит примерно одинаково. Чтобы не возмущать благородных донов длинными портянками, помещаю результаты компиляции под спойлеры

Содержимое hex-файла прошивки
:020000020000FC
:060000000AE00395FECFAB
:00000001FF

Содержимое файла листинга

Program : 3 words.
Constants : 0 words.
Total program memory: 3 words.
Eeprom space : 0 bytes.
Data segment : 0 bytes.
Compilation completed, no errors.
Compilation endet 29.07.2017, 15:46:38

Содержимое hex-файла
:020000020000FC
:060000000AE00395FECFAB
:00000001FF

Листинг генерируется дополнительным ключем -l при сборке
$ cat test.lst

AVRA Ver. 1.3.0 test.S Sat Jul 29 16:02:05 2017

C:000000 e00a ldi r16, 10
M1:
C:000001 9503 inc r16
C:000002 cffe rjmp M1


Segment usage:
Code : 3 words (6 bytes)
Data : 0 bytes
EEPROM : 0 bytes

Assembly completed with no errors.

Анализируя результаты можно сказать, что:

  1. Генерируется файл в формате Intel HEX, пригодный сразу для прошивки в МК
  2. Синтаксис совместим с Atmel


дает указание на МК, скрывая от программиста явное указание ссылок на *.inc файл макроопределений. Существует и ряд других нюансов, о которых проще прочесть в документации или в хорошей обзорной статье Valber'а на русском языке. Об особенностях gavrasm можно почитать тут.

Оба рассмотренных компилятора имеют существенный фатальный недостаток — они не генерируют отладочной информации. Хотя в документации по avra такая возможность заявлена

Debugging support AVRA creates a coff file everytime the assembly was sucessful. This file allows AVR Studio or any coff compatible debugger to simulate or emulate the program.

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

avr-as

Установка этого инструментария доступна из официальных репозиториев любого достаточно популярного дистрибутива. В случае с Arch Linux


GNU assembler (gas) является бэкэндом к компилятору gcc и обычно явно не вызывается. Связано это с идеологией *nix систем, ориентированных на разработку на C/C++, в которой ассемблеру отводится роль младшего нелюбимого сына. Вместе с тем это обеспечивает глубокую интеграцию ассемблерного кода в программы на C/C++ что, редко, но бывает необходимо. К тому же, если говорить об архитектурах x86/x86_64 синтаксис «гнутого» ассемблера (AT&T) разительно отличается от принятой Intel-нотации (хотя на gas можно использовать и интел-синтаксис, компилятор дает такую возможность). Чего стоит обратный по отношению к интел-нотации порядок операндов в командах, например

Применительно к AVR gas не отходит от нотации Atmel в части оформления команд — порядок операнд здесь привычный, например команда:


в gas для AVR выглядит привычно. Другое дело макросы и директивы компилятора, они отличаются от Atmel. Приведенная выше тестовая программа будет выглядеть так:


Как видно из исходника секция кода определяется директивой предпроцессора .section .text (аналог .cseg). Аналогом .dseg служит .data. Единственное, чего я пока не понял и не узрел в документации, как определяется содержимое EEPROM (аналог .eseg). Надеюсь среди читателей найдется добрый гуру, который натолкнет меня на ответ. Новичкам же, подобным мне, советую покурить документацию тут и вот здесь для уяснения специфики использования gas для AVR.

Мы же теперь соберем hex-файл, пригодный для прошивки МК. Команда:


генерирует объектный файл для соответствующего контроллера (в нашем случае ATMega 16). Далее данный объектный файл преобразуется в hex


Получая на выходе hex-файл вида

test.hex
:060000000AE00395FECFAB
:00000001FF

Тем не менее, мы не ответили на главный вопрос и не обозначили преимущество gas по возможности организации пошаговой отладки. Для этого прежде всего

В линуксах нет достойной альтернативы GDB. Для его использования применительно к МК AVR ставим фронтэнд


Данный отладчик обладает всем комплексом противоречий, пугающих новичков: при справедливо заявленной термоядерной мощи порог вхождения его довольно высок. Чтобы разучиться боятся gdb и начать в нем работать очень рекомендую статью величайшего и могучего и, к сожалению, ныне покойного (земля тебе пухом, Мыщъх!) Николая Лихачева aka Крис Касперски «Погружение в технику и философию GDB».

Первое, что нужно для использования gdb — собрать код соответствующим образом, сгенерировав ELF-образ, содержащий отладочные символы


Ключи -g и --gstabs генерируют соответственно отладочные символы и добавляют возможность использовать образ для удаленной отладки в gdb. Компонуем полученный объектный файл в ELF

$ avr-ld -m avr4 -o test.elf test.o

Полученный образ мы используем для отладки нашего теста. Из него же можно сгенерировать и hex-файл


явно указывая ключем -j включаемые в прошивку секции, ключем -O ihex формат вывода (intel HEX). Получаем тот же файл, что и в предыдущем случае:

test.hex
:060000000AE00395FECFAB
:00000001FF

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

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


и более популярный симулятор simulavr, который не был найден даже в AUR, при том что основная масса полезной инфы в сети именно о нем. Собрать из исходников с целью создания PKGBUILD для AUR у меня не вышло, хотя я перебрал все адекватные ветки в официальном репозитории. Пришлось прибить зверский костыль, скачав DEB-пакет для Debian, превратив его в пакет для арча с помощью утилиты debtap.


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

Версия эта довольно древняя, а текущий релиз (судя по дате последнего коммита в репозитории) ушел довольно далеко.

Пока же мы используем для отладки костыльно поставленный simulavr

Итак, сначала отладим программу хардкорно — из консоли запустим эмулятор


запускаем эмулятор ATMega 16 (ключ -d) на частоте 8 МГц (ключ -с) с опцией удаленной отладки и возможность красивого просмотра регистров контроллера (опция -P, которая по данным из сети в свежайшей версии эмулятора убрана). Видим окошко терминала с содержимым регистров и памяти



сообщающее нам о том, что эмулятор ждет подключения отладчика на порту 1212 (порт можно указать при запуске ключем -p). В другой консоли стартуем отладчик:


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


Подлючаемся к эмулятору


Загружаем ELF-образ в эмулятор (да, именно его а не hex, на чем я обжегся в самом начале) d 'vekznjh


Загружаем отладочные символы:


ответив «yes» на заданный вопрос, получая следующую картину:


Что же, мы видим наш исходник и отладчик, готовый к приему команд. Даем команду next


и видим как отладчик бодро переместился по коду.


можем посмотреть изменившееся состояние регистров контроллера как в консоли эмулятора


так и в окне отладчика:


С этого момента нам доступен весь богатейший инструментарий, предоставляемый отладчиком gdb. Однако, что линуксоиду хорошо то виндузятнику смерть меня упрекнут мол «чувак, в Atmel Studio есть нормальная отладка с отображением исходников, перемещением по коду хоткеями и просмотром значений вразумительным графическим способом» и будут правы, поэтому попытаемся хотя бы частично решить проблему дружественности отладки, совместив её с разработкой

IDE Eclipse известна давно. За время своего существования она прочно утвердилась в разных областях разработки ПО и может «тупо всё», благодаря обширному набору плагинов, расширяющих её функциональность. В свое время я восторгался ей, но время это прошло, так как в обыденной работе у неё есть масса мелких нюансов, раздувающихся в недостатки (на работе в продакшене я предпочел для того же C/C++ QtCreator в силу специфики деятельности, о чем не жалею).

Тем не менее, с точки зрения решаемой нами задачи она вполне удовлетворяет её требованиям. Для работы с AVR в Eclipse потребуется установка следующих плагинов


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

Eclipse по своей сути ориентирован на C/C++ разработку, поэтому для создания ассемблерного проекта воспользуемся генерацией проекта через имеющийся Makefile, который и напишем для нашего теста. Вот он

Написав этот опус открываем Eclipse и создаем новый проект File -> New -> Project, выбирая сишный проект на основе Makefile


жмем Next, в следующем окне выбирая расположение каталога с исходниками и Makefile


Шлепаем Finish и видим наш проект во всей красе


Идем в меню Project -> Build all и получаем все необходимые нам бинарники:


Теперь настроим запуск эмулятора, как внешнего инструмента проекта зайдя в Run -> External Tools, создав новую конфигурацию с настройками соответствующими приведенным скринам



Тут мы сообщаем среде, что хотим запускать эмулятор с нужными нам параметрами командной строки, поместив пункт запуска в меню Run → External Tools.

Применяем настройки, идем в меню Run → External Tools → atmega16 и наблюдаем запуск эмулятора:


Хорошо, теперь настроим конфигурацию отладки нашего проекта. Идем в меню Run → Debug Configuratuions и настраиваем аппаратную отладку через GDB.


не забывая указать тип соединения с сервером симуляции:


и указав, какие действия следует выполнить при запуске отладки:


Обязательно ставим галки на Load image и Load Symbols — это позволяет отладчику загрузить прошивку в эмулятор и прочесть отладочные символы. Ставим точку останова на метку M1.

Жмем кнопки Apply и Debug и… вуаля!


Отладчик послушно стал на указанной точке останова. Доступен просмотр дампа памяти и содержимого регистров. Жмем F5 (или F6) и трассируем наш код по шагам.


Что хочу сказать в финале? Я уже тысячу раз говорил о том, что все мои статьи на ресурсах хабр и гиктаймс — отражение личного опыта и рупор субъективного мнения. Решена задача — организация разработки ПО для контроллеров AVR в среде Linux. Эта статья — продукт долгого гугления и сбора информации из разрозненных сетевых источников. Цель её — натолкнуть новичка на поиск в нужном направлении. Статья не претендует на академичность, она лишь продукт моих собственных копаний и попытка поделится собранной информацией, а так же привлечь заинтересованных людей к интересной мне теме.

Тут много о чем не сказано, например о прошивке через avrdude, который (sic!) есть кроссплатформенная утилита прошивки для семейства AVR. Если у читателей будет желание, а у меня возможность, мы рассмотрим и её, помигаем светодиодами, пошлем слово «жопа» «счастье» через USART и так далее. Тема неисчерпаема и достойна продолжения. Время покажет.

Здравствуйте. Интересует ряд вопросов по программированию микроконтроллеров AVR в Linux (Debian). Прошу отвечать людей, которые занимаются этим.

  1. Существуют ли аналоги Proteus для Linux? Очень желательно с поддержкой МК AVR. Но в первую очередь хотя бы просто для симуляции несложных схем.
  2. Как хорошо обстоят дела с самодельными программаторами, типа костылей в виде 5 проводков для LTP порта и китайскими USB программаторами за 5 баксов, а также с нормальными программаторами которые поддерживают отладку с помощью интерфейса jTag.
  3. Какую среду разработки можете порекомендовать для написания кода на асме и Сях? Имеется ли вообще такая среда или плагины для IDE типа eclipse или редактора VIM.


Вообще всё работает, но вендовые альтернативы выглядят намного более ынтырпрайзно.
А почему именно AVR? Почему бы не ARM или 8051?

По учёбе изучали именно AVR, но практики у меня маловато, а вот теории достаточно.

Сама тема микроконтроллеров мне очень понравилась, поэтому хочу начать именно с AVR.


А почему именно AVR? Почему бы не ARM или 8051?

И зачем вообще Linux? Мне кажется, что ожидания топикстартера несколько завышены и лучше сразу разочаровать. Все плохо (на самом деле нет). :)


AVR — это неплохое начало. Если есть LPT, программатор можно сделать из говна и палок (проверено, работает с avrdude). Готовый тулчейн есть даже в репах популярных дистрибутивов. Начать писать на Си под AVR очень легко.

Зачем Linux? Я долгое время провёл за ним, уже привык. На винды слезать не охота.


Для пяти проводков есть пони с ужасным внешним видом, работающая. AVRDude для китайских и не очень usb костылей.


Ответ людей, которые занимаются этим:


К сожалению, всяких вижуалстудий (в твоём случае AVR Studio) на эти наши линуксы не завезли. С другой стороны — почему к сожалению? К счастью! Порог вхождения намного выше, потому разработчику перед непосредственно разработкой нужно разобраться, как же система работает и понять её принципы и философию. Результат: количество школоподелок от индусских детей меньше, следовательно общее качество софта выше.

CYB3R ★★★★★ ( 25.06.16 23:07:59 )
Последнее исправление: CYB3R 25.06.16 23:08:14 (всего исправлений: 1)


Зачем Linux? Я долгое время провёл за ним, уже привык. На винды слезать не охота.

Ладно, ладно. Вместо протеус можешь попорбовать библиотеку simavr (есть simulavr и есть simavr. Это разные проекты). Это, конечно, не визуальная среда, а библиотека, но с помощью нее ты можешь весьма гибко симуляцией и отладкой заниматься. Вскользь описывал тут: Свободное ПО в электронике - 2

Какой отладчик используется при отладке AVR через JTAG в Linux?

ns_ramesses ★ ( 25.06.16 23:14:14 )
Последнее исправление: ns_ramesses 25.06.16 23:14:25 (всего исправлений: 1)



AVR я отлаживал через симулятор, а не через JTAG. Симулятор работал с gdb-avr в паре. Это *гораздо* круче на мой взгляд, потому что позволяет буквально смоделировать нужные входные воздействия и ситуации симулятору.


C arm нужна отладочная плата, тут проводками не отделаешься, непаябельные корпуса, информации меньше, ни фига оно для начала не лучше, а продолжения может и не быть.


SMTовская дискавери дешевая штука. А если продолжения не будет, то зачем начинать?


А в эти симуляторы поддержку таймеров и прерываний уже завезли? Пару лет назад не нашел.


Не морочьте себе голову. Беритесь сразу за ARM. Да, есть для Eclipse плагин для AVR. Но в сравнении с плагином для ARM он убог до невозможности. Для ARM (в частности STM32) Вы получите, вполне себе, полноценную среду разработки (не даром всякие CooCox и Atolic на основе Eclipse), плюс по соотношению цена/возможности AVR далеко позади. Потратьте около 5 у.е. на набор (платка с STM32F1 и китайский клон ST-LINK) и будет Вам счастье.


Относительно дешевая, да. Если учесть что с программатором. Начинать чтобы убедиться что не не твоё или по принуждению образовательной системы. У STM самый вменяемый корпус TSSOP20, не сравнить с дипами атмег, это всё таки не для самоделок. Хотя может ты и прав, сразу привыкнуть к плохому и не париться с авр.


Если хочется дипов, то PIC. Тулзы под линь есть.


Даже не смешно.
Непаябельные корпуса? Купите себе нормальный паяльник, а лучше станцию. А AVR в TQFP намного паябельней?
Меньше информации? Да Вы поиском, видимо, пользоваться не умеете.
Нужна отладочная плата? Это даже плюс, так как сразу можно посмотреть как все работает на живом устройстве. Тем более цена вопроса — копейки.
P.S.: Почему продолжения может и не быть?


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

У STM самый вменяемый корпус TSSOP20

А про то, что NXP LPC81x можно уже и в DIP, я упоминал здесь.

avr-gcc и avrdude работают отлично, даже лучше чем на винде. Кодишь в любимом блокнотике, компилируешь makefile'ами и горя не знаешь. А вот зачем кому-то нужны отладчики и симуляторы для avr я понять не могу. Разве что для обучения, хотя это ведь не ARM, тут все просто как грабли, нечего отлаживать.


А в эти симуляторы поддержку таймеров и прерываний уже завезли? Пару лет назад не нашел.

В какие эти симуляторы? А какие проверял и какими пытался пользоваться? В simulavr не знаю, не пользовался, должны быть, смотреть лень. А в simavr были с самого начала, с тех пор, как я им воспользовался. Там и АЦП есть, UART есть и др. А поведение периферии пишется на Си. Можно и с графикой делать, но только сам рисуешь. Есть примеры в самом пакете и на просторах можно найти:


Simulavr. Про пару лет я конечно приврал. Это было где-то в 2009. Хотел проверить что-то с таймером, но увы и ах. Он мне выдал, что на данный момент таймеры и прерывания не реализованы. После этого я даже не пробовал симуляторы, так как впечатление было подпорчено.
Почитал про simavr — интересная вещь. Почему он тогда мне не попался?


В чем проблема запаять LQFP? У коллеги по работе даже шестилетняя дочь хорошо с этим справляется при помощи простого 25-ти ваттного паяльника (ей нравиться паять). Единственная проблема, с которой можно столкнуться, если делать самоделки, это изготовление платы. Но при должной сноровке и это не проблема. Ну а для того, чтобы разобраться достаточно готовой отладочной платы и программатора, которые, повторюсь еще раз, стоят копейки. Не понравиться — можно отдать кому-то, кому это будет интересно. Я так и поступил с отладочными платами и программатором для авр — отдал студентам первокурсникам. Тем более, что для авр тоже нужна отладочная плата.
Про паяльную станцию я писал Вам, а не ТСу. И что такого плохого в эклипсе? Ну и про информацию: сейчас и по стм полно информации и работающих примеров. Так что это не довод.
Плюс ко всему, если ТС решит пойти работать в сферу, связанную с микроконтроллерами, то авр ему не пригодится с очень большой (даже огромной) долей вероятности. С армами же все с точностью до наоборот.


1) Нету. Можно пускать протеус в виртуалке.

2) Китайские клоны usbasp работаю чудесно.

Пишу в QtCreator, собираю make, прошиваю avrdude.

С точки зрения обучения, начинать нужно от простого к сложному а не наоборот. Если, например, студент не знает как работают прерывания, то кидать ему сразу NVIC или AIC для самостоятельного изучения будет не очень разумно. Хороший студент может и выплывет, а если не очень хороший, то получится очередной script kiddie, который дальше примеров производителя ничего не может.

Это было где-то в 2009 [. ] Почитал про simavr — интересная вещь. Почему он тогда мне не попался?

Читайте также: