Как отладить эскиз Arduino?

10

Я начал писать код для Arduino совсем недавно. И эти ошибки в коде убивают меня. Поскольку в Arduino нет аппаратного отладчика, serial.print () - мой единственный выход. Какие методы / практики вы используете для отладки кода Arduino?

0xakhil
источник
пожалуйста, посмотрите на playground.arduino.cc/Main/DevelopmentTools для IDE и отладчика инструментов
Dallo

Ответы:

8

Модульность твой друг. Напишите свой основной цикл, чтобы делать свое дело, вызывая функции, которые вызывают функции, ... до уровня, на котором ваши функции будут простыми. Начните с основного цикла и следующего уровня вниз, сделайте функции-заглушки; либо пустой:

function foo(){
    ;
}

или подделка:

function read_temperature(){
    return(95);
}

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

Чтобы отладить функцию, которая возвращает неправильное значение, или создать ее без какого-либо влияния со стороны остальной части вашего приложения, вы можете создать строительные леса - простой эскиз, который просто передает функции некоторые примеры значений, а внутри функции выводит значения параметров и некоторые промежуточные значения, пока вы не получите некоторое представление о том, какая часть функции не работает. Я даже сделал поддельные функции, которые запрашивают у меня в терминале возвращаемое значение. (Очевидно, что этот метод может работать только в том случае, если система может выдержать относительно ледниковую скорость нас, людей! Еще одно применение для строительных лесов.)

Работа с заглушками особенно полезна для поддержки функций, которые взаимодействуют с аппаратным обеспечением, позволяя вам начать запуск приложения, прежде чем погрузиться в таблицы данных, проблемы синхронизации и другие мелочи (например, отсутствие частей!), Которые в противном случае могли бы остановиться ваш прогресс.

Говоря о проблемах синхронизации, переключение выходного контакта в определенной точке вашей программы, например, вход и выход из ISR, дает вам прямоугольную волну на выводе Arduino, частота или рабочий цикл которой может дать вам некоторое представление о внутренней синхронизации вашей программы. Форма прямого ввода-вывода, например,

PORTC ^= 0x01;

, будет искажать время меньше, чем звонить digitalWrite(). Полезно, если у вас есть удобный прицел или один из цифровых мультиметров с возможностью измерения частоты и / или коэффициента заполнения.

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

JRobert
источник
6

Я использую Serial.print () и заставляю светодиоды мигать.

Это почти все, что вы можете сделать.

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

Majenko
источник
5

3 Другие методы:

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

  • Создайте программу вокруг интерпретатора команд, чтобы вы могли работать с разделами одновременно, как здесь .

  • Пульсируйте в значительные моменты времени и используйте прицел.

russ_hensel
источник
3

Визуальный Micro плагин для Visual Studio предоставляет Arduino Debug . Включает трассировку и разрыв исходного кода, а также позволяет «наблюдать» и / или изменять выражения и переменные.

введите описание изображения здесь

Visual Micro
источник
1
Обратите внимание, что это делается с помощью автоматически генерируемых последовательных отпечатков, вставленных в ваш код.
per1234
Это верно, за исключением того, что отпечатки серийного или Wi-Fi и чтения вставляются во временную копию кода, а не в реальный код! Все это ясно объяснено в документах visualmicro.com, и для тех немногих, у кого есть аппаратные отладчики (обычно не для Uno и т. Д.), Они также поддерживаются. У каждого метода есть свои преимущества и недостатки.
Visual Micro
От Debugger для Arduino : «Она не поддерживает пошаговое выполнение кода и это было основано на скрытом коде , вставленный в программу , прежде чем строить , чтобы общаться с отладчиком.»
Питер Мортенсен,
Вот так. Это избавляет пользователей от необходимости добавлять последовательные отпечатки, позволяет обновлять именованные переменные во время работы процессора, показывает графики и цифровые выводы и т. Д. Он отличается от аппаратного отладчика, но быстр и прост и имеет другие преимущества. Все это хорошо документировано на visualmicro.com, поэтому, пожалуйста, прочитайте. Если ваша плата поддерживает GDB или вы используете Atmel Studio, конечно, есть и другие варианты отладки. Все зависит от ваших знаний и оборудования. Если у вас есть настоящий Arduino, в студии Atmel вы можете комбинировать Arduino с Atmel Debug или Sim.
Visual Micro
2

