Как я могу тестировать код Arduino?

187

Я хотел бы иметь возможность модульного тестирования моего кода Arduino. В идеале я мог бы запускать любые тесты, не загружая код в Arduino. Какие инструменты или библиотеки могут помочь мне с этим?

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

AVR Studio от Atmel содержит симулятор микросхемы, который может быть полезен, но я не понимаю, как бы я использовал его в сочетании с IDE Arduino.

Мэтью Мердок
источник
В 2011 году по этому вопросу есть еще одна ветка: arduino.cc/forum/index.php?action=printpage;topic=54356.0
Якоб
Спасибо @Jakob. Симулятор Arduino, на который ссылаются в этой теме (с другими потенциально полезными ссылками внизу страницы): arduino.com.au/Simulator-for-Arduino.html
Мэтью Мердок
5
К сожалению, это только для Windows, я хотел бы найти способ просто скомпилировать и запустить код Arduino из командной строки без каких-либо закрытых исходных или аппаратных зависимостей.
Якоб
3
Небольшое обновление, 5 лет спустя: Симавр по-прежнему очень активен и значительно улучшился с тех пор, как был задан вопрос, поэтому я подумал, что его стоит поднять ближе к вершине. И это может быть правильным инструментом для регрессионного тестирования, тестирования на основе сценариев, а также для модульного тестирования. Таким образом, код, который вы тестируете, совпадает с кодом на целевом оборудовании.
ЗМО
Для важных проектов, рассмотрите аппаратного тестера; другой MCU, который может рассчитывать время и тестировать реакции кнопок / переключателей, время загрузки, температуру, использование v / ma, странные перестановки опций и т. д. Да, это более аппаратное средство для сборки, но оно может добавить уровень безопасности при внесении изменений. многие профессиональные устройства используют jtag et al.
Дандавис

Ответы:

137

Не запускайте юнит-тесты на устройстве Arduino или эмуляторе

Дело против микроконтроллера устройства / эмулятора / сим-тестов

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

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

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

Частое тестирование на целевом оборудовании имеет чрезвычайно медленный цикл:

  1. Настройте свой код
  2. Скомпилируйте и загрузите на устройство Arduino
  3. Наблюдайте за поведением и угадывайте, выполняет ли ваш код то, что вы ожидаете
  4. Повторение

Шаг 3 особенно неприятен, если вы ожидаете получать диагностические сообщения через последовательный порт, но сам ваш проект должен использовать единственный аппаратный последовательный порт вашего Arduino. Если вы думали, что библиотека SoftwareSerial может помочь, вы должны знать, что это может нарушить любую функциональность, которая требует точной синхронизации, например, генерация других сигналов одновременно. Эта проблема произошла со мной.

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

Если это глупо тест на устройстве или эмуляторе, что нужно делать?

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

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

Если ваши тесты дают результат, противоречащий вашим ожиданиям, то, скорее всего, у вас есть недостаток в тестируемом коде. Если результаты теста соответствуют вашим ожиданиям, но программа не работает должным образом, когда вы загружаете его в Arduino, тогда вы знаете, что ваши тесты основывались на неверных допущениях, и вы, вероятно, имеете ошибочный тест. В любом случае вам будет дано реальное представление о том, какими должны быть ваши следующие изменения кода. Качество ваших отзывов улучшено с « что-то сломано» до «этот конкретный код сломан» .

Как создавать и запускать тесты на вашем ПК

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

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

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

Осталось только написать настоящие тесты, а затем скомпилировать их, используя ваш любимый компилятор C ++! Это, вероятно, лучше всего иллюстрируется на примере реального мира.

Фактический рабочий пример

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

Источник mock_arduino.cpp, который содержит код, который дублирует некоторые функции поддержки, предоставляемые библиотекой Arduino:

#include <sys/timeb.h>
#include "mock_arduino.h"

timeb t_start;
unsigned long millis() {
  timeb t_now;
  ftime(&t_now);
  return (t_now.time  - t_start.time) * 1000 + (t_now.millitm - t_start.millitm);
}

