AVR megaEclipse. Делаем среду all-in-one.

Мне всегда было интересно и даже немного завидно, почему системные программисты и те, кто разрабатывает настольные приложения обладают удобными средами, встроенным отладчиком, могут анализировать написанный код на предмет утечек памяти, производительности кода и так далее и почему этого всего почти нет для 8 и 16-битных микроконтроллеров? А ведь эти рабочие лошадки для большинства проектов выгодны по цене и целесообразны по производительности и функционалу. Проект среды разработки Eclipse призван стереть границы применимости среды и позиционирует некий универсал, не хватающие возможности которого можно дополнить плагинами и запуском внешних приложений. О том, как сделать эту среду отладчиком, средством прошивки микроконтроллеров, симулятором контроллера и средством контроля версий мы и расскажем в этой статье. Все это будет сделано по отношению к МК AVR, как самому любимому и популярному МК в рунете в связке с компилятором GCC.
В инете много вопросов о том, как настроить отладчик в этой среде, как сделать прошивку контроллера одним щелчком и как сделать систему сборки CMake под Eclipse. И если последнее мы обсуждали в нашей статье, то первое - очень актуально. Лично я после проведенных действий чувствую себя "белым человеком", так работа с МК свелась к нажатию кнопок, что очень удобно. Итак, поехали:

Для начала ставим компилятор winAVR. Зачем такое старье? Ведь уже есть AVR Toolchain. Узнаешь потом. Кстати, проясним ситуацию. Проект winAVR стал коммерческим. Его купила Atmel и платит разработчикам. Естественно после такого happy продолжения продукт становится хуже. Ведь те студенты, которые делали его за бургеры, начинают нормально работать, а это опасно!

Затем ставим AVR-Eclipse plugin. Как ставить, уже рассказано было тут.

Затем ставим обновление  GDB Hardware Debugging. Для этого. Заходим Help-->Instal New Software и тыкаем, как показано на картинке (за одно можно и GCC Cross Compiler Support установить):

 Отладчик. Прежде проведем небольшой ликбез. Отладка МК AVR выглядит следующим образом:

- Есть такая программулина - avarice.exe. Она лежит в каталоге компилятора. Эта программа выполняет своего рода буфер - преобразует команды GDB отладчика в команды JTAG отладчика. Образно говоря, "плюет" ему через hardware порт соответствующие команды и параметры.  Эта программа также ждет данные на специальном порте, который является входным для нее и на который посылает данные сам отладчик верхнего уровня.

- В роли отладчика верхнего уровня выступает avr-gdb, он устанавливает socket-соединение с портом, с которого ждет данные avarice.

- Собственно ваша среда, где команды "шаг вперед", брейкпоинт преобразуются и посылаются avr-gdb.

В Avr Studio 4 схема была похожей, но они скомпилировали свой avarice и сделали его зависимым от пары DLL файлов. Это, к примеру, позволяет работать старым отладчикам типа Jtag ICE MKI с новыми контроллерами Avr Mega2560, только работать НЕПРАВИЛЬНО. Не используйте старый отладчик для МК megaAVR от 1280 и выше. Прошивка и отладка идут неверно в этом случае. Зачем Atmel это сделала - непонятно. На самом деле, много чего непонятно в этой компании. Компания теряет рынок и в принципе, уже практически обречена на утрату позиций.

Чем шить? Avrdude. конечно. А как лучше сделать вызов этого консольного приложения, также будет рассказано в этой статье, причем 3мя различными вариантами. Теперь к делу:

1.  Настраиваем проект, выбираем формат генерируемых данных после сборки  как avr-gdb отладчика в свойстве проекта.

2. Настройка avarice.

Заходим в настройку внешних  инструментов

1. Задаем имя

2. Не стоит быть наивным, что у вас  в Path прописан путь к этой тулзе. Находим ее руками в папке компилятора и явно указываем.

3. Говорим, что путь к рабочей директории проекта хранится в его системной переменной worspace_loc. Спешу сообщить, что адрес папки туда заносится при создании проекта. А вот большинство остальных системных переменных в Eclipse не инициализированы, хотя и доступны на использование. Только если вы их укажете, то тут же появится ошибка нулевой переменной. Почему разработчики так сделали, неясно.

