Предисловие
Как известно, среда Arduino (AVR) не содержит функции внутрисхемной отладки, что создаёт большие неудобства при поиске сложных ошибок и сопровождении проектов. Я хочу показать два способа, при помощи которых вы сможете отлаживать свои скетчи разного уровня сложности. Для первого способа вам понадобятся только программы, а для второго нужен недорогой (по сравнению с оригинальным отладчиком) адаптер, который вы можете либо собрать самостоятельно, либо купить готовый.
В общем, ничего нового для тех, кто пользуется отладчиками постоянно, но может быть полезным для пользователей Arduino (AVR).
Сборка при помощи Makefile
Прежде чем мы подойдём к описанию отладки в железе (во второй части) нам нужно немного потренироваться. Вероятно многие знают, что среда Arduino вызывает компилятор avr-gcc со всем окружением, автоматически настраивает параметры его вызова и запускает процесс сборки. Так вот, нам нужно повторить этот процесс явно. Делать это мы будем не вручную, хотя некоторые телодвижения всё-таки понадобятся. Нужно это для того, чтобы получить отладочный объектный файл в формате ELF. Среда Arduino подчищает за собой и у нас нет доступа ни к опциям компилятора, ни к результатам компиляции.
Это подводит нас к вопросу использования утилит для автоматической сборки avr-gcc проекта, а ещё точнее — скетча с библиотеками Arduino. Тут можно было бы погрустить, т.к. дело это не простое, но, как говорится, всё уже сделано до нас. Оказывается, на github уже есть всё необходимое именно для сборки скетчей с библиотеками Arduino. Проект называется Arduino-Makefile. Как не трудно догадаться из описания, этот проект содержит Makefile для автоматической сборки проектов на Arduino. Из перечисленных в описании особенностей мы обратим внимание только на некоторые.
Пакет Arduino-Makefile — это набор конфигурационных файлов, примеров и описаний. В нём нет утилит, которые всё это должны использовать. Нет также и среды разработки, т.е. сборка осуществляется через командную строку. Это означает, что вы можете прикрутить любую удобную для вас IDE, которая поддерживает сборку через Makefile. Я обычно использую Visual Studio.
Если внимательно посмотреть на содержимое, то можно заметить, что есть один глобальный универсальный Makefile (Arduino.mk), который включается в специфические местные файлы сборок. Вам нужно указать только частные (минимальные) настройки для конкретной цели сборки, а остальное будет выполнено в автоматическом режиме (настройка переменных, поиск зависимостей и прочее). Это очень удобно, как будет показано ниже.
Важно отметить, что поддерживаются файлы с различными расширениями (*.ino, *.pde, *.c и *.cpp). Дело в том, что одним из отладчиков у нас будет AVR Studio 4. При загрузке в неё отладочного файла исходники в дереве проектов будут расположены в разных папках: cpp-файлы в sources, а остальные в headers. Если мы оставим расширение для скетча (ino), то файл не попадёт в sources и на него не будет действовать подсветка синтаксиса. Смотреть на это невозможно. Поэтому возьмём на заметку, что расширение для скетчей при сборке для отладки в AVR Studio нужно поменять на стандартные (.c или .cpp).
Инструментарий
Мы выяснили, что можем собирать скетчи. Теперь посмотрим как будет организован сам процесс сборки и отладки. Я обещал показать два способа. У каждого из них есть свои плюсы и минусы. Сделаем их краткий обзор.
Способ 1. Создаём отладочный файл, загружаем его в Proteus, отлаживаем там же.
Достоинства:
— относительная простота отладки (с подключением монитора последовательного порта нужно будет только помучиться);
— доступ во внешний мир через последовательный порт;
— построение графиков (доступны виртуальные измерительные приборы);
— возможность моделировать схему в режиме реального времени;
— в отдельных окнах доступны регистры мк, области памяти, глобальные переменные и исходный код, конечно, в том числе его ассемблерный вариант.
Недостатки:
— платность Proteus;
— ограниченный набор периферии;
— сложные модели не могу учитывать всех особенностей оригинальных компонентов.
Способ 2. Создаём отладочный файл, загружаем его в AVR Studio 4, отлаживаем, используя специальный плагин Proteus VSM Viewer для AVR Studio 4.
По достоинствам и недостаткам почти то же, что и способе 1. Можно добавить, что AVR Studio показывает подробное дерево всех регистров моделируемого мк, вплоть до битов, что очень удобно. Из минусов стоит отметить, что отладка оптимизированного кода имеет свои особенности и не так просто понять как заставить отладчик останавливаться в нужных местах.
Способ 3. Создаём отладочный файл, загружаем его в AVR Studio 4, отлаживаем, используя программный эмулятор JTAG ICE mkII и специальный адаптер (HappyJTAG2).
Достоинства:
— это настоящая отладка в реальном «железе» с использованием JTAG ICE mkII отладчика (поддержка мк вплоть до ATmega2560);
— HappyJTAG 2.45 работает на Windows 7 x64, нужно только пропустить одно окошко, где просят всё-таки купить драйвера.
Недостатки:
— замечена нестабильная работа HappyJTAG2 с небольшими по объёму исходниками;
— нестабильная работа AVR Studio при выполнении отладочных действий;
— автор HappyJTAG2 давно забросил своё детище (видимо с приходом AVR Studio 5 и Atmel Studio);
— некоторые особенности подключения (COM4 или один из первых 4-х последовательных портов должен быть свободен или отсутствовать, т.к. AVR Studio перебирает COM1-COM4 в поиске отладчика). Именно свободен или отсутствовать, т.к. HappyJTAG2 работает, так скажем, «изнутри».
Как вы видите я показал три способа, но в настоящее время практически у меня заработали только два из них. Первый способ будет описан в этой статье. Второй способ, к сожалению, мне не удалось повторить. Нужно найти «совместимую» комбинацию Proteus и AVR Studio. На картинке использована последняя студия AVR Studio 4.19.730 и Proteus 7.7 SP2. Когда-то давно я использовал этот способ, но при наличии железного отладчика пользоваться им не имеет особого смысла. Третий способ я оставил для второй части. Там нужен будет адаптер и описание его подключения к платам Arduino, поддерживающим отладку по JTAG.
И что же для этой всей кухни нам понадобится? Для начала нужно забыть про убогое Arduino IDE, его можно использовать только для контрольных проверок при сборке скетчей. Далее, нам понадобятся:
— Arduino-Makefile — набор конфигурационных файлов для ручной сборки проектов на Arduino;
— какой-нибудь редактор с подсветкой синтаксиса C++ и умением выполнять внешние команды (Notepad++, VS20xx, Far, ...);
— Proteus 7.x — известный симулятор смешанных (аналого-цифровых) схем;
— терминальная программа (PuTTY, ZOC Pro), которая будет аналогом монитора;
— программа, создающая нуль-модемные виртуальные последовательные порты (VSPD, ...);
— Arduino IDE 1.6.x (нам нужны библиотеки и компилятор avr-gcc);
— WinAVR (нам нужны binutils из его комплекта, это набор unix команд для Windows);
— avr gcc 4.9.2 (компилятор посвежее, если не хотите использовать тот, что идёт в комплекте с Arduino IDE);
— AVR Studio 4.19.730 — последняя версия среды разработки от Atmel перед переходом на Visual Studio (понадобится только для второй части);
— HappyJTAG 2.45 (понадобится только для второй части).
Будем считать, что вы знаете как спросить у Google где достать всё это хозяйство. На всякий случай я приведу полезные ссылки в конце статьи. Некоторые комментарии по поводу инструментария.
Как известно, Proteus платный, но это не самое печальное. К сожалению, его библиотеки не на столько близки к реальному миру, как хотелось бы. К примеру, Ethernet shield W5100 вы промоделировать в нём не сможете (по крайней мере в версии 7.x). Поэтому, уважаемые последователи Arduino, идите истинным путём. Только отладка и только в железе спасут ваши души от неправильно поставленных вопросов. Proteus мы будем использовать как инструмент обучения, а в полевых условиях — только JTAG.
Отладка скетчей Arduino (AVR) в Proteus 7.x
Хватит общих слов, теперь конкретики. Есть много вариантов запуска процесса сборки, их все не распишешь, поэтому я остановлюсь на конкретно одном и постараюсь описать его понятно. Увидев общую схему, вы сможете применить её на свой набор средств разработки. Для удобства я разобью описание всего процесса по шагам, некоторые можно будет пропускать. Надеюсь, что даже самые неопытные пользователи Arduino поймут о чём речь.
Шаг 1. Скачиваем и устанавливаем среду разработки Arduino. Для определённости допустим, что она будет из серии 1.6.x. Здесь сразу сделаю несколько замечаний. Вообще, от Arduino нам нужны только библиотеки. Если не считать всего остального, то сама идея упрощённого вида программы очень даже хороша (если сравнить C# и C++ или, не дай боже, C++/CLI, то это небо и земля). Отсутствие же нормальных отладочных средств привело, прямо скажем, к безграмотному программированию. Вместо того, чтобы осознанно превращать задуманный алгоритм в программный код, пользователи Arduino вынуждены делать комбинации из магических заклинаний, выцеживать инфу через Serial.print() и только некоторые пытаются статически прочитать исходники библиотек. Тяжко на это всё смотреть.
Я отвлёкся, а вы, наверное, успели поставить среду по стандартным путям. Желательно, чтобы папка Arduino находилась в корне раздела (C:\Arduino). Это связано с путями в makefile, которые не любят пробелы в «Program Files». Мы позже будем настраивать пути и для тех, у кого папка уже в «Program Files» придётся сделать одну сложную для пользователей Windows вещь — junction point на папку. Возможно, пробел можно экранировать, но я этого не пробовал.
Для определённости, допустим, что путь к среде такой: C:\Program Files\Arduino.
Шаг 2. Скачиваем и распаковываем Arduino-Makefile. Содержимое папки Arduino-Makefile-master распаковать в C:\Arduino-Makefile. Хочу сразу отметить, что внутри есть файл README.md, который лучше посмотреть на github'е, где много чего описано. Также следует взять на заметку файл arduino-mk-vars.md, который содержит описание используемых в пользовательском (проектном) Makefile переменных.
Для работы утилиты make нужен комплект gnu bin utils, который входил в состав WinAVR в своё время. Я не знаю есть ли официальный сайт сборки этих самых утилит под Windows, но можно поступить следующим образом. Вам нужно будет скачать старый добрый WinAVR последней версии и вытащить из него папку utils, где находятся командные утилиты. Можно установить, скопировать папку и деинсталлировать WinAVR (потому что в его комплект входит старый компилятор avr-gcc, который нам не нужен).
Далее, к примеру, создать папку c:\avr-gcc и скопировать utils в неё. После этого добавить в переменную PATH (через свойства Компьютера) путь C:\avr-gcc\utils\bin:
set PATH=C:\avr-gcc\utils\bin;%PATH%
Путь должен быть одним из первых в поиске. Не забывайте про это изменение, т.к. оно может повлиять на работу других программ, если вы используете другие подобные среды разработки.
Шаг 3. Сами знаете где берёте/покупаете Proteus [7.2 — 7.8]. Почему именно этой серии и такой интервал версий? Потому что я их пробовал и вроде бы на несложных проектах они вполне неплохи. Версии больше 7.8 не могли подгрузить объектный файл одного моего проекта в IAR, а ниже я не пробовал. Восьмёрка просто глючная пока, может быть потом кто-то напишет что-то и про неё. Здесь мы с вами возьмём конкретно Proteus 7.8 SP2.
Шаг 4. Используя статью, создаём junction point на папку с установленной средой Arduino, т.е. C:\Arduino должна ссылаться на C:\Program Files\Arduino. Это нужно, чтобы не мудрить с поддержкой пробелов в makefile'ах. Т.о., не копируя папку с Arduino, мы получили её копию в нужном нам месте. Кто пользуется Far'ом может использовать комбинацию Alt+F6 на папке.
Изменяем настройки среды Arduino. Путь к папке со скетчами: C:\Arduino-Makefile\examples. Если используете внешний редактор (Notepd++, ...), то можете поставить галочку в настройках. При этом Arduino при активизации окна будет обновлять содержимое своего редактора автоматически. Выбираем плату Arduino Mega 2560 и процессор ATmega2560 (на самом деле не так важно что тут выбрать, главное определиться с используемым контроллером).
Пишем пример программы для тестирования сборки из среды Arduino, назовём её Example1 и сохраним в папке скетчей:
void setup()
{
DDRD |= ( 1 << DDD2 );
}
void loop()
{
PIND |= ( 1 << PIND2 );
}
Компилируем и проверяем, что сборка проходит. У меня в Arduino 1.6.7 компоновщик объектных файлов (ld.exe) вылетел с ошибкой, я заменил его на другой (можно, к примеру, из этой сборки).
Шаг 5. Копируем файл C:\Arduino-Makefile\examples\WebServer\Makefile в папку с нашим скетчем: C:\Arduino-Makefile\examples\Example1. Исправляем его содержимое следующим образом:
# Arduino Make file. Refer to https://github.com/sudar/Arduino-Makefile
# Suppress printing of Arduino-Makefile configuration.
#ARDUINO_QUIET = 1
# Directory where the Arduino IDE and/or core files are stored. Usually can be auto-detected as `AUTO_ARDUINO_DIR`.
ARDUINO_DIR = ../../../Arduino
# Directory where tools such as `avrdude`, `avr-g++`, `avr-gcc`, etc. are stored in the `bin/` subdirectory.
AVR_TOOLS_DIR = ../../../Arduino/hardware/tools/avr
# Directory where the `*.mk` files are stored.
# Usually can be auto-detected as parent of `Arduino.mk`.
ARDMK_DIR = ../../../Arduino-Makefile
# Device type as listed in `boards.txt` or `make show_boards`.
BOARD_TAG = mega
# Microcontroller model.
# Usually can be auto-detected as `build.mcu` from `boards.txt`
MCU = atmega2560
#CPU speed in Hz
#Usually can be auto-detected as `build.f_cpu` from `boards.txt`, except in
#some 1.5+ cores like attiny where there is a clock submenu.
#F_CPU = 16000000L
# What name you would like for generated target files.
# Defaults to the name of your current working directory, but with underscores (_) instead of spaces.
#TARGET = project
# Baudrate of the serial monitor.
# Defaults to `9600` if it can't find it in the sketch `Serial.begin()`
MONITOR_BAUDRATE = 9600
DEBUG = 1
DEBUG_FLAGS = -O1 -gdwarf-2 -gstrict-dwarf
include ../../Arduino.mk
Вставляем вначале нашего исходника строчку, подключающую явно Arduino.h (это делать необязательно, если есть зависимости от библиотек, указываемые в переменной ARDUINO_LIBS):
#include "Arduino.h"
void setup()
{
DDRD |= ( 1 << DDD2 );
}
void loop()
{
PIND |= ( 1 << PIND2 );
}
Не забываем сохранить исходник и Makefile. Далее, находясь в папке Example1, вводим команду make (при помощи консоли или в Far'е, или другим удобным способом), должна появиться большая портянка, похожая на ту, что выводится в Arduino IDE при включении вывода полной информации о процессе сборки. Это если всё было сделано правильно, если же что-то не получилось, то попытайтесь сначала самостоятельно понять что не так, а потом уж пишите комменты к статье.
Поскольку мы в Makefile закомментировали строку ARDUINO_QUIET = 1, то перед информацией о сборке идёт шапка со значениями переменных самого Makefile. Часть из них задана, а другие вычисляются по ходу выполнения. Это помогает находить ошибки при правке Makefile проекта.
-------------------------
Arduino.mk Configuration:
- [AUTODETECTED] CURRENT_OS = WINDOWS
- [USER] ARDUINO_DIR = ../../../Arduino
Usage: egrep [OPTION]... PATTERN [FILE]...
Try `egrep --help' for more information.
- [USER] ARDMK_DIR = ../../../Arduino-Makefile
- [AUTODETECTED] ARDUINO_VERSION = 167
- [DEFAULT] ARCHITECTURE = avr
- [DEFAULT] ARDMK_VENDOR = arduino
- [DEFAULT] ARDUINO_SKETCHBOOK =
- [USER] AVR_TOOLS_DIR = ../../../Arduino/hardware/tools/avr
- [COMPUTED] ARDUINO_LIB_PATH = ../../../Arduino/libraries (from ARDUINO_DIR)
- [COMPUTED] ARDUINO_PLATFORM_LIB_PATH = ../../../Arduino/hardware/arduino/avr/libraries (from ARDUINO_DIR)
- [COMPUTED] ARDUINO_VAR_PATH = ../../../Arduino/hardware/arduino/avr/variants (from ARDUINO_DIR)
- [COMPUTED] BOARDS_TXT = ../../../Arduino/hardware/arduino/avr/boards.txt (from ARDUINO_DIR)
- [DEFAULT] USER_LIB_PATH = /libraries (in user sketchbook)
- [DEFAULT] PRE_BUILD_HOOK = pre-build-hook.sh
- [USER] BOARD_TAG = mega
- [COMPUTED] CORE = arduino (from build.core)
- [COMPUTED] VARIANT = mega (from build.variant)
- [COMPUTED] OBJDIR = build-mega (from BOARD_TAG)
- [COMPUTED] ARDUINO_CORE_PATH = ../../../Arduino/hardware/arduino/avr/cores/arduino (from ARDUINO_DIR, BOARD_TAG and boards.txt)
- [USER] MONITOR_BAUDRATE = 9600
- [DEFAULT] OPTIMIZATION_LEVEL = s
- [DEFAULT] MCU_FLAG_NAME = mmcu
- [DEFAULT] CFLAGS_STD =
- [DEFAULT] CXXFLAGS_STD =
- [AUTODETECTED] DEVICE_PATH =
- [DEFAULT] FORCE_MONITOR_PORT =
- [AUTODETECTED] Size utility: AVR-aware for enhanced output
- [COMPUTED] BOOTLOADER_PARENT = ../../../Arduino/hardware/arduino/avr/bootloaders (from ARDUINO_DIR)
- [COMPUTED] ARDMK_VERSION = 1.5
- [COMPUTED] CC_VERSION = 4.8.1 (avr-gcc)
-------------------------
mkdir -p build-mega
Будем считать, что всё прошло успешно, тогда у вас должна появиться папочка build-mega, в котором наш долгожданный Example1.elf — этот тот самый файл, ради которого всё действо затевалось. Этим файлом мы «прошьём мозги» виртуальному мк в Proteus и заживём… с ещё одной степенью свободы.
Шаг 6. Вернёмся к Proteus. Создаём новый проект (dsn-файл) в папке с исходником. Достанем из недр библиотек компонент — микроконтроллер ATmega2560 и вставим его куда он поместится, уж здоровый больно. Заполните свойства компонента по картинке. Устанавливать COMPIM пока не обязательно, он понадобиться для работы с монитором.
Затем входим в режим отладки Debug\Start/Restart Debugging. Получите картинку, похожую на такую.
Ну, а дальше, всё зависит от полёта вашей фантазии. В окошке исходников будет доступен не только Example1.ino, но и другие зависимые исходники. Можно раскрыть ассемблерный код, регистры процессора, память и что-то там вроде ещё. Читайте доку на Proteus.
Шаг 7. Нужно настроить монитор. Писать лень, надеюсь сделаете это уже самостоятельно. Смысл, вкратце, такой. Создаёте два виртуальных последовательных порта, соединённых нуль-модемом (лучше с номерами больше COM4). Один прописываете в компоненте COMPIM Proteus, а второй в терминальной программе (PuTTY). Не забудьте поправить скорость и кодировку вывода в терминальной программе, по идее она должна совпадать с кодировкой исходных файлов, если захотите делать вывод в монитор по-русски.
Шаг 8. Если хотите использовать avr gcc 4.9.2, то нужно положить содержимое архива в корень диска и исправить путь в переменной AVR_TOOLS_DIR. Только там у меня не заработал avr-size, кажется. Можно поменять его на тот, что идёт в комплекте WinAVR (или Arduino).
Кстати, чтобы размер выводился в нормальном виде нужно добавить опцию в вызов avr-size (файл Arduino.mk):
avr_size = $(SIZE) $(SIZEFLAGS) --format=avr $(1)
Полезные ссылки:
1. Arduino IDE 1.6.x.
2. Arduino-Makefile.
3. WinAVR.
4. avr gcc 4.9.2.
5. Hard links и пр. в Windows.
6. PuTTY.
7. Notepad++.
Комментарии (23)
svd71
23.02.2016 10:28avr-gcc можно так же не искать в интернете, где версия посвежей и не качать столетнюю winAvr. Достаточно любым архиватором открыть файлы ардуины и скопировать оттуда компилятор. Затем только по известным шагам, коих тучи в инете, добавить путь для аврки в AvrStudio.
Правда есть один нюанс: новый компилятор конечно лучше оптимизирует код (до известных пределов). Поэтому отладку предпочтительней делать с компиляцией по опции -О0. А далее, когда отладка готова, можно выкинуть неиспользованный код (оптимизировать в ручную) и уже пытаться повысить оптимизацию компилятора. Иногда при опции -О3 оптимизация компилятора доходит до безумия и из кода исчезают целые блоки кода.
Поэтому, если опыта не особо много, не стоит грешить на с руки — проверьте компилятор.ViacheslavMezentsev
23.02.2016 10:55«Грешить с руки» на что? И где гарантии что код с -O0 будет делать то же, что и с -Os? Я вот не разбирался с устройством задержек, но часто их использую. Смотрим delay.h:
#ifndef __OPTIMIZE__
# warning «Compiler optimizations disabled; functions from <util/delay.h> won't work as designed»
#endif
> Достаточно любым архиватором открыть файлы ардуины и скопировать оттуда компилятор. Затем только по известным шагам, коих тучи в инете, добавить путь для аврки в AvrStudio.
Это проще, чем установить среду Arduino? И библиотеки автоматом подключатся (статья об этом)? И где об этом написано?
> Поэтому, если опыта не особо много, не стоит грешить на с руки — проверьте компилятор.
Может покажите как собрать скетч компилятором avr-gcc без Arduino IDE и Arduino-Makefile? Людям не пришлось бы выполнять кучу лишних действий, описанных в статье.
В общем, обычные программеры могут посмотреть на статью под другим углом. Если вы купили плату Arduino Mega 2560 и Ethernet Shield W5100 к нему, но лень искать рабочие исходники для работы с сетью и картой в стиле C++, то вы можете использовать готовые библиотеки Arduino. Вот о чём также речь идёт.
Я не пользователь Arduino, а как раз тот, кто хочет использовать их наработки с дешёвыми платами. И мне привычно как раз использовать C++.
tw1911
23.02.2016 12:18Извините конечно, но большая часть 8 битных ардуин работают на 328p который вообще jtag не поддерживает. Для этого есть debugWire. Кстати есть дешевый отладочный комплект atmel atmega328p xminihttp://www.atmel.com/tools/mega328p-xmini.aspx. Без ардуиновских извращений. На него к стати прошивка есть, и сделан он на 32u, так что скоро будет видимо отладчик для тех же ардуин доступный на али.
ViacheslavMezentsev
23.02.2016 13:54Для мелких мк вполне можно обойтись и без отладчика, но когда у вас ATmega128 или ATmega256 и кода под завязку, то без отладчика там делать просто нечего. Вот у вас есть плата Arduino Mega 2560, вы хотите её использовать по-своему, «без ардуиновских извращений». Нужно купить настоящий отладчик, который стоит где-то в районе ~ 10 000 р. А я могу показать как потратить ~1500 р., чтобы получить почти то же (JTAG ICE mkII либо JTAG ICE I, но он не поддерживает ATmega256). Примерно столько стоит китайский комплект Arduino Mega 2560 + W5100.
Вы сможете отлаживать код в AVR Studio 4 (немножко криво и выглядит как костыль, но всё-таки сможете и это лучше, чем ничего). Если есть возможность, то почему бы её не использовать?
А вообще, я не верю в бесплатную отладку AVR от Atmel, лучше буду использовать ARM.tw1911
23.02.2016 22:32Я вот сам на stm32 решил двигаться, но тут решил часики сделать на имеющейся у меня в количестве ардуине и как то часики уже скоро до wi-fi дойдут. А вообще ардуины на камня вроде 2560 это уже серьезный код, который можно и нужно на арме делать. Кстати, вопрос на засыпку, можно на чем то писать и отлаживать stm8 без ограничений на размер кода?
ViacheslavMezentsev
23.02.2016 22:41Не работал с stm8, а IAR разве не поддерживает? На сахаре есть специальная ветка по нему. Отладчик купил на dvrobot, но не помню поддерживает ли он stm8, а так всё работает. Дешево и сердито.
blomnik
23.02.2016 20:16+1Что-то я не понял. А что осталось, собственно, от Arduino? Стандартные сиплюсплюсные либы? Возникает тогда вопрос в целесообразности оного.
Лошадь сдохла – слезь! ©ViacheslavMezentsev
23.02.2016 20:26Я тоже не понял вопроса.
Есть такой проект, кое-где популярный, называется Arduino Mega Server (здесь есть серия статей о нём). Попробуйте его отладить и поймёте про что идёт речь. Точнее будет идти во второй части, но Способ 3 и картинка к нему — это почти что AMS и есть (его отладка в железе). Сама идея мне понравилась, но вот сопровождение проекта никуда не годится. Достаточно почитать форум проекта.blomnik
23.02.2016 23:02Попробуйте его отладить и поймёте про что идёт речь.
По правде сказать, я никогда не использовал AMS и тем более не занимался его отладкой. Но до того момента, пока не приобрел JTAG отладчик (кстати такой же, как у Вас), отладка printf-ами было единственное, что было доступно. Скорости разработки этот факт вовсе не добавлял, потому прекрасно понимаю, что представляет собой подобная отладка. Другое дело, что в своих маленьких проектах я, понятное дело, время от времени пользуюсь чужим кодом. В частности и ориентированный на Arduino. Но это не принуждает меня использовать эту среду. Вот потому я и не понимаю, зачем вообще как-либоупоминатьпривязываться к этой IDE, если от нее почти ничего не осталось.ViacheslavMezentsev
23.02.2016 23:30От неё остался Arduino Framework с готовой стандартной структурой. Этот framework автоматически разбирается в Arduino-Makefile. Я когда-то пытался создать подобный Makefile, чтобы использовать Arduino Framework, но моих познаний не хватило для этого и я забросил идею использовать классы из этого набора, а очень хотелось.
Потом случайно нашёл набор для сборки на github и понял, что это как раз именно то, чего я хотел. Теперь я могу очень просто совмещать свой старый наработанный код с ардуиновским. Это экономит время и упрощает работу.
Поскольку я пользуюсь сложными проектами, то без отладчика соваться туда нет смысла, а вывод в консоль — это черепашья скорость, вот я и нашёл способ как допилить ещё одну недостающую часть.
Теперь я могу к примеру собрать шлюз modbus tcp в modbus rtu и спокойно его отлаживать, а железо то же, что для AMS. Такой шлюз стоит около 20 тыс руб, а я могу собрать его в упрощённом виде за 2 тыс руб. Есть разница? Для простых применений зачем платить больше на порядок?
Если вы хотите убрать Arduino IDE, то как использовать его framework? Вы можете подключить его классы отдельно? Или может напишите всё то же самостоятельно? Зачем?svd71
24.02.2016 12:39По большей части arduino-framework является генератором избыточного кода. Когда реализуются проекты типа помигать светодиодом на это не обращается внимание. Но вот если что то серьезное, идуще в конфликт с самим фреймворком — уже генерируется избыточный код. Пример: использование таймера. Обязательно нужно использовать таймер, созданный в фреймворке. А вот физический доступ к таймеру на кристалле, который требует всего три команды — уже недоступен.
ViacheslavMezentsev
24.02.2016 13:34Мне лень искать/писать httpd для платы W5100. Пусть будет избыточным пока, главное чтобы функционал работал. Лишнее постепенно обрежу.
У меня есть специальный обёрточный код для прерываний, я могу добавить его в arduino-framework и управлять прерываниями как мне нужно.
Если можешь разобраться в коде, то ограничений особых нет.
Gryphon88
24.02.2016 13:01Ещё можно использовать связку AtmelStudio 6/7 + VisualMicro. Не нужна мерзкая (имхо) AVR Studio, а симулятор AVR-ок в студии встроенный.
ViacheslavMezentsev
24.02.2016 13:45Симулятор в студии нельзя сравнивать с возможностями по симуляции в Proteus, он мощнее гораздо. Одно дело голый мк гонять, и совсем другое, когда он может обращаться из симуляции к реальным устройствам или конфигурационной программе на ПК.
VisualMicro не пробовал, денег на него будет жалко. JTAG отладчик при правильном использовании может покрыть большую часть потребностей по отладке. В Proteus можно отлаживать и части кода и строить красивые графики. К примеру, я в нём отлаживал проект AVR DDS 2.0 — прямой цифровой синтез сигнала на AVR. Просто красота.svd71
24.02.2016 14:03вовсе нет. Обычные флаги состояний портов управления в протеусе наблюдать крайне неудобно. При этом запись в флэш полностью отсусствует. Немного подзабыл, но кажется и проблема с записью в EEPROM тоже происходила. Да и некоторые вещи, как специфические режимы ШИМ и таймера отличаются от даташита и реального железа. Так что Протеус это тоже не панацея.
ПС: Хотя в том же протеусе я занимался в свое время отладкой web на enc28j60. Проблемы были только со слабостью компа, но симуляция позволила всю работу сделать. Так же можно при довольно мощьном компе делать отладку и USB-устройств.ViacheslavMezentsev
24.02.2016 14:39Я в Proteus отлаживал RTOS, также отлаживал работу специального класса, который работает с EEPROM как с мелкой файловой системой (EFS: EEPROM File System). Ещё писал панельный файловый менеджер для терминала, который работает с виртуальной sd-картой. С JTAG'ом дольше бы разбирался, а в нём всё быстро можно промоделировать.
У меня к нему никаких претензий особых нет, что может, то он делает. Я и 10% не знаю его возможностей, а пользуюсь только тем, что на виду.
Что касается регистров, то раньше я отладку делал по способу 2, который сейчас не работает. Там плюсы студии прибавлялись к плюсам Proteus и всё было просто замечательно. Для обучения вообще идеальная комбинация.
Gryphon88
24.02.2016 14:19Я не спорю, что Протеус лучше. Он правда очень хорош. Но знает себе цену, которую жалко уже мне. Слово «JTAG» некоего сферического ардуинщика в вакууме, который купил железку за пару баксов на поиграть и поэкспериментировать, часто пугает своим тёмным смыслом. А с VisualMicro я или использовал урезанную бесплатную версию, или под акцию попал, но точно не платили и не крякал.
Мне просто кажется, что если человек начал курить отладку через JTAG, то через какое-то время он перейдёт с ардуиновского диалекта на нормальный С (может, с использованием ASF для прототипирования), начнёт лутить платы, а также обрастёт бородой. А связка из свежей студии и бесплатной VisualMicro — это маленькое новичковое счастье из коробки.ViacheslavMezentsev
24.02.2016 14:55Видимо во второй части придётся видео сделать, чтобы борода не отрастала.
Те, кто освоят JTAG хотя бы по моему способу, уйдут в большой отрыв в своих начинаниях по сравнению со своими сферическими коллегами. Это я обещаю.Gryphon88
24.02.2016 15:23Если почитать про JTAG в любом из туториалов, становится понятно, что это несложно и общеполезно. Я сейчас воспроизведу свои действия и ощущения, начиная с того момента, когда я 3 года тому купил ардуину:
1. Моргаем светодиодиками, щёлкаем кнопками… — прочие новичковые поделия из области базовой схемотехники. Пока всё прозрачно.
2. Делаем устройства-шутки. Я, например, сделал «журнал посещений» на основе весов, вмонтированных под сиденье стула, в дополнении к бумажному журналу использования прибора. Становится понятно, что датчики могут врать, кнопки дребезжать. Становится известно о такой вещи как прерывания. Пока все понятно, нужно только нагуглить нужный туториал и ещё немного покурить схемотехнику. Время от времени я делал что-то совсем странное, мне не хватало памяти, я полез смотреть, а как люди все это дело отлаживают. Узнал о Proteus и других симуляторах, подумал о покупке JTAG-отладчика, зашёл на Чип-и-дип, ужаснулся ценам. В итоге ограничился протеусом и диагностическими сообщениями через uart
3. Делаем что-то разумное. В моём случае, контроллеры шаговичков вместо сгоревших. Тут начинаются небольшие проблемы: Arduino IDE начинает не хватать даже для редактирования кода, гугление ведет на avr-freaks, где вместо милого digitalWrite используется регистровая магия… Я начал более внимательно вне ардуиновского форума смотреть, как люди пишут под МК, научился читать даташиты, переехал на С и таки купил отладчик за 10 баксов на али. Жить стало проще, жить стало веселей, особенно разбираться с переходом между прерываниями. А борода у меня на момент покупки первой ардины уже была.
hippieua
При сборке проекта в arduino если включить verbose output:
C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-objcopy -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 C:\Users\hippie\AppData\Local\Temp\build6258644420573998665.tmp/Roof_Controller_v0.4.cpp.elf C:\Users\hippie\AppData\Local\Temp\build6258644420573998665.tmp/Roof_Controller_v0.4.cpp.eep C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-objcopy -O ihex -R .eeprom C:\Users\hippie\AppData\Local\Temp\build6258644420573998665.tmp/Roof_Controller_v0.4.cpp.elf C:\Users\hippie\AppData\Local\Temp\build6258644420573998665.tmp/Roof_Controller_v0.4.cpp.hex
И eep и elf и hex
ViacheslavMezentsev
А как указать опции формата отладочного файла? Дело в том, что не всякий elf скушает AVR Studio 4. Если посмотреть на мой Makefile, то там можно увидеть некоторые дополнительные опции. Без них студия просто аварийно завершается при попытке открыть elf файл.
Я долго искал нужную комбинацию, так как без неё невозможно выполнять отладку в железе.
hippieua
Возможно вы и правы, но я писал это относительно фразы
ViacheslavMezentsev
Я подозревал, что проект собирается во временных файлах, но этот путь тупиковый для дальнейшего изложения. Кармы нет, плюсовать не могу.
Я проверил работу с elf-файлом из временной папки. Да, можно его использовать. Я боялся, что в Proteus не будет доступа к исходникам, т.к. у него есть такая особенность, что файл dsn должен находиться в папке с проектом. Но исходники доступны в списке выбора.
У такого подхода есть минус — вы не контролируете параметры выходного объектного файла и его отладочную информацию. Из-за этого вы не сможете подгрузить его в AVR Studio 4 (проверено). Да, доступ к файлу есть, но он бесполезен, если вы используете 4-ку.