Як я можу перевірити код Arduino?


186

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

У розробці є емулятор Arduino, який може бути корисним, але він, здається, ще не готовий до використання.

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


У цьому питанні є ще одна тема з 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 та ін.
дандавіс

Відповіді:


136

Не запускайте тести на пристрої Arduino або емуляторі

Справа проти тестів на основі мікроконтролерів Device / Emulator / Sim

Існує багато дискусій про те, що означає одиничний тест, і я не дуже намагаюся тут аргументувати. Ця публікація не каже вам уникати будь-яких практичних тестувань на кінцевому цільовому обладнанні. Я намагаюся зробити точку щодо оптимізації циклу зворотного зв’язку щодо вашої розробки, вилучивши цільове обладнання з ваших найбільш звичних та найчастіших тестів. Передбачається, що одиниці тестування значно менші, ніж весь проект.

Метою одиничного тестування є перевірка якості власного коду. Тести одиниць, як правило, ніколи не повинні перевіряти функціональність факторів, які не є вашим контролем.

Подумайте про це так: Навіть якщо ви перевіряли функціональність бібліотеки 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 щоб переглянути ще кілька тестових випадків. Я продовжую свою роботу в інших галузях, крім головних, тому перевіряйте ці гілки і на додаткові тести.

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


1
Це чудова відповідь! Дякую!
Джонатан Аркелл

5
@WarrenMacEvoy Знову ж таки, я думаю, ви прийняли мою пораду і перетворили її на щось таке, чого немає. Ви, звичайно, повинні перевірити свій код у його фактичному оточенні НА ЯКІЙ ОК. Мій аргумент полягає в тому, що ви не повинні робити це щодня, і ви, звичайно, не повинні називати це тестом.
Залізний Спас

1
@toasted_flakes Я не впевнений, де ти взяв цю цитату, але це не те, що я сказав. Тести блоку, що працюють на пристрої, мають багато проблем - дуже повільний цикл зворотного зв’язку, у вас може не бути жодних послідовних портів або будь-якого іншого способу вводу-виводу, щоб резервувати на своєму цільовому пристрої, і вони мають дуже обмежену ємність, яка може вплинути на сферу застосування ваш тестовий набір.
Залізний Спас

1
@ChristianHujer Ви, звичайно, повинні протестувати справжнє обладнання - ніхто не говорить, що ви ніколи не повинні тестувати цільове обладнання. У моєму дописі йдеться про жорстке посилення щоденного циклу зворотного зв’язку розвитку шляхом тестування одиниць на вашій розробці. Витрати на тестування таким чином зведені до мінімуму, оскільки ви будете тестувати цільове обладнання лише тоді, коли це необхідно.
Залізний Спас

1
@Benjohn Arduino ескіз вихідних файлів, які використовували розширення "pde", хоча вони є C ++. arduino.cc/en/Guide/Environment#toc1
Залізний Спас

63

За відсутності будь-яких попередніх тестових рамок для Arduino, я створив ArduinoUnit . Ось простий ескіз Ардуїно, що демонструє його використання:

#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
Здається, тести виконуються лише на ардуїно, тому ви не можете виконати їх автоматично на розроблювальній машині. Основна ідея одиничних тестів - це запускати їх автоматично, тому теперішня конструкція здається більше інструментом налагодження, але немає реальної рамки тестування одиниць.
Якоб

1
Ти маєш рацію. Крім того, щоб мати змогу запускати їх на ПК, потрібен буде також емулятор Arduino або AVR. У бібліотеках Arduino (на даний момент) немає реального апаратного шару абстракції, і емулятори AVR, коли я дивився, все ще розроблялися. Якщо б справи рухалися далі, то в принципі це можна було б зробити.
Метью Мердок

12
@MatthewMurdoch Я боюся, що ти неправий. За визначенням, одиничні тести ніколи не виконуються в цільовому середовищі. Насправді сама ідея блокового тестування полягає в тому, щоб повністю усунути цільове середовище від тестування. Вони завжди працюють у лабораторному середовищі, яке знущається над усією діяльністю, що знаходиться поза тестуваною одиницею, щоб гарантувати, що успіх чи неуспіх тесту відображаються ТІЛЬКИ на тестовому апараті. Це одна з найбільших причин, коли люди використовують концепцію інверсії управління у складних проектах.
Залізний Спас

2
@ marcv81 Області, де існують такі проблеми переносимості, дуже ймовірно, є поганими предметами для тестування одиниць. Пам’ятайте, що одиничні тести повинні перевірити лише ВАШ код, тому відповідно обмежте їх обсяг. Зважаючи на велику невідповідність обладнання, про яке ми говоримо тут, я можу визнати, що деякі такі обставини можуть бути неминучими. У цих випадках інженер повинен залишатися пізнавальним і вживати пом'якшуючих заходів. Це може означати зміну вашого дизайну, щоб покращити перевірку чи навіть щось таке просто, як лише документування відповідних фактів.
Залізний Спас

2
@Iron Savior блок перевірки перевіряє ваш код, але ваш код десь працює. Якщо цей контекст є або імітує контекст 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 ...
Matthew Murdoch,

Дякуємо за оновлення. Ви виконуєте одиничні тести на ПКС або на ПК?
Меттью Мердок

Одиничні тести виконуються на Mac за допомогою Xcode. Для запуску їх на Pic, мабуть, знадобиться якийсь емулятор. Абстрагуючи його так, щоб він працював на Mac, перетворення процесорів набагато легше
Девід Сайкс

У середовищі Arduino використовується компілятор avr-gcc, який має деякі ідіосинкразії, що означає, що компіляція з gcc (або іншим компілятором C ++) та запуск на ПК може не означати, що код також буде компілюватися на avr-gcc.
Меттью Мердок