4. Пишем параметры запуска. Здесь на картинке приведен пример для программатора-отладчика AVR Dragon. Например для JTAG ICE MKI будет так:

-1  --ignore -intr --jtag  /dev/comX:4242, где X - номер порта

Сохраняем, проверяем - делаем RUN. Убеждаемся, что avarice запустился. Он закроется с ошибкой, если порт недоступен или программатора там нет. (Кстати, сравните это с картинкой, увидите разницу. Картинка взята с официальной документации на Eclipse).

2. Симулятор simulavr.exe. У нас есть незабываемая возможность отладить код частично на своем компьютере. Что может быть полезно, если код, который вы пишете - имеет сложную логику. То есть работает с периферией по минимуму. Вот только есть одно НО! Поддерживается всего лишь 4 контроллера:

- AT90S4433

- AT90S8515

- Atmega48

- Atmega128

Здесь все аналогично первому описанию.

Вообще, открою секрет, я ранее пытался все это настроить, руководствуясь вот этим ресурсом. Вроде официальная документация от Eclipse. Ну так вот, там в примере вам серьезно предлагают указать тут atmega16, которого нет в поддержке. Ну, в общем, косяк и он там не единственный. В дальнейшем, simulavr будет для вас как бы заменой avarice, то есть вместо запуска avarice, нужно будет запустить эту тулзу. Двигаемся дальше.

3. AVR-GDB

Существует 2 способа отладки, они указаны красным на следующей картинке. Мы настроим оба.

Разница между ними практически отсутствует. Работать физически они будут с одной и той же тулзой.

C/C++ Local Application

Debugger 

Установить в  gdbserver Debugger

GDB debugger

Изменить на "avr-gdb".

GDB command file 

Оставить пустым

GDB command set

Выбрать "Standard (Windows)".

Protocol 

Выбрать "mi".

Verbose console mode

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

 

Далее переходим на вкладку Connection.

Тип соединения - TCP

Адрес - localhost

Порт 4242

 

GDB Hardware Debugging

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

Далее переходим на вкладку, изображенную на следующей картинке:

Здесь выбираем, где расположен .elf файл, необходимый для отладки. Опять-таки, используйте только эту системную переменную, либо пишите путь абсолютно. В принципе, можно указать так: ${workspace_loc}\debug\${project_name}.elf . Тогда получим универсальную настройку, но придется для проектов прописать соответствующие переменные.

Ставим галочки "поставить брейкпоинт" на "main" и продолжить. В случае, если вам нужно при этом залить прошивку (что может быть удобно), поставьте  галочку на "load symbols" и укажите путь к прошивке .hex , также можно отлаживать не сначала и задать значение счетчику команд. На этом всё.

Запуск отладчика

Итак, последовательность действий всегда будет такова:

1. Запускаем avarice или simualvr. Для этого на вкладке "External tools application" выбираем настроенный нами профиль и запускаем. В дальнейшем, это можно делать просто нажатием на кнопку. Запустится последний активный профиль.

2. Затем, запускаем отладчик. Для этого щелкаем кнопку с значком "bug", либо также выбираем один из двух профилей отладку и щелкаем запустить. Убедитесь, что avarice перед этим запустился, иначе среда выдаст вам сообщение, что невозможно создать процесс.

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


В чем прелесть такой кучи действий и настроек:
- в AVR Studio 5 убрали поддержку JTAG ICE MKI, тут она есть.
- даже из старой AVR Studio попробуйте отлаживать С++ код, собственно и проект на С++ собрать туда будет сложно. Здесь вы с помощью копеечного отладчика, который можно сделать самому, можете отлаживать С++ код.

Прошивка контроллера AVR через программатор, отладчик или даже Bootloader.

Способ 1.

Значит так. Мы юзаем отладчик JTAG ICE MKI, программатор AVr910, а также бутлодер STK500V2. А еще раньше юзали AVR Dragon, но он сгорел.  Для всех эти случаев основа одинакова - создаем новую конфигурацию External Tools. Делаем это так, как показано на картинке:

