wake-up-neo.com

Wie kann ich Arduino-Code testen?

Ich möchte in der Lage sein, meinen Arduino-Code zu testen. Im Idealfall könnte ich alle Tests ausführen, ohne den Code in den Arduino hochladen zu müssen. Welche Tools oder Bibliotheken können mir dabei helfen?

Es ist ein Arduino-Emulator in Entwicklung , der nützlich sein könnte, aber er scheint noch nicht einsatzbereit zu sein.

AVR Studio von Atmel enthält einen Chipsimulator, der nützlich sein könnte, aber ich kann nicht erkennen, wie ich ihn in Verbindung mit der Arduino IDE verwenden würde.

153
Matthew Murdoch

In Ermangelung von bereits vorhandenen Unit-Test-Frameworks für Arduino habe ich ArduinoUnit erstellt. Hier ist eine einfache Arduino-Skizze, die ihre Verwendung demonstriert:

#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();
}
60
Matthew Murdoch

Ich habe beträchtlichen Erfolg, wenn ich meinen PIC-Code teste, indem ich den Hardwarezugriff herausriss und ihn in meinen Tests verspottete.

Zum Beispiel abstrahiere ich PORTA mit

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

Dann kann SetPortA leicht verspottet werden, ohne dass in der PIC-Version Zusatzcode hinzugefügt wird.

Sobald die Hardware-Abstraktion eine Weile getestet wurde, finde ich bald heraus, dass Code im Allgemeinen vom Prüfstand zum PIC geht und zum ersten Mal funktioniert.

Update:

Ich verwende eine # include-Naht für den Unit-Code, # den Unit-Code in einer C++ - Datei für das Testgerät und eine C-Datei für den Zielcode.

Als Beispiel möchte ich vier 7-Segment-Anzeigen multiplexen, wobei ein Port die Segmente steuert und ein zweiter die Anzeige auswählt. Der Anzeigecode ist mit den Anzeigen über SetSegmentData(char) und SetDisplay(char) verbunden. Ich kann diese in meinem C++ - Teststand nachahmen und überprüfen, ob ich die erwarteten Daten erhalte. Für das Ziel verwende ich #define, so dass ich eine direkte Zuweisung ohne den Aufwand eines Funktionsaufrufs bekomme

#define SetSegmentData(x) {PORTA = x;}
21
David Sykes

Es scheint, dass emulino die Arbeit perfekt machen würde.

Emulino ist ein Emulator für die Arduino-Plattform von Greg Hewgill. ( Quelle )

GitHub-Repository

15
Gonzo

simavr ist ein AVR simulator, der avr-gcc verwendet.

Es unterstützt bereits einige ATTiny- und ATMega-Mikrocontroller, und laut Autor ist es leicht, weitere hinzuzufügen.

In den Beispielen liegt Simduino, ein Arduino-Emulator. Es unterstützt den Betrieb des Arduino-Bootloaders und kann mit avrdude über Socat (ein modifiziertes Netcat ) programmiert werden.

11
Gonzo

Sie können den Komponententest in Python mit meinem Projekt PySimAVR durchführen. Arscons wird für das Gebäude und simavr für die Simulation verwendet.

Beispiel:

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'

Test starten:

$ nosetests pysimavr/examples/test_example.py
pysimavr.examples.test_example.test_atmega88 ... ok
8
ponty

Dieses Programm ermöglicht die automatisierte Ausführung mehrerer Arduino-Komponententests. Der Testvorgang wird auf dem PC gestartet, die Tests laufen jedoch auf der Arduino-Hardware. Ein Satz von Komponententests wird normalerweise verwendet, um eine Arduino-Bibliothek zu testen 

Arduino Forum: http://arduino.cc/forum/index.php?topic=140027.0

GitHub-Projektseite: http://jeroendoggen.github.com/Arduino-TestSuite

Seite im Python Package Index: http://pypi.python.org/pypi/arduino_testsuite

Die Komponententests werden mit der "Arduino Unit Testing Library" geschrieben: http://code.google.com/p/arduinounit