void delay( unsigned long ms ) {
  unsigned long start = millis();
  while(millis() - start < ms){}
}

void initialize_mock_arduino() {
  ftime(&t_start);
}

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

fake_serial.h

#include <iostream>

class FakeSerial {
public:
  void begin(unsigned long);
  void end();
  size_t write(const unsigned char*, size_t);
};

extern FakeSerial Serial;

fake_serial.cpp

#include <cstring>
#include <iostream>
#include <iomanip>

#include "fake_serial.h"

void FakeSerial::begin(unsigned long speed) {
  return;
}

void FakeSerial::end() {
  return;
}

size_t FakeSerial::write( const unsigned char buf[], size_t size ) {
  using namespace std;
  ios_base::fmtflags oldFlags = cout.flags();
  streamsize oldPrec = cout.precision();
  char oldFill = cout.fill();

  cout << "Serial::write: ";
  cout << internal << setfill('0');

  for( unsigned int i = 0; i < size; i++ ){
    cout << setw(2) << hex << (unsigned int)buf[i] << " ";
  }
  cout << endl;

  cout.flags(oldFlags);
  cout.precision(oldPrec);
  cout.fill(oldFill);

  return size;
}

FakeSerial Serial;

и, наконец, актуальная тестовая программа:

#include "mock_arduino.h"

using namespace std;

void millis_test() {
  unsigned long start = millis();
  cout << "millis() test start: " << start << endl;
  while( millis() - start < 10000 ) {
    cout << millis() << endl;
    sleep(1);
  }
  unsigned long end = millis();
  cout << "End of test - duration: " << end - start << "ms" << endl;
}

void delay_test() {
  unsigned long start = millis();
  cout << "delay() test start: " << start << endl;
  while( millis() - start < 10000 ) {
    cout << millis() << endl;
    delay(250);
  }
  unsigned long end = millis();
  cout << "End of test - duration: " << end - start << "ms" << endl;
}

void run_tests() {
  millis_test();
  delay_test();
}

int main(int argc, char **argv){
  initialize_mock_arduino();
  run_tests();
}

Этот пост достаточно длинный, поэтому, пожалуйста, обратитесь к моему проекту на GitHub, чтобы увидеть еще несколько тестов в действии. Я продолжаю свои работы в других ветках, кроме master, так что проверяйте эти ветки и на дополнительные тесты.

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

Железный Спаситель
источник
1
Это отличный ответ! Спасибо!
Джонатан Аркелл
5
@WarrenMacEvoy Опять же, я думаю, что вы приняли мой совет и превратили его во что-то, что это не так. Вы должны обязательно проверить свой код в его реальной среде в некоторой точке. Мой аргумент состоит в том, что вы не должны делать это каждый день, и вы, конечно, не должны называть это модульным тестом.
Железный Спас
1
@toasted_flakes Я не уверен, откуда вы взяли эту цитату, но я не сказал этого. Модульные тесты, запущенные на устройстве, имеют много проблем - очень медленный цикл обратной связи, у вас может не быть последовательных портов или каких-либо других средств ввода-вывода, чтобы сэкономить на вашем целевом устройстве, и они имеют очень ограниченную емкость, которая может влиять на объем ваш набор тестов.
Железный Спас
1
@ChristianHujer Конечно, вы должны тестировать на реальном оборудовании - никто не говорит, что вы никогда не должны тестировать на целевом оборудовании. Мой пост об ужесточении вашего ежедневного цикла обратной связи по разработке с помощью модульного тестирования на вашей машине для разработки. Таким образом, ваши затраты на тестирование сводятся к минимуму, потому что вы будете тестировать на целевом оборудовании только тогда, когда это необходимо.
Железный Спас
1
@Benjohn Arduino Исходные файлы эскиза имели расширение «pde», хотя они и являются C ++. arduino.cc/en/Guide/Environment#toc1
Железный Спас
63

В отсутствие каких-либо ранее существовавших модульных тестовых сред для Arduino я создал ArduinoUnit . Вот простой эскиз Arduino, демонстрирующий его использование:

#include <ArduinoUnit.h>

// Create test suite
TestSuite suite;

void setup() {
    Serial.begin(9600);    
}

// Create a test called 'addition' in the test suite
test(addition) {
    assertEquals(3, 1 + 2);
}

void loop() {
    // Run test suite, printing results to the serial port
    suite.run();
}
Мэтью Мердок
источник
18
Похоже, что тесты выполняются только на arduino, поэтому вы не можете выполнять их автоматически на своем компьютере разработчика. Основная идея модульных тестов состоит в том, чтобы запускать их автоматически, поэтому текущая структура кажется скорее средством отладки, но не реальной структурой модульного тестирования.
Якоб
1
Ты прав. Чтобы иметь возможность запускать их на ПК, кроме того, потребуется эмулятор Arduino или AVR. В библиотеках Arduino (на данный момент) и эмуляторах AVR, когда я смотрел, все еще находились в стадии разработки, нет реального уровня аппаратной абстракции. Если сейчас дела пошли дальше, то в принципе это можно сделать.
Мэтью Мердок
12
@MatthewMurdoch Боюсь, что вы не правы. По определению, модульные тесты никогда не запускаются в целевой среде. Фактически, сама идея модульного тестирования состоит в том, чтобы полностью исключить целевую среду из тестирования. Они всегда выполняются в лабораторной среде, которая имитирует всю активность, внешнюю по отношению к тестируемому блоку, чтобы гарантировать, что успех или неудача теста отражаются ТОЛЬКО на тестируемом блоке. Это одна из главных причин, по которой люди используют концепцию инверсии управления в сложных проектах.
Железный Спас
2
@ marcv81 Области, где существуют такие проблемы с переносимостью, весьма вероятно, будут плохими объектами для модульного тестирования. Помните, что модульные тесты должны проверять только ВАШ код, поэтому ограничьте их область соответственно. Учитывая огромное неравенство в оборудовании, о котором мы здесь говорим, я могу согласиться с тем, что некоторые такие обстоятельства могут быть неизбежными. В этих случаях инженер должен быть осведомленным и предпринимать смягчающие меры. Это может означать изменение вашего дизайна для улучшения тестируемости или даже что-то простое, как просто документирование соответствующих фактов.
Железный Спас
2
@Iron Спасите юнит-тестирование вашего кода, но ваш код где-то работает. Если этот контекст является или имитирует контекст Arduino; тогда ArdunoUnit поможет вам написать модульные тесты. Если вы посмотрите на проект ArduinoUnit, мета-тестирование платформы автоматически загружает, запускает и проверяет результаты теста на кроссплатформенной цели. Так же, как и на других кроссплатформенных целях. Ваша точка зрения является оправданием для того, чтобы не тестировать код во встроенной среде, где корректность имеет значение так же, если не часто, больше, чем другие контексты.
Уоррен МакЭвой
21

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

Например, я абстрагирую PORTA с помощью

#define SetPortA(v) {PORTA = v;}

Тогда SetPortA можно легко смоделировать, не добавляя служебный код в версию PIC.

Как только аппаратная абстракция была протестирована, я вскоре обнаружил, что, как правило, код переходит с испытательного стенда на PIC и работает впервые.

Обновить:

Я использую шов #include для кода модуля, # включая код модуля в файле C ++ для тестовой установки и файл C для целевого кода.

В качестве примера я хочу мультиплексировать четыре 7-сегментных дисплея, один порт управляет сегментами, а второй выбирает дисплей. Код дисплея взаимодействует с дисплеями через SetSegmentData(char)иSetDisplay(char) . Я могу смоделировать их на своем тестовом стенде C ++ и проверить, получаю ли я ожидаемые данные. Для цели, которую я использую, #defineчтобы получить прямое назначение без издержек на вызов функции