Назначение этих магических параметров уже подробно объяснялось тут. Повторим их для удобства:

avrdude –p m2560 -b 57600 –c stk500v2 –P com6 -v  –U "flash:w:c:\uniRobot.hex:i"

  Будьте внимательны, высота букв меняет команду. Краткая расшифровка параметров:
-p – модель контроллера
-b – baudrate (скорость обмена)
-с – модель программатора (протокола бутлодера в данном случае) 
-P- порт
-U – тип памяти, код команды (w-считать из файла, записать в память), после двоеточия – название файла.
-v – вывод отладочной информации. Удобно для отслеживания ошибок.
-i - формат прошивки (Intel)

Здесь часто возникают проблемы, связанные с текущей локацией и правами доступа.  На это нужно обратить внимание.

При правильном выполнении команды в консоли вы получите следующую информацию:

avrdude: AVR device initialized and ready to accept instructions

Преимущества:

- STK500V2 -новый бутлодер и поддерживает новые контроллеры мега 2560 и старше

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

- в отличие от AVRProg, встроенной в AVR Studio и имеющей GUI, здесь можно поменять скорость работы, что критично для МК с кварцем на 8 МГц, так как при таком кварце STK500V2 на 115200 работать не может.

Недостатки:

- Нужно перезагружать плату, чтобы она вошла в режим бутлодера

- Нужно скомпилировать и прошить сам бутлодер. Однако, это мы уже рассказали, как сделать.

Для JTAG ICE MKI все аналогично, только нужно поменять STK500V2 на программатор  jtag1 , в случае AVR910 - поставить avr910. BaudRate при этом ставить не нужно.

Способ 2. Подходит для тех, кто с помощью CMake создал сборку для проекта и собрал ее под Eclipse.

Здесь нужно рассказать про target. По сути, все внешние вызовы для сборки проекта делаются посредством  запуска соответствующего target в системе сборки. Мы же можем добавить свой отдельный для прошивки, а затем создать его вызов в среде Eclipse, что она с удовольствием позволяет делать. Для этого вам придется отредактировать макрос  cMake:

# create avr executable
MACRO(AVR_ADD_EXECUTABLE args)
 
INCLUDE(avr_cross_compile)
 
SET(NAME ${ARGV0})
MESSAGE(STATUS "ADD AVR EXECUTABLE : ${NAME}")
 
SET(EXECUTABLE_NAME ${ARGV0})
ADD_EXECUTABLE(${EXECUTABLE_NAME} ${ARGN})
AVR_CREATE_HEX(${EXECUTABLE_NAME})
ADD_CUSTOM_TARGET(${EXECUTABLE_NAME}-upload COMMAND avrdude ARGS -p m2560 -b 57600 -c stk500v2 -P com6 -v -U flash:w:${HEX_PATH}/${EXECUTABLE_NAME}.hex:i)
 
ENDMACRO(AVR_ADD_EXECUTABLE)

Затем, создаем вызов  target, который в нашем случае выглядит как "имя проекта-upload".

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

 Способ 3. Задействуем возможности AVR Eclipse plug-in. Только перед этим выберем в свойствах проекта соответствующий программатор «Проект->Свойства->AVR->AVRDude»

Доступно очень много программаторов. В списке можно найти практически все известные для AVR. Также можно изменить параметры запуска:

 В общем,  на этом радость заканчивается, теперь о печальном:

Пичалька

Вы собрали проект с помощью CMake, импортировали его в среду. Вас ожидают отличные новости, у Eclipse всех версий, кроме последней нет средства преобразования проекта с добавлением тегов, чтобы уже установленные плагины могли работать с "чужим проектом". В любом случае, после добавления проекта, сгенерированного   CMake, вам нужно сделать конвертацию проекта. Для этого выберет file->new-convert  to C/C++ и дождитесь, пока среда изменить файлы проекта. Это позволит вам отлаживать проект и способом 2 сделать прошивку. В новой версии Индиго добавили-таки новую форму конвертации, когда среда добавляет в XML файл проекта специальный тег Nature, однако даже это не делает проект доступным для AVR-eclipse  плагина.  Я еще в старой версии обнаружил, что если добавить этот тег вручную, то инструменты плагина становятся доступны проекту, теперь же этот конвертер добавили, однако проблему он решил.

