Vorwort
Wie Sie wissen, enthält die Arduino (AVR) -Umgebung keine In-Circuit-Debugging-Funktionen, was zu großen Unannehmlichkeiten beim Auffinden komplexer Fehler und beim Verwalten von Projekten führt. Ich möchte zwei Möglichkeiten zeigen, mit denen Sie Ihre Skizzen mit verschiedenen Schwierigkeitsgraden debuggen können. Für die erste Methode benötigen Sie nur Programme, und für die zweite benötigen Sie einen kostengünstigen (im Vergleich zum ursprünglichen Debugger) Adapter, den Sie entweder selbst zusammenbauen oder fertig kaufen können.Im Allgemeinen nichts Neues für diejenigen, die ständig Debugger verwenden, kann aber für Benutzer von Arduino (AVR) nützlich sein.Mit Makefile erstellen
Bevor wir zur Beschreibung des Debuggens in Hardware (im zweiten Teil) kommen, müssen wir einige Schulungen durchführen. Wahrscheinlich wissen viele Leute, dass die Arduino-Umgebung den avr-gcc-Compiler mit der gesamten Umgebung aufruft, die Parameter für den Aufruf automatisch konfiguriert und den Erstellungsprozess startet. Wir müssen diesen Prozess also explizit wiederholen. Wir werden dies nicht manuell tun, obwohl einige Gesten noch erforderlich sind. Dies ist erforderlich, um die Debug-Objektdatei im ELF-Format abzurufen. Die Arduino-Umgebung wird nach sich selbst bereinigt und wir haben weder Zugriff auf die Compileroptionen noch auf die Kompilierungsergebnisse.Dies bringt uns zum Problem der Verwendung von Dienstprogrammen zum automatischen Erstellen eines avr-gcc-Projekts oder vielmehr einer Skizze mit Arduino-Bibliotheken. Hier könnte man traurig sein, weil Dies ist keine einfache Angelegenheit, aber wie sie sagen, wurde bereits alles vor uns getan. Es stellt sich heraus, dass Github bereits über alles verfügt, was Sie zum Zusammenstellen von Skizzen mit Arduino-Bibliotheken benötigen. Das Projekt heißt Arduino-Makefile . Da es aus der Beschreibung nicht schwer zu erraten ist, enthält dieses Projekt ein Makefile zum automatischen Erstellen von Projekten auf Arduino. Von den in der Beschreibung aufgeführten Merkmalen werden wir nur auf einige wenige achten.Das Arduino-Makefile-Paket ist eine Sammlung von Konfigurationsdateien, Beispielen und Beschreibungen. Es gibt keine Dienstprogramme, die all dies verwenden sollten. Es gibt auch keine Entwicklungsumgebung, d.h. Die Montage erfolgt über die Befehlszeile. Dies bedeutet, dass Sie jede für Sie geeignete IDE befestigen können, die die Montage über das Makefile unterstützt. Normalerweise benutze ich Visual Studio.Wenn Sie sich den Inhalt genau ansehen, werden Sie feststellen, dass es ein globales universelles Makefile (Arduino.mk) gibt, das in bestimmten lokalen Assembly-Dateien enthalten ist. Sie müssen nur private (Mindest-) Einstellungen für einen bestimmten Zweck der Assembly angeben. Der Rest wird im automatischen Modus ausgeführt (Einstellen von Variablen, Suchen nach Abhängigkeiten usw.). Dies ist sehr praktisch, wie unten gezeigt wird.Es ist wichtig zu beachten, dass Dateien mit verschiedenen Erweiterungen (* .ino, * .pde, * .c und * .cpp) unterstützt werden. Tatsache ist, dass einer der Debugger AVR Studio 4 ist. Wenn Sie eine Debug-Datei in diese laden, befinden sich die Quellen in der Projektstruktur in verschiedenen Ordnern: CPP-Dateien in Quellen und der Rest in Headern. Wenn wir die Erweiterung für die Skizze belassen (ino), gelangt die Datei nicht in die Quellen und die Syntaxhervorhebung wirkt sich nicht darauf aus. Es ist unmöglich, es anzusehen. Daher nehmen wir zur Kenntnis, dass die Erweiterung für Skizzen während der Montage zum Debuggen in AVR Studio auf Standard (.c oder .cpp) geändert werden muss.Toolkit
Wir haben herausgefunden, dass wir Skizzen sammeln können. Nun wollen wir sehen, wie der Assembler- und Debugging-Prozess organisiert wird. Ich habe versprochen, zwei Wege aufzuzeigen. Jeder von ihnen hat seine Vor- und Nachteile. Lassen Sie uns sie kurz überprüfen.1 Verfahren . Erstellen Sie eine Debug-Datei, laden Sie sie auf Proteus hoch und debuggen Sie dort. Vorteile: - relativ einfache Fehlerbehebung (bei Anschluss eines Monitors mit serieller Schnittstelle müssen Sie sich nur selbst quälen); - Zugang zur Außenwelt über eine serielle Schnittstelle; - Erstellung von Grafiken (virtuelle Messinstrumente sind verfügbar); - die Fähigkeit, die Schaltung in Echtzeit zu simulieren;
- In separaten Fenstern stehen natürlich die Register mk, Speicherbereiche, globale Variablen und der Quellcode zur Verfügung, einschließlich der Assembler-Version.Nachteile:- bezahlter Proteus;- eine begrenzte Anzahl von Peripheriegeräten;- Komplexe Modelle können nicht alle Merkmale der Originalkomponenten berücksichtigen.2 Verfahren . Wir erstellen eine Debug-Datei, laden sie in AVR Studio 4 und debuggen sie mit dem speziellen Proteus VSM Viewer-Plugin für AVR Studio 4.
Die Vor- und Nachteile sind fast dieselben wie bei Methode 1. Sie können hinzufügen, dass AVR Studio einen detaillierten Baum aller Register der simulierten Mikrometer bis zu den Bits anzeigt, was sehr praktisch ist. Von den Minuspunkten ist anzumerken, dass das Debuggen von optimiertem Code seine eigenen Eigenschaften hat und es nicht so einfach zu verstehen ist, wie der Debugger an den richtigen Stellen angehalten werden kann.3 - Verfahren . Wir erstellen eine Debug-Datei, laden sie in AVR Studio 4 und debuggen sie mit dem JTAG ICE mkII-Software-Emulator und einem speziellen Adapter (HappyJTAG2). Vorteile: - Dies ist echtes Debugging in realer Hardware mit dem JTAG ICE mkII-Debugger (Mikrofonunterstützung bis ATmega2560); - HappyJTAG 2.45 läuft unter Windows 7 x64. Sie müssen nur ein Fenster überspringen, in dem Sie ohnehin aufgefordert werden, Treiber zu kaufen.
Nachteile:- Es wurde ein instabiler Betrieb von HappyJTAG2 mit kleinen Quellcodes festgestellt.- Instabile Arbeit von AVR Studio beim Ausführen von Debugging-Vorgängen;- Der Autor von HappyJTAG2 hat seine Idee lange aufgegeben (anscheinend mit dem Aufkommen von AVR Studio 5 und Atmel Studio);- Einige Funktionen der Verbindung (COM4 oder einer der ersten 4 seriellen Ports sollte frei sein oder fehlen, da AVR Studio auf der Suche nach einem Debugger COM1-COM4 durchläuft). Es ist frei oder abwesend , weil HappyJTAG2 funktioniert sozusagen von innen.Wie Sie sehen, habe ich drei Wege aufgezeigt, aber derzeit haben mich nur zwei davon praktisch verdient. Die erste Methode wird in diesem Artikel beschrieben. Leider konnte ich die zweite Methode nicht wiederholen. Sie müssen eine „kompatible“ Kombination aus Proteus und AVR Studio finden. Im Bild werden die neuesten Versionen von AVR Studio 4.19.730 und Proteus 7.7 SP2 verwendet. Es war einmal eine Zeit, in der ich diese Methode verwendet habe, aber in Gegenwart eines Eisen-Debuggers macht es wenig Sinn, sie zu verwenden. Ich habe die dritte Methode für den zweiten Teil verlassen. Dort benötigen Sie einen Adapter und eine Beschreibung der Verbindung zu Arduino-Boards, die das JTAG-Debugging unterstützen.Und was brauchen wir für diese ganze Küche? Zuerst müssen Sie die elende Arduino IDE vergessen, sie kann nur für Kontrollprüfungen beim Zusammenstellen von Skizzen verwendet werden. Als nächstes brauchen wir:-Arduino-Makefile - eine Reihe von Konfigurationsdateien für die manuelle Montage von Projekten auf Arduino;- einige Editoren mit C ++ - Syntaxhervorhebung und der Fähigkeit, externe Befehle auszuführen ( Notepad ++ , VS20xx, Far, ...);- Proteus 7.x - ein bekannter Simulator für gemischte (analog-digitale) Schaltkreise;- Terminalprogramm ( PuTTY , ZOC Pro), das ein Analogon des Monitors sein wird;- Ein Programm, das virtuelle serielle Nullmodem-Ports (VSPD, ...) erstellt.- Arduino IDE 1.6.x (wir brauchen Bibliotheken und den avr-gcc-Compiler);- WinAVR (wir benötigen binutils aus seiner Menge, dies ist eine Reihe von Unix-Befehlen für Windows);- avr gcc 4.9.2(Der Compiler ist frischer, wenn Sie den mit der Arduino IDE gelieferten nicht verwenden möchten.)- AVR Studio 4.19.730 - die neueste Version der Entwicklungsumgebung von Atmel vor dem Wechsel zu Visual Studio (nur für den zweiten Teil erforderlich);- HappyJTAG 2.45 (wird nur für den zweiten Teil benötigt).Wir gehen davon aus, dass Sie wissen, wie Sie Google fragen können, woher Sie diesen ganzen Haushalt beziehen können. Für alle Fälle werde ich am Ende des Artikels nützliche Links bereitstellen. Einige Kommentare zum Toolkit.Wie Sie wissen, wird Proteus bezahlt, aber das ist nicht das Traurigste. Leider sind seine Bibliotheken nicht so nah an der realen Welt, wie wir es gerne hätten. Beispielsweise können Sie das Ethernet-Shield W5100 darin nicht modellieren (zumindest in Version 7.x). Deshalb, liebe Anhänger von Arduino, geht den wahren Weg. Nur das Debuggen und nur die Hardware retten Ihre Seelen vor falsch gestellten Fragen. Wir werden Proteus als Trainingswerkzeug und vor Ort verwenden - nur JTAG.Debuggen von Arduino Sketches (AVR) in Proteus 7.x.
Genug für gebräuchliche Wörter, jetzt Besonderheiten. Es gibt viele Optionen zum Starten des Montageprozesses. Sie können nicht alle aufschreiben. Daher werde ich mich auf nur eine konzentrieren und versuchen, diese klar zu beschreiben. Wenn Sie das allgemeine Schema sehen, können Sie es auf Ihre Entwicklungswerkzeuge anwenden. Der Einfachheit halber werde ich die Beschreibung des gesamten Prozesses in Schritte aufteilen, einige können übersprungen werden. Ich hoffe, dass selbst die unerfahrensten Arduino-Benutzer verstehen, worum es geht.Schritt 1 . Herunterladen Arduino. , 1.6.x. . , Arduino . , ( C# C++ , , C++/CLI, ). , , . , , Arduino
, Serial.print() . .
Ich war abgelenkt, und Sie haben es wahrscheinlich geschafft, die Umgebung auf die übliche Weise zu gestalten. Es wird empfohlen, dass sich der Arduino-Ordner im Stammverzeichnis der Partition befindet (C: \ Arduino). Dies liegt an Makefile-Pfaden, die keine Leerzeichen in Programmdateien mögen. Wir werden die Pfade später für diejenigen konfigurieren, die bereits einen Ordner in den „Programmdateien“ haben und für Windows-Benutzer eine schwierige Aufgabe erledigen müssen - einen Knotenpunkt im Ordner. Vielleicht kann der Raum entkommen, aber ich habe dies nicht versucht.Nehmen wir zur Sicherheit an, der Pfad zur Umgebung lautet: C: \ Programme \ Arduino.Schritt 2 . Herunterladenund packe das Arduino-Makefile aus. Entpacken Sie den Inhalt des Arduino-Makefile-Master-Ordners in C: \ Arduino-Makefile. Ich möchte sofort darauf hinweisen, dass sich darin eine README.md-Datei befindet, die besser auf github zu sehen ist, in der viele Dinge beschrieben werden. Beachten Sie auch die Datei arduino-mk-vars.md, die eine Beschreibung der im Benutzer- (Projekt-) Makefile verwendeten Variablen enthält.Damit das Dienstprogramm make funktioniert, benötigen Sie das gnu bin utils-Kit, das Teil von WinAVR warzu gegebener Zeit. Ich weiß nicht, ob es eine offizielle Website zum Zusammenstellen derselben Dienstprogramme für Windows gibt, aber Sie können Folgendes tun. Sie müssen das gute alte WinAVR der neuesten Version herunterladen und den Ordner utils daraus ziehen, in dem sich die Befehlsdienstprogramme befinden. Sie können WinAVR installieren, kopieren und deinstallieren (da es den alten avr-gcc-Compiler enthält, den wir nicht benötigen).Erstellen Sie als Nächstes beispielsweise einen Ordner c: \ avr-gcc und kopieren Sie die Dienstprogramme in diesen Ordner. Fügen Sie anschließend den Pfad C: \ avr-gcc \ utils \ bin zur Variablen PATH hinzu (über die Computereigenschaften): Der Pfad sollte einer der ersten in der Suche sein. Vergessen Sie diese Änderung nicht, als Dies kann sich auf andere Programme auswirken, wenn Sie andere ähnliche Entwicklungsumgebungen verwenden . Schritt 3set PATH=C:\avr-gcc\utils\bin;%PATH%
. Sie selbst wissen, wo Sie Proteus bekommen / kaufen [7.2 - 7.8]. Warum genau diese Serie und so ein Versionsintervall? Weil ich sie ausprobiert habe und scheinbar an einfachen Projekten, sind sie ziemlich gut. Versionen über 7.8 konnten die Objektdatei eines meiner Projekte nicht in die IAR laden, und unten habe ich es nicht versucht. Die Acht ist vorerst nur fehlerhaft, vielleicht schreibt dann jemand etwas über sie. Hier nehmen wir speziell Proteus 7.8 SP2.Schritt 4 . Erstellen Sie mithilfe des Artikels einen Verbindungspunkt im Ordner mit der installierten Arduino-Umgebung, d. H. C: \ Arduino sollte auf C: \ Programme \ Arduino verweisen. Dies ist notwendig, um mit der Unterstützung von Leerzeichen in Makefiles nicht klüger zu sein. Ohne den Ordner mit Arduino zu kopieren, haben wir eine Kopie davon an der richtigen Stelle erhalten. Wer Far verwendet, kann die Kombination Alt + F6 für den Ordner verwenden.Wir ändern die Einstellungen der Arduino-Umgebung. Der Pfad zum Ordner mit den Skizzen: C: \ Arduino-Makefile \ examples. Wenn Sie einen externen Editor (Notepd ++, ...) verwenden, können Sie die Einstellungen überprüfen. Gleichzeitig aktualisiert Arduino bei Aktivierung des Fensters den Inhalt seines Editors automatisch. Wir wählen das Arduino Mega 2560-Board und den ATmega2560-Prozessor (tatsächlich ist es nicht so wichtig, was hier ausgewählt wird, die Hauptsache ist, sich für den verwendeten Controller zu entscheiden).Wir schreiben ein Beispielprogramm zum Testen der Assembly aus der Arduino-Umgebung, nennen es Example1 und speichern es im Skizzenordner: Kompilieren und überprüfen Sie, ob die Assembly erfolgreich ist. In Arduino 1.6.7 stürzte der Objektdatei-Linker (ld.exe) mit einem Fehler ab. Ich habe ihn durch einen anderen ersetzt (z. B. aus dieser Assembly). Schritt 5void setup()
{
DDRD |= ( 1 << DDD2 );
}
void loop()
{
PIND |= ( 1 << PIND2 );
}
. Kopieren Sie die Datei C: \ Arduino-Makefile \ examples \ WebServer \ Makefile in den Ordner mit unserer Skizze: C: \ Arduino-Makefile \ examples \ Example1. Wir korrigieren den Inhalt wie folgt:Makefile# 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
Wir fügen am Anfang unserer Quelle eine Zeile ein, die Arduino.h explizit verbindet (dies ist nicht erforderlich, wenn in der Variablen ARDUINO_LIBS Bibliotheksabhängigkeiten angegeben sind): Vergessen Sie nicht, die Quelle und das Makefile zu speichern. Als nächstes geben wir im Ordner Example1 den Befehl make ein (über die Konsole oder in Far oder auf andere bequeme Weise). Es sollte ein großes Fußtuch angezeigt werden, das dem in der Arduino IDE angezeigten ähnelt, wenn Sie die Ausgabe vollständiger Informationen über den Erstellungsprozess aktivieren. Wenn alles richtig gemacht wurde, wenn etwas nicht funktioniert hat, versuchen Sie zuerst, unabhängig zu verstehen, was falsch ist, und schreiben Sie dann Kommentare zu dem Artikel.#include "Arduino.h"
void setup()
{
DDRD |= ( 1 << DDD2 );
}
void loop()
{
PIND |= ( 1 << PIND2 );
}
Da wir die Zeile ARDUINO_QUIET = 1 im Makefile auskommentiert haben, gibt es vor den Informationen über die Assembly einen Header mit den Werten der Variablen des Makefiles selbst. Einige von ihnen werden angegeben, während andere im Verlauf berechnet werden. Dies hilft, Fehler beim Bearbeiten des Makefiles des Projekts zu finden.Der Anfang des Fußtuchs-------------------------
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
Wir gehen davon aus, dass alles gut gelaufen ist, dann sollten Sie einen Build-Mega-Daddy haben, in dem unser lang erwartetes Example1.elf genau die Datei ist, für die die gesamte Aktion gestartet wurde. Mit dieser Datei werden wir das virtuelle Mikrofon in Proteus einer Gehirnwäsche unterziehen und heilen ... mit einem anderen Freiheitsgrad.Schritt 6 . Zurück zu Proteus. Erstellen Sie ein neues Projekt (dsn-Datei) im Quellordner . Wir nehmen die Komponente - den ATmega2560-Mikrocontroller - aus dem Darm der Bibliothek und setzen sie dort ein, wo sie passt. Es ist wirklich schmerzhaft. Füllen Sie die Eigenschaften der Komponente im Bild aus. Die Installation von COMPIM ist noch nicht erforderlich. Sie benötigen es, um mit dem Monitor arbeiten zu können. Dann rufen wir den Debug-Modus Debug \ Start / Restart Debugging auf. Holen Sie sich ein Bild, das so aussieht.
Nun, und dann hängt alles vom Flug Ihrer Fantasie ab. Im Quellfenster stehen nicht nur Example1.ino, sondern auch andere abhängige Quellen zur Verfügung. Sie können den Assembler-Code, die Prozessorregister, den Speicher und ähnliches öffnen. Lesen Sie das Dock auf Proteus.Schritt 7 . Sie müssen einen Monitor einrichten. Um Faulheit zu schreiben, hoffe ich, es selbst zu tun. Kurz gesagt, die Bedeutung ist diese. Sie erstellen zwei virtuelle serielle Ports, die über ein Nullmodem verbunden sind (vorzugsweise mit Nummern größer als COM4). Sie schreiben eine in der COMPIM Proteus-Komponente und die zweite im Terminalprogramm (PuTTY) vor. Vergessen Sie nicht, die Geschwindigkeit und Codierung der Ausgabe im Terminalprogramm zu korrigieren. Theoretisch sollte dies mit der Codierung der Quelldateien übereinstimmen, wenn Sie die Ausgabe auf Russisch auf dem Monitor vornehmen möchten.Schritt 8 . Wenn Sie verwenden möchtenavr gcc 4.9.2 , Sie müssen den Inhalt des Archivs im Stammverzeichnis der Festplatte ablegen und den Pfad in der Variablen AVR_TOOLS_DIR festlegen. Nur dort hat avr-size anscheinend bei mir nicht funktioniert. Sie können es in das mit WinAVR (oder Arduino) gelieferte ändern.: By the way, dass die Größe des Ausgangs in der normalen Form Notwendigkeit , die Option Aufruf avr-size (Datei Arduino.mk) hinzufügen Nützliche Links : 1. die Arduino des IDE 1.6.x . 2. Arduino-Makefile . 3. WinAVR . 4. avr gcc 4.9.2 . 5. Hardlinks usw. in Windows . 6. PuTTY . 7. Editor ++ .avr_size = $(SIZE) $(SIZEFLAGS) --format=avr $(1)