Про яку різницю ви говорите? Це речі, з якими не можна впоратися з деякими директивами препроцесора?
Джозеф Лізе


12

simavr - симулятор AVR, що використовує avr-gcc.

Він вже підтримує декілька мікроконтролерів ATTiny та ATMega, і - за словами автора - легко додати ще декілька.

У прикладах лежить simduino, емулятор Arduino. Він підтримує запуск завантажувача Arduino і може програмуватися з avrdude через Socat (модифікований Netcat ).


9

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

Приклад:

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 через файл конфігурації. Щоб дізнатись, де розміщуються ваші шестигранні зображення за допомогою Ardeino IDE, натисніть клавішу shift, перш ніж натиснути кнопку збірки (відтворення). Натискайте клавішу Shift, натискаючи на завантаження, щоб дізнатися, де знаходиться ваша avrdude (утиліта завантаження командного рядка) у вашій системі / версії Arduino. Крім того, ви можете переглянути включені файли конфігурації та скористатись своїм місцем встановлення (зараз на Arduino 0020).

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


+1 Чудові речі! Чи є у вас інформація про те, як ви перевіряли пристрій після завантаження зображень?
Меттью Мердок

Ми використовували носові тести, щоб проводити тести наших одиниць на стороні пітона. Установка для кожного тесту завантажує правильне шістнадцяткове зображення для цього тесту. Ми починаємо з малого, а потім працюємо на більш всебічне тестування. Переконайтеся, що послідовний зв’язок працює, переконайтеся, що послідовна інтеграція до інтерфейсу працює, перевірте інтеграцію послідовних даних у DB та ін. Pde та py analog_read_speed показують основи цього (див. Посилання 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.
  • Сценарій починає наступний тест, повторюючи вищезазначені кроки для всіх тестів, які запитуються у файлі конфігурації.
  • Сценарій друкує резюме, в якому відображається огляд усіх провалених / пройдених тестів у повному тестовому наборі.

5

Тримайте окремий апаратний код окремо або відсторонено від решти, щоб ви могли перевірити та налагодити цей «відпочинок» на будь-якій платформі, для якої у вас є хороші інструменти та з якою ви найбільше знайомі.

В основному, спробуйте створити якомога більше кінцевого коду з якомога більшої кількості відомих будівельних блоків. Залишитися, що стосується обладнання, буде набагато простіше і швидше. Ви можете закінчити його, використовуючи наявні емулятори та / або емулюючі пристрої самостійно. І тоді, звичайно, вам потрібно буде якось перевірити справжню річ. Залежно від обставин, це може бути чи не дуже добре автоматизованим (тобто, хто чи що буде натискати кнопки та надавати інші входи? Хто чи що буде спостерігати та інтерпретувати різні індикатори та результати?).



5

Я використовую Searduino під час написання коду Arduino. Searduino - це симулятор Arduino та середовище розробки (Makefiles, C код ...), що дозволяє легко зламати C / C ++ за допомогою улюбленого редактора. Ви можете імпортувати ескізи Arduino та запускати їх у тренажері.

Знімок екрана Searduino 0.8: http://searduino.files.wordpress.com/2014/01/jearduino-0-8.png

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

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

BTW: Я один з людей, які розробляють Searduino.


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 для отримання додаткової інформації про тестування одиниць штифтів вводу / виводу, годинника, послідовних портів тощо.

Ці одиничні тести компілюються та виконуються за допомогою скрипту, що міститься в рубіновій дорогоцінній камені. Приклади того, як це налаштувати, див. У README.md або просто скопіюйте з одного з таких прикладів:


Це виглядає цікаво, але я не впевнений, що він правильно перевіряє код Arduino. З опублікованого нами результату він збирається в архітектуру x86_64, яка, очевидно, не використовується для Arduino. Це може ввести помилки, викликані конфліктами між реалізацією типів.
Серін

Цей вид помилок, безумовно, можливий. Чи є у вас приклад, який я міг би використати для тестового випадку?
Ян

3

Існує проект під назвою ncore , який забезпечує рідне ядро ​​для Arduino. І дозволяє писати тести на код Arduino.

З опису проекту

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

Також в розділі "що мені потрібно використовувати"

Якщо ви хочете скласти тести, вам знадобиться cxxtest від http://cxxtest.tigris.org . NCORE був протестований на cxxtest 3.10.1.


Це цікавий проект. На жаль, схоже на те, що він тепер мертвий, оскільки прогресу протягом 6 років не було.
Серін

2

Якщо ви хочете перевірити код тесту за межами MCU (на робочому столі), перевірте прапорець: https://libcheck.github.io/check/

Я використовував його для тестування власного вбудованого коду кілька разів. Це досить міцні рамки.


Єдиним недоліком є ​​те, що це не підтримує g ++, що робить його марним для тестування більшості бібліотек Arduino, які використовують функції C ++.
Серін

1

Ви можете використовувати emulare - ви можете перетягнути мікроконтролер на діаграму та запустити свій код у Eclipse. Документація на веб-сайті розповідає, як її налаштувати.


1

Використовуйте Proteus VSM з бібліотекою Arduino для налагодження коду або для його тестування.

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


1

Спробуйте симулятор ланцюга Autodesk . Це дозволяє перевірити код Arduino та схеми з багатьма іншими апаратними компонентами.


0

В основному Arduino написано на C і C ++, навіть бібліотеки ардуїно записані на C і C ++. Отже, простіше кажучи, просто обробіть код як C і C ++ і спробуйте зробити тестування одиниць. Тут під словом "обробляти" я маю на увазі, що ви зміните всі основні синтаксиси, такі як serial.println на sysout, pinmode на varaibles, void loop на 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, інакше сценарій не вдасться.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.