#define SetSegmentData(x) {PORTA = x;}
Дэвид Сайкс
источник
Я в принципе вижу, как я могу использовать препроцессор «шов» для модульного тестирования. Однако я не уверен, как мне это сделать, не имея эмулятора для запуска тестов или совместимого с avr-gcc компилятора, который выводит (в моем случае) двоичные файлы Windows ...
Мэтью Мердок,
Спасибо за обновление. Вы выполняете модульные тесты на PIC или на вашем ПК?
Мэтью Мердок
Модульные тесты запускаются на Mac с использованием Xcode. Для запуска их на Pic, вероятно, потребуется какой-то эмулятор. Абстрагирование, чтобы оно работало на Mac, значительно упрощает переключение процессоров
Дэвид Сайкс,
В среде Arduino используется компилятор avr-gcc, который имеет некоторые особенности, которые означают, что компиляция с помощью gcc (или другого компилятора C ++) и работа на ПК могут не означать, что код также будет компилироваться на avr-gcc.
Мэтью Мердок
О какой разнице вы говорите? Это те вещи, которые не могут быть обработаны с помощью некоторых директив препроцессора?
Джозеф Лизи
12

Симавр это симулятор AVR с использованием avr-gcc.

Он уже поддерживает несколько микроконтроллеров ATTiny и ATMega, и, по словам автора, легко добавить еще несколько.

В примерах лежит simduino, эмулятор Arduino. Он поддерживает запуск загрузчика Arduino и может быть запрограммирован с помощью avrdude через Socat (модифицированный Netcat ).

рехнувшийся
источник
9

Вы можете выполнить юнит-тестирование на Python с моим проектом PySimAVR . Arscons используется для построения и simavr для моделирования.

Пример:

from pysimavr.sim import ArduinoSim    
def test_atmega88():
    mcu = 'atmega88'
    snippet = 'Serial.print("hello");'

    output = ArduinoSim(snippet=snippet, mcu=mcu, timespan=0.01).get_serial()
    assert output == 'hello'

Начать тестирование:

$ nosetests pysimavr/examples/test_example.py
pysimavr.examples.test_example.test_atmega88 ... ok
понты
источник
6

Я не знаю ни одной платформы, которая может тестировать код Arduino.

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

Стоит проверить.

Ювал Адам
источник
6

Мы используем платы Arduino для сбора данных в большом научном эксперименте. Впоследствии мы должны поддерживать несколько плат Arduino с различными реализациями. Я написал утилиты Python для динамической загрузки шестнадцатеричных изображений Arduino во время модульного тестирования. Код, найденный по ссылке ниже, поддерживает Windows и Mac OS X через файл конфигурации. Чтобы узнать, где ваши шестнадцатеричные изображения размещены в Arduino IDE, нажмите клавишу Shift, прежде чем нажать кнопку «Сборка (воспроизведение)». Нажмите клавишу Shift во время загрузки, чтобы узнать, где находится ваша avrdude (утилита загрузки из командной строки) в вашей системе / версии Arduino. Кроме того, вы можете посмотреть включенные файлы конфигурации и использовать место установки (в настоящее время на Arduino 0020).

http://github.com/toddstavish/Python-Arduino-Unit-Testing

toddstavish
источник
+1 Отличный материал! Есть ли у вас какая-либо информация о том, как вы проводили тестирование модулей после загрузки изображений?
Мэтью Мердок
Мы использовали тесты носа для запуска наших юнит-тестов на стороне питона. Настройка для каждого теста загружает правильное шестнадцатеричное изображение для этого теста. Мы начинаем с малого, а затем приступаем к более всестороннему тестированию. Убедитесь, что последовательная связь работает, убедитесь, что последовательная интеграция с пользовательским интерфейсом работает, проверьте последовательную интеграцию с БД и т. Д. Analog_read_speed pde и py показывают основы этого (см. Ссылку на github выше). Со временем мы откроем исходный код всего проекта, поэтому, пожалуйста, следите за обновлениями. :)
toddstavish
6