Заключение

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

P.S. Я тут упомянул про AVR Toolchain. Ну так вот, я провел эксперимент. Удалил WinAVR  и поставил AVR Toolchain. Поставил на компиляцию 10 старых проектов, так вот, 3 из них не скомпились. Вывалилась ошибка компилятора где-то в его недрах, путь не помню. Поэтому я удалил это фигню и восстановил старый добрый WinAVR, проверил сборку еще раз - все 10 проектов скомпилировались. Не знаю, что сказать, но мне жалко компанию Atmel, жалко, что они докатились до такого. Мы видим закат этой линейки контроллеров. Как бы мы их не любили, но средства отладки, ценой десятков тысяч рублей, отсутствие полноценной библиотеки периферии и убогая среда разработки от производителя лично нас заставили пересесть на другое семейство МК, не говоря уже про цену, когда 8-битный МК стоит дороже, чем CortexM3 некоторых производителей.

7 Comments

  1. shcherbakovn:

    Какое семейство МК Вы используете?

  2. Delphi:

    Я делал все это для AVR mega2560. Был большой проект, мы его собрали под cMake. Кроме 2560, юзали 16,32,48,168,328.

  3. juvf:

    Вижу скриншот отладки. Вижу окошко с регистрами r30, r31, SREG и т.п. Это гуд. А регистры периферии есть? И как они отображаются? Например нужно значение бита UDRE1, его покажет? Или покажет просто хекс регистра UCSR1A в который входит бит UDRE1?
    В авр студии некоторые регистры периферии показаны побитно, а также конкретное значение значение, например отображается значение битов CS20, CS21, CS22 - эти биты выбирают источник клоков для таймера, в студии можно посмотреть их значение побитно, а можно забить на битовое значение и посмотреть что эти биты выбрали, т.е. "No clock source", "clkT2S/(No prescaling)", "clkT2S/8", ... , или "clkT2S/1024". Предоставляет ли аврплуг в эклипсе такие удобства?

    Будет ли работать такая сборка с AVR JTAGICE mkII?

    Будет ли работать отладка через ISP?

  4. Delphi:

    Да, AVR JTAGICE MKII поддерживается.
    ISP - это внутрисхемный программатор. Отлаживать через него нельзя. Эта технология использует JTAG
    Да, с расшифровкой битов есть неудобство.

  5. volldemar:

    Подскажите, как настроить эклипс, если не использовать авр-плагин?
    Интересует настройка в эклипсе отладки. Пробовали ли через HappyJTAG2 отладку?

  6. Delphi:

    Настройка отладчика никак не привязана к плагину. Вы можете это сделать без плагина в общем случае. Если вы не используете плагин, то все настройки вы можете прописать в makefile или сгенерировать его, используя cmake. Затем сделайте импорт проекта и вы получите обычный С проект с настройками под компилятор AVR. Также в этом случае вам придется подумать о файле линковки и указать его явно в свойствах проекта, где вы пропишете настройки под ваш конкретный МК. Только зачем это все делать, проще установить плагин.
    Отладку с использованием HappyJTAG2 нельзя сделать, используя AVR-GDB сервер. Так как по словам автора, тулза, которая эмулирует JTAG ICE MKII заточена под систему команд AVR Studio, а та в свою очередь отличается от системы команд AVR-GDB. Но автор собирается решить эту проблему. Поэтому лучше спросить прямо у него на сайте lura.sk (если не ошибаюсь).

  7. FreshMan:

    доброго времени суток
    покорно прошу помочь мне настроить симулятор в эклипсе для отладки програм
    при запуске симулятора выдает вот такое сообщение http://www.imgup.ru/image-vsex18176119.html
    а при запуске отладчика выдает вот такое http://www.imgup.ru/image-vsfx00112016.html

Leave a Reply

You must be logged in to post a comment.