Die folgenden Schritte werden für jeden Satz von Komponententests ausgeführt:

  • Lesen Sie die Konfigurationsdatei, um herauszufinden, welche Tests ausgeführt werden sollen
  • Das Skript kompiliert und lädt eine Arduino-Skizze, die den Unit-Testcode enthält.
  • Die Komponententests werden auf dem Arduino-Board ausgeführt.
  • Die Testergebnisse werden über die serielle Schnittstelle gedruckt und vom Python-Skript analysiert.
  • Das Skript startet den nächsten Test und wiederholt die obigen Schritte für alle in der Konfigurationsdatei angeforderten Tests.
  • Das Skript gibt eine Zusammenfassung aus, die eine Übersicht aller fehlgeschlagenen/bestandenen Tests in der gesamten Testsuite enthält.
6
jeroendoggen

Mir ist keine Plattform bekannt, auf der Arduino-Code getestet werden kann.

Es gibt jedoch die Plattform Fritzing , mit der Sie die Hardware modellieren und später PCB - Diagramme und dergleichen exportieren können.

Es lohnt sich zu überprüfen.

6
Yuval Adam

Wir verwenden Arduino-Boards zur Datenerfassung in einem großen wissenschaftlichen Experiment. Anschließend müssen wir mehrere Arduino-Boards mit unterschiedlichen Implementierungen unterstützen. Ich habe Python-Dienstprogramme geschrieben, um Arduino-Hex-Images während des Komponententests dynamisch zu laden. Der Code unter dem folgenden Link unterstützt Windows und Mac OS X über eine Konfigurationsdatei. Um herauszufinden, wo Ihre Hex-Bilder von der Arduino IDE platziert werden, drücken Sie die Umschalttaste, bevor Sie auf die Build-Taste (Wiedergabe) klicken. Drücken Sie beim Hochladen die Umschalttaste, um herauszufinden, wo sich Ihre avrdude (Befehlszeilen-Upload-Utility) auf Ihrem System/Ihrer Version von Arduino befindet. Alternativ können Sie die enthaltenen Konfigurationsdateien anzeigen und Ihren Installationsort verwenden (derzeit auf Arduino 0020).

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

6
toddstavish

Halten Sie hardwarespezifischen Code getrennt oder abstrahieren, sodass Sie den größeren Rest auf jeder Plattform testen und debuggen können, für die Sie über gute Tools verfügen, mit denen Sie am besten vertraut sind.

Versuchen Sie grundsätzlich, so viel Code wie möglich aus möglichst vielen bekannten Bausteinen zu erstellen. Die verbleibende hardwarespezifische Arbeit wird dann wesentlich einfacher und schneller. Sie können den Vorgang beenden, indem Sie vorhandene Emulatoren und/oder Emulationsgeräte selbst verwenden. Und dann müssen Sie das Reale natürlich irgendwie testen. Abhängig von den Umständen kann dies möglicherweise sehr gut automatisierbar sein (d. H. Wer oder was drückt Tasten und stellt andere Eingaben bereit? Wer oder was wird verschiedene Indikatoren und Ausgaben beobachten und interpretieren?).

5
Alexey Frunze

Ich verwende Searduino , wenn ich Arduino-Code schreibe. Searduino ist ein Arduino-Simulator und eine Entwicklungsumgebung (Makefiles, C-Code ...), die das Hacken in C/C++ mit Ihrem bevorzugten Editor erleichtert. Sie können Arduino-Skizzen importieren und im Simulator ausführen.

Screenshot von Searduino 0.8: http://searduino.files.wordpress.com/2014/01/jearduino-0-8.png

Searduino 0.9 wird veröffentlicht und ein Video wird aufgenommen, sobald die letzten Tests abgeschlossen sind ... in ein oder zwei Tagen.

Testen auf dem Simulator ist nicht als echte Tests zu verstehen, aber es hat mir sicherlich sehr geholfen, dumme/logische Fehler zu finden (das Vergessen von pinMode(xx, OUTPUT) usw.).

BTW: Ich bin einer der Leute, die Searduino entwickeln.

5
user3183814

James W. Grenning schreibt großartige Bücher, und es geht um Unit-Tests. Eingebetteter C-Code Test Driven Development for Embedded C.