Эта программа позволяет автоматически запускать несколько юнит-тестов Arduino. Процесс тестирования запускается на ПК, но тесты выполняются на реальном оборудовании Arduino. Один набор модульных тестов обычно используется для тестирования одной библиотеки Arduino. (этот

Форум Arduino: http://arduino.cc/forum/index.php?topic=140027.0

Страница проекта GitHub: http://jeroendoggen.github.com/Arduino-TestSuite

Страница в индексе пакетов Python: http://pypi.python.org/pypi/arduino_testsuite

Модульные тесты написаны с помощью "библиотеки модульных тестов Arduino": http://code.google.com/p/arduinounit

Следующие шаги выполняются для каждого набора модульных тестов:

  • Прочтите файл конфигурации, чтобы узнать, какие тесты нужно запустить
  • Сценарий компилирует и загружает эскиз Arduino, содержащий код модульного тестирования.
  • Модульные тесты выполняются на плате Arduino.
  • Результаты теста распечатываются через последовательный порт и анализируются скриптом Python.
  • Сценарий запускает следующий тест, повторяя вышеуказанные шаги для всех тестов, которые запрашиваются в файле конфигурации.
  • Сценарий выводит сводную информацию о всех неудачных / пройденных тестах в полном комплекте тестов.
jeroendoggen
источник
5

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

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

Алексей Фрунзе
источник
5

Я использую Searduino при написании кода Arduino. Searduino - это симулятор Arduino и среда разработки (Makefiles, C code ...), которые позволяют легко взламывать C / C ++ с помощью вашего любимого редактора. Вы можете импортировать эскизы Arduino и запускать их в симуляторе.

Снимок экрана Searduino 0.8: http://searduino.files.wordpress.com/2014/01/jearduino-0-8.png

Searduino 0.9 будет выпущен, и видео будет записано, как только будут проведены последние тесты .... через день или два.

Тестирование на симуляторе не следует рассматривать как реальные тесты, но оно, безусловно, очень помогло мне в поиске глупых / логических ошибок (забыв сделать pinMode(xx, OUTPUT) и т.д.).

Кстати, я один из тех, кто разрабатывает Searduino.

user3183814
источник
5

Я построил arduino_ciдля этого. Хотя он ограничивается тестированием библиотек Arduino (а не отдельных набросков), он позволяет запускать модульные тесты либо локально, либо в системе CI (например, Travis CI или Appveyor).

Рассмотрим очень простую библиотеку в директории Arduino библиотеки, называется DoSomething, с do-something.cpp:

#include <Arduino.h>
#include "do-something.h"

int doSomething(void) {
  return 4;
};

Вы бы протестировали его следующим образом (с вызванным тестовым файлом test/is_four.cppили чем-то подобным):

#include <ArduinoUnitTests.h>
#include "../do-something.h"

unittest(library_does_something)
{
  assertEqual(4, doSomething());
}

unittest_main()  // this is a macro for main().  just go with it.

Вот и все. Если этот assertEqualсинтаксис и структура теста выглядят знакомыми, то это потому, что я принял библиотеку Мэтью Мердока ArduinoUnit, на которую он ссылался в своем ответе .

См. Reference.md для получения дополнительной информации о модульном тестировании выводов ввода / вывода, синхронизации, последовательных портов и т. Д.

Эти модульные тесты компилируются и запускаются с использованием скрипта, содержащегося в геме ruby. Для примеров того, как установить это, посмотрите README.md или просто скопируйте из одного из этих примеров:

Ян
источник
Это выглядит интересно, но я не уверен, что он правильно тестирует код Arduino. Исходя из опубликованного вами материала, он компилируется в архитектуру x86_64, которая явно не используется для Arduino. Это может привести к ошибкам, вызванным конфликтами между реализациями типов.
Церин
Такая ошибка, безусловно, возможна. У вас есть пример, который я мог бы использовать для теста?
Ян
3

Есть проект под названием ncore , который предоставляет родное ядро ​​для Arduino. И позволяет писать тесты для кода Arduino.

Из описания проекта

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

Также в разделе «что мне нужно использовать»

Если вы хотите построить тесты, вам понадобится cxxtest с http://cxxtest.tigris.org . NCORE был протестирован с cxxtest 3.10.1.

Сударь
источник
Это интересный проект. К сожалению, похоже, что сейчас он мертв, так как он не прогрессировал в течение 6 лет.
Cerin
2

Если вы хотите выполнить модульное тестирование кода вне MCU (на рабочем столе), проверьте libcheck: https://libcheck.github.io/check/

Я использовал его для тестирования своего встроенного кода несколько раз. Это довольно надежная структура.

ezaquarii
источник
Единственным недостатком является то, что он не поддерживает g ++, что делает его бесполезным для тестирования большинства библиотек Arduino, использующих функции C ++.
Cerin
1

Вы можете использовать emulare - вы можете перетащить микроконтроллер на диаграмму и запустить свой код в Eclipse. В документации на сайте рассказывается, как ее настроить.

Имре
источник
1

Используйте Proteus VSM с библиотекой Arduino для отладки вашего кода или его тестирования.

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

Sathish
источник
1

Попробуйте Autodesk Circuit Simulator . Это позволяет тестировать код Arduino и схемы со многими другими аппаратными компонентами.

Сидхант Гоял
источник
0

В основном Arduino написан на C и C ++, даже библиотеки Arduino написаны на C и C ++. Итак, в простых терминах просто обработайте код как C и C ++ и попробуйте выполнить модульное тестирование. Здесь под словом «дескриптор» я подразумеваю, чтобы вы изменили весь основной синтаксис, такой как serial.println, на sysout, pinmode на varaibles, void loop to while (), который прерывается либо в keystock, либо после некоторой итерации.

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

-Nandha_Frost

Нанда Фрост
источник
0

Если вы заинтересованы в запуске эскиза INO и проверке последовательного вывода, у меня есть рабочая реализация этого в моей контрольной сумме Arduino NMEA проекте .

Следующий скрипт берет файл и использует Arduino CLI для компиляции его в HEX-файл, который затем загружается в SimAVR, который оценивает его и печатает последовательный вывод. Так как все программы Arduino работают вечно, не имея возможности убить себя ( exit(0)не работает), я позволил скетчу запустить несколько секунд, а затем показал полученный результат с ожидаемым результатом.

Загрузите и извлеките Arduino CLI (в данном случае версия 0.5.0 - последняя на момент написания):

curl -L https://github.com/arduino/arduino-cli/releases/download/0.5.0/arduino-cli_0.5.0_Linux_64bit.tar.gz -o arduino-cli.tar.gz
tar -xvzf arduino-cli.tar.gz

Теперь вы можете обновить индекс и установить соответствующее ядро:

./arduino-cli core update-index
./arduino-cli core install arduino:avr

Предполагая, что ваш эскиз назван nmea-checksum.ino, чтобы получить ELF и HEX, запустите:

./arduino-cli compile -b arduino:avr:uno nmea-checksum.ino

Далее, SimAVR для запуска HEX (или ELF) - я собираю из исходного кода, потому что последний выпуск не работал для меня:

sudo apt-get update
sudo apt-get install -y build-essential libelf-dev avr-libc gcc-avr freeglut3-dev libncurses5-dev pkg-config
git clone https://github.com/buserror/simavr.git
cd simavr
make

Успешная компиляция даст вам, simavr/run_avrчто вы можете использовать для запуска эскиза. Как я уже сказал, timeoutэто никогда не закончится

cd simavr
timeout 10 ./run_avr -m atmega168 -f 16000000 ../../nmea-checksum.ino.arduino.avr.uno.elf &> nmea-checksum.ino.clog || true

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

cat nmea-checksum.ino.clog | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" > nmea-checksum.ino.log
cat nmea-checksum.ino.log

Теперь все, что вам нужно сделать, это сравнить этот файл с известным хорошим файлом:

diff nmea-checksum.ino.log ../../nmea-checksum.ino.test

Если различий нет, diffвыйдет с кодом 0, иначе скрипт не выполнится.

Томаш Хюбельбауэр
источник