Исходя из роскошных инструментов, таких как ARM или других платформ (AVR, PIC с приличными инструментами), я согласен, что возможности отладки Arduino слишком ограничены. Но это стартовый инструмент с низким входом.

Serial.print () ваш друг. К моему конкретному проекту (колледжу) у меня не было никаких светодиодов, поэтому Serial.print () это так. Если я хочу проверить, правильно ли выполняется код в операторах, я обычно помещаю Serial.print ("A"); , затем перейдя к B, C и т. д. или что-то через раздел, который я отлаживаю. Я сравниваю буквы отладки с тем, что, как я ожидаю, должен делать.

Кроме этого, нет никаких точек останова или пошаговое выполнение кода. Arduino - это не что иное, как плата с микросхемой AVR atmega, загрузчик + среда разработки и множество библиотек программного обеспечения. К сожалению, работа с загрузчиком ограничивает возможности отладки.

Hans
источник
0

Чтобы сделать использование serial.printболее управляемым, вы можете определить глобальную логическую переменную для включения и выключения отладки. Любые строки serial.printбудут заключены в ifоператор, который будет выполняться, только если флаг отладки включен. Таким образом, вы можете оставить строки отладки в коде, даже когда закончите, но обязательно установите флаг отладки на OFF позже.

словоохотливый
источник
0

Лучше, чем напрямую serial.print, используйте макросы. Пример:

#ifdef TRACE1
#define trace1(s) serial.print(s)
#define traceln1(s) serial.println(s)
#else
#define trace1(s)
#define traceln1(s)
#endif

Используйте это так:

function doIt(param1, param2) {
    trace1("->doIt("); trace1("param1: "); trace1(param1); trace1(" param2: "); trace1(param2); traceln1(")");

    ...

    traceln1("<-doIt");
}

У вас могут быть разные уровни трассировки (#ifdef TRACE2 ...)с более подробной информацией.

И вы можете использовать «F» макрос (trace1(F("param1"));). Макрос «F» предотвращает использование в строке крайне ограниченного количества SRAM.

Mangar
источник
0

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

Есть моменты, когда вы можете модульные. Если, например, в C вы можете разработать и протестировать вычислительную функцию, например, которая не касается аппаратного обеспечения на главном компьютере, другом процессоре, оберните функцию тестовым стендом, чтобы подать на нее входные данные и проверить выходные данные и т. Д.

Другим аналогичным способом может быть использование симулятора набора команд, если у вас есть доступ к нему (если нет, это очень познавательный и полезный проект, после того, как вы выполнили несколько из них, вы можете сыграть один раз в выходные или два). Еще лучше, если у кого-то есть клон процессора Verilog или VHDL ( например, OpenCores ), вы можете попробовать GHDL, Verilator или Icarus Verilog . Это может быть достаточно близко, чтобы включить интересующую вас периферию, и вы сможете получить четкое представление о том, что происходит внутри.

Конечно, это не идеальный клон, но может быть достаточно хорошим. Verilator позволяет действительно легко создавать периферийные устройства в C / C ++, чтобы вы могли имитировать все, к чему подключено ваше устройство AVR.

Выход UART и мигающие светодиоды и / или мигающие линии GPIO и использование осциллографа или вольтметра. Ключом к тому, чтобы не сходить с ума, является написание и отладка небольших фрагментов кода. Лучше написать по 10 строк за раз, выполнить 100 тестов, а не 1000 строк, и попытаться отладить их все за один раз. Особенно, когда вы обнаруживаете, что большинство технических описаний и справочников для программистов не всегда правильны. Некоторый взлом всегда требуется.

Старожил
источник