4
Rafael Vega

Es gibt ein Projekt namens ncore , das den Kern von Arduino bietet. Und ermöglicht das Schreiben von Tests für Arduino-Code.

Aus der Projektbeschreibung

Der native Core ermöglicht das Kompilieren und Ausführen von Arduino-Skizzen auf der PC, im Allgemeinen ohne Modifikation. Es bietet native Versionen von Arduino-Standardfunktionen und ein Befehlszeileninterpretierer für Eingaben in Ihre Skizze, die normalerweise von der Hardware stammen würden selbst.

Auch auf der "was brauche ich dazu" -Abschnitt

Wenn Sie die Tests erstellen möchten, benötigen Sie cxxtest von http://cxxtest.tigris.org . NCORE wurde mit cxxtest 3.10.1 getestet.

3
Sudar

Ich habe arduino_ci für diesen Zweck gebaut. Obwohl es auf das Testen von Arduino-Bibliotheken (und nicht auf Standalone-Skizzen) beschränkt ist, können Komponententests entweder lokal oder auf einem CI-System (wie Travis CI oder Appveyor) ausgeführt werden. 

Betrachten Sie eine sehr einfache Bibliothek in Ihrem Arduino-Bibliotheksverzeichnis mit dem Namen DoSomething mit do-something.cpp:

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

int doSomething(void) {
  return 4;
};

Sie würden es wie folgt testen (mit einer Testdatei mit dem Namen test/is_four.cpp oder einer solchen):

#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.

Das ist alles. Wenn diese assertEqual-Syntax und -Teststruktur bekannt vorkommt, liegt dies daran, dass ich einige der ArduinoUnit-Bibliothek von Matthew Murdoch .__ übernommen habe. dass er in seiner Antwort angesprochen hat. 

Unter Reference.md finden Sie weitere Informationen zu E/A-Pins, der Uhr, seriellen Ports usw.

Diese Unit-Tests werden mit einem in einem Ruby-Edelstein enthaltenen Skript kompiliert und ausgeführt. Beispiele für das Einrichten finden Sie in der Datei README.md oder kopieren Sie eines der folgenden Beispiele:

3
Ian

Wenn Sie Code außerhalb der MCU (auf dem Desktop) testen möchten, überprüfen Sie libcheck: https://libcheck.github.io/check/

Ich habe es einige Male verwendet, um meinen eigenen eingebetteten Code zu testen. Es ist ein ziemlich robuster Rahmen.

2
ezaquarii

Versuchen Sie, Autodesk-Schaltungssimulator . Es ermöglicht den Test von Arduino-Code und -Schaltkreisen mit vielen anderen Hardwarekomponenten.

1
Sidhant Goyal

Verwenden Sie Proteus VSM mit einer Arduino-Bibliothek, um Ihren Code zu debuggen oder um ihn zu testen.

Es ist eine bewährte Methode, bevor Sie Ihren Code an Bord holen, aber achten Sie auf Timings, da die Simulation nicht auf der Platine ausgeführt wird.

1
sathish

Sie können emulare - verwenden, um einen Mikrocontroller in ein Diagramm zu ziehen und Ihren Code in Eclipse auszuführen. In der Dokumentation auf der Website erfahren Sie, wie Sie sie einrichten.

1
Imre

In der Grundversion von Arduino wird mit C und C++ geschrieben, sogar Bibliotheken von Arduino werden in C und C++ geschrieben. Einfach ausgedrückt, behandeln Sie den Code einfach als C und C++ und führen Sie den Unit-Test durch. Hier mit dem Wort "Handle" meine ich, dass Sie die grundlegende Syntax wie serial.println in "sysout", "pinmode" in "varaibles", "void" in "while ()" - Schleife ändern, die entweder im Keystock oder nach einiger Wiederholung bricht. 

Ich weiß, dass dies ein langer Prozess ist und nicht so geradlinig ist. Nach meiner persönlichen Erfahrung wird dies, sobald Sie damit zu tun haben, verlässlicher.

-Nandha_Frost

0
Nandha Frost