Préface
Comme vous le savez, l'environnement Arduino (AVR) ne contient pas de fonctions de débogage en circuit, ce qui crée un grand inconvénient dans la recherche d'erreurs complexes et la maintenance des projets. Je veux montrer deux façons dont vous pouvez déboguer vos croquis de différents niveaux de difficulté. Pour la première méthode, vous n'avez besoin que de programmes et pour la seconde, vous avez besoin d'un adaptateur peu coûteux (par rapport au débogueur d'origine), que vous pouvez soit assembler vous-même, soit acheter prêt à l'emploi.En général, rien de nouveau pour ceux qui utilisent constamment des débogueurs, mais peut être utile pour les utilisateurs d'Arduino (AVR).Créer avec Makefile
Avant de passer à la description du débogage dans le matériel (dans la deuxième partie), nous devons suivre une formation. Beaucoup de gens savent probablement que l'environnement Arduino appelle le compilateur avr-gcc avec l'environnement entier, configure automatiquement les paramètres pour l'appeler et démarre le processus de construction. Nous devons donc répéter ce processus explicitement. Nous ne le ferons pas manuellement, bien que certains gestes restent nécessaires. Ceci est nécessaire pour obtenir le fichier objet de débogage au format ELF. L'environnement Arduino se nettoie après lui-même et nous n'avons accès ni aux options du compilateur ni aux résultats de la compilation.Cela nous amène à la question de l'utilisation des utilitaires pour construire automatiquement un projet avr-gcc, ou plutôt un croquis avec les bibliothèques Arduino. Ici, ce serait triste, car ce n'est pas une question simple, mais comme on dit, tout a déjà été fait avant nous. Il s'avère que github a déjà tout ce dont vous avez besoin pour assembler des croquis avec des bibliothèques Arduino. Le projet s'appelle Arduino-Makefile . Comme il n'est pas difficile à deviner à partir de la description, ce projet contient un Makefile pour construire automatiquement des projets sur Arduino. Parmi les fonctionnalités répertoriées dans la description, nous ne prêterons attention qu'à quelques-unes.Le package Arduino-Makefile est une collection de fichiers de configuration, d'exemples et de descriptions. Aucun utilitaire ne devrait utiliser tout cela. Il n'y a pas non plus d'environnement de développement, c'est-à-dire l'assemblage se fait via la ligne de commande. Cela signifie que vous pouvez attacher n'importe quel IDE qui vous convient, qui prend en charge l'assemblage via le Makefile. J'utilise généralement Visual Studio.Si vous regardez attentivement le contenu, vous remarquerez qu'il existe un Makefile universel universel (Arduino.mk), qui est inclus dans des fichiers d'assemblage locaux spécifiques. Vous devez spécifier uniquement des paramètres privés (minimum) pour un objectif spécifique de l'assemblage, et le reste se fera en mode automatique (définition de variables, recherche de dépendances, etc.). Ceci est très pratique, comme indiqué ci-dessous.Il est important de noter que les fichiers avec différentes extensions (* .ino, * .pde, * .c et * .cpp) sont pris en charge. Le fait est que l'un des débogueurs sera AVR Studio 4. Lorsque vous y chargez un fichier de débogage, les sources de l'arborescence du projet se trouvent dans différents dossiers: les fichiers cpp dans les sources et le reste dans les en-têtes. Si nous laissons l'extension pour l'esquisse (ino), le fichier n'entrera pas dans les sources et la coloration syntaxique n'agira pas dessus. Il est impossible de le regarder. Par conséquent, nous prenons note que l'extension des esquisses pendant l'assemblage pour le débogage dans AVR Studio doit être changée en standard (.c ou .cpp).Boîte à outils
Nous avons découvert que nous pouvons collecter des croquis. Voyons maintenant comment le processus d'assemblage et de débogage sera organisé. J'ai promis de montrer deux façons. Chacun d'eux a ses avantages et ses inconvénients. Revoyons-les brièvement.Méthode 1 . Nous créons un fichier de débogage, le chargeons dans Proteus, le déboguons là. Avantages: - relative facilité de débogage (avec la connexion d'un moniteur de port série, il suffit de se tourmenter); - accès au monde extérieur via un port série; - construction de graphiques (des instruments de mesure virtuels sont disponibles); - la possibilité de simuler le circuit en temps réel;
- Dans des fenêtres séparées, les registres mk, les zones de mémoire, les variables globales et le code source sont bien sûr disponibles, y compris sa version assembleur.Inconvénients:- Proteus payé;- un ensemble limité de périphériques;- les modèles complexes ne peuvent pas prendre en compte toutes les fonctionnalités des composants d'origine.Méthode 2 . Nous créons un fichier de débogage, le chargeons dans AVR Studio 4, le déboguons à l'aide du plugin spécial Proteus VSM Viewer pour AVR Studio 4.
Les avantages et les inconvénients sont presque les mêmes que ceux de la méthode 1. Vous pouvez ajouter qu'AVR Studio affiche une arborescence détaillée de tous les registres des microns simulés, jusqu'aux bits, ce qui est très pratique. Parmi les inconvénients, il convient de noter que le débogage de code optimisé a ses propres caractéristiques et qu'il n'est pas si facile de comprendre comment faire s'arrêter le débogueur aux bons endroits.Méthode 3 . Nous créons un fichier de débogage, le chargeons dans AVR Studio 4, le débogage à l'aide de l'émulateur logiciel JTAG ICE mkII et d'un adaptateur spécial (HappyJTAG2). Avantages: - il s'agit d'un véritable débogage dans du matériel réel utilisant le débogueur JTAG ICE mkII (prise en charge du micro jusqu'à ATmega2560); - HappyJTAG 2.45 fonctionne sur Windows 7 x64, il vous suffit de sauter une fenêtre où l'on vous demande quand même d'acheter des pilotes.
Inconvénients:- un fonctionnement instable de HappyJTAG2 avec de petits codes sources a été remarqué;- travail instable d'AVR Studio lors des opérations de débogage;- l'auteur de HappyJTAG2 a depuis longtemps abandonné son idée originale (apparemment avec l'avènement d'AVR Studio 5 et Atmel Studio);- certaines fonctionnalités de connexion (COM4 ou l'un des 4 premiers ports série doit être libre ou absent, car AVR Studio parcourt COM1-COM4 à la recherche d'un débogueur). Il est gratuit ou absent , car HappyJTAG2 fonctionne, pour ainsi dire, de l'intérieur.Comme vous pouvez le voir, j'ai montré trois façons, mais à l'heure actuelle, seulement deux d'entre elles m'ont pratiquement gagné. La première méthode sera décrite dans cet article. Malheureusement, je n'ai pas pu répéter la deuxième méthode. Vous devez trouver une combinaison «compatible» de Proteus et AVR Studio. Les derniers AVR Studio 4.19.730 et Proteus 7.7 SP2 sont utilisés dans l'image. Il était une fois j'ai utilisé cette méthode, mais en présence d'un débogueur de fer, son utilisation n'a pas beaucoup de sens. J'ai quitté la troisième méthode pour la deuxième partie. Là, vous aurez besoin d'un adaptateur et d'une description de sa connexion aux cartes Arduino qui prennent en charge le débogage JTAG.Et de quoi avons-nous besoin pour toute cette cuisine? Vous devez d'abord oublier le misérable Arduino IDE, il ne peut être utilisé que pour les vérifications de contrôle lors de l'assemblage des croquis. Ensuite, nous aurons besoin de:-Arduino-Makefile - un ensemble de fichiers de configuration pour l'assemblage manuel de projets sur Arduino;- Un éditeur avec mise en évidence de la syntaxe C ++ et la possibilité d'exécuter des commandes externes ( Notepad ++ , VS20xx, Far, ...);- Proteus 7.x - un simulateur bien connu de circuits mixtes (analogiques-numériques);- programme terminal ( PuTTY , ZOC Pro), qui sera un analogue du moniteur;- Un programme qui crée des ports série virtuels null-modem (VSPD, ...);- Arduino IDE 1.6.x (nous avons besoin de bibliothèques et du compilateur avr-gcc);- WinAVR (nous avons besoin de binutils de son ensemble, c'est un ensemble de commandes unix pour Windows);- avr gcc 4.9.2(le compilateur est plus frais si vous ne voulez pas utiliser celui fourni avec l'IDE Arduino);- AVR Studio 4.19.730 - la dernière version de l'environnement de développement d'Atmel avant de passer à Visual Studio (nécessaire uniquement pour la deuxième partie);- HappyJTAG 2.45 (nécessaire uniquement pour la deuxième partie).Nous supposerons que vous savez comment demander à Google où trouver tout ce ménage. Au cas où, je fournirai des liens utiles à la fin de l'article. Quelques commentaires sur la boîte à outils.Comme vous le savez, Proteus est payé, mais ce n'est pas la chose la plus triste. Malheureusement, ses bibliothèques ne sont pas aussi proches du monde réel que nous le souhaiterions. Par exemple, vous ne pouvez pas y modéliser le blindage Ethernet W5100 (au moins dans la version 7.x). Par conséquent, chers adeptes d'Arduino, suivez le vrai chemin. Seul le débogage et uniquement dans le matériel sauvera vos âmes des questions mal posées. Nous utiliserons Proteus comme outil de formation et sur le terrain - uniquement JTAG.Débogage des croquis Arduino (AVR) dans Proteus 7.x
Assez pour les mots courants, maintenant spécifiques. Il existe de nombreuses options pour démarrer le processus d'assemblage, vous ne pouvez pas toutes les écrire, je vais donc me concentrer sur une seule et essayer de la décrire clairement. En voyant le schéma général, vous pouvez l'appliquer à votre ensemble d'outils de développement. Pour plus de commodité, je décompose la description de l'ensemble du processus par étapes, certaines peuvent être ignorées. J'espère que même les utilisateurs d'Arduino les moins expérimentés comprendront de quoi il s'agit.Étape 1 . Téléchargezet installer l'environnement de développement Arduino. Pour être précis, supposons qu'il proviendra de la série 1.6.x. Ici, je ferai immédiatement quelques commentaires. En général, nous n'avons besoin que des bibliothèques d'Arduino. En dehors de tout le reste, l'idée même d'une forme simplifiée du programme est très bonne (si vous comparez C # et C ++ ou, Dieu nous en préserve, C ++ / CLI, alors c'est le paradis et la terre). Le manque d'outils de débogage normaux a conduit, franchement, à une programmation analphabète. Au lieu de transformer consciemment l'algorithme conçu en code de programme, les utilisateurs d'Arduino sont obligés de faire des combinaisons de sorts magiques, de filtrer les informations via Serial.print (), et seuls certains essaient de lire statiquement les sources de la bibliothèque. Il est difficile de tout regarder.J'étais distrait, et vous avez probablement réussi à mettre l'environnement de manière standard. Il est conseillé que le dossier Arduino soit à la racine de la partition (C: \ Arduino). Cela est dû aux chemins de makefile qui n'aiment pas les espaces dans Program Files. Plus tard, nous configurerons le chemin pour ceux qui ont déjà un dossier dans les «Program Files» et devons faire une chose difficile pour les utilisateurs de Windows - un point de jonction sur un dossier. Peut-être que l'espace peut s'échapper, mais je n'ai pas essayé cela.Pour être précis, disons que le chemin vers l'environnement est: C: \ Program Files \ Arduino.Étape 2 . Téléchargezet décompressez l'Arduino-Makefile. Décompressez le contenu du dossier Arduino-Makefile-master dans C: \ Arduino-Makefile. Je veux immédiatement noter qu'à l'intérieur il y a un fichier README.md, qui est préférable de regarder github, où beaucoup de choses sont décrites. Vous devez également prendre note du fichier arduino-mk-vars.md, qui contient une description des variables utilisées dans le Makefile utilisateur (projet).Pour utiliser l'utilitaire make, vous avez besoin du kit gnu bin utils, qui faisait partie de WinAVRen temps voulu. Je ne sais pas s'il existe un site officiel pour assembler ces mêmes utilitaires pour Windows, mais vous pouvez faire ce qui suit. Vous devrez télécharger le bon vieux WinAVR de la dernière version et en retirer le dossier utils, où se trouvent les utilitaires de commande. Vous pouvez installer, copier le dossier et désinstaller WinAVR (car il inclut l'ancien compilateur avr-gcc, dont nous n'avons pas besoin).Ensuite, par exemple, créez un dossier c: \ avr-gcc et copiez-y les utilitaires. Après cela, ajoutez le chemin C: \ avr-gcc \ utils \ bin à la variable PATH (via les propriétés de l'ordinateur): le chemin doit être l'un des premiers de la recherche. N'oubliez pas ce changement, car cela peut affecter d'autres programmes si vous utilisez d'autres environnements de développement similaires . Étape 3set PATH=C:\avr-gcc\utils\bin;%PATH%
. Vous savez vous-même où vous obtenez / achetez Proteus [7.2 - 7.8]. Pourquoi exactement cette série et un tel intervalle de versions? Parce que je les ai essayés et apparemment sur des projets simples, ils sont assez bons. Les versions supérieures à 7.8 n'ont pas pu charger le fichier objet d'un de mes projets dans l'IAR, et ci-dessous je n'ai pas essayé. Le huit est juste un buggy pour le moment, peut-être que quelqu'un écrira quelque chose à son sujet. Ici, nous prendrons spécifiquement Proteus 7.8 SP2.Étape 4 . À l'aide de l' article , créez un point de jonction sur le dossier avec l'environnement Arduino installé, c'est-à-dire C: \ Arduino doit référencer C: \ Program Files \ Arduino. Ceci est nécessaire pour ne pas être plus sage avec le support des espaces dans les makefiles. Ainsi, sans copier le dossier avec Arduino, nous en avons obtenu une copie au bon endroit. Qui utilise Far peut utiliser la combinaison Alt + F6 sur le dossier.Nous modifions les paramètres de l'environnement Arduino. Le chemin vers le dossier avec les croquis: C: \ Arduino-Makefile \ examples. Si vous utilisez un éditeur externe (Notepd ++, ...), vous pouvez alors vérifier les paramètres. En même temps, lorsque la fenêtre est activée, Arduino mettra automatiquement à jour le contenu de son éditeur. Nous sélectionnons la carte Arduino Mega 2560 et le processeur ATmega2560 (en fait, ce n'est pas si important que choisir ici, l'essentiel est de décider du contrôleur utilisé).Nous écrivons un exemple de programme pour tester l'assemblage à partir de l'environnement Arduino, nommez-le Example1 et enregistrez-le dans le dossier d'esquisse: compilez et vérifiez que l'assemblage passe. Dans Arduino 1.6.7, l'éditeur de liens de fichier objet (ld.exe) s'est écrasé avec une erreur, je l'ai remplacé par un autre (par exemple, de cet assemblage). Étape 5void setup()
{
DDRD |= ( 1 << DDD2 );
}
void loop()
{
PIND |= ( 1 << PIND2 );
}
. Copiez le fichier C: \ Arduino-Makefile \ examples \ WebServer \ Makefile dans le dossier avec notre croquis: C: \ Arduino-Makefile \ examples \ Example1. Nous fixons son contenu comme suit: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
Nous insérons au début de notre source une ligne qui connecte explicitement Arduino.h (ce n'est pas nécessaire s'il y a des dépendances de bibliothèque indiquées dans la variable ARDUINO_LIBS): N'oubliez pas de sauvegarder la source et Makefile. Ensuite, étant dans le dossier Example1, nous entrons la commande make (à l'aide de la console ou dans Far, ou d'une autre manière pratique), un grand footcloth devrait apparaître, similaire à celui affiché dans l'IDE Arduino lorsque vous activez la sortie d'informations complètes sur le processus de construction. C'est si tout a été fait correctement, si quelque chose n'a pas fonctionné, essayez d'abord de comprendre indépendamment ce qui ne va pas, puis écrivez des commentaires sur l'article.#include "Arduino.h"
void setup()
{
DDRD |= ( 1 << DDD2 );
}
void loop()
{
PIND |= ( 1 << PIND2 );
}
Puisque nous avons commenté la ligne ARDUINO_QUIET = 1 dans le Makefile, il y a un en-tête avec les valeurs des variables du Makefile lui-même avant les informations d'assemblage. Certains d'entre eux sont spécifiés, tandis que d'autres sont calculés au fur et à mesure de leur progression. Cela permet de trouver des erreurs lors de la modification du Makefile du projet.Le début de la footcloth-------------------------
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
Nous supposons que tout s'est bien passé, alors vous devriez avoir un papa build-mega, dans lequel notre tant attendu Example1.elf est le fichier même pour lequel toute l'action a été lancée. Avec ce fichier, nous allons «laver le cerveau» du micro virtuel dans Proteus et guérir ... avec un autre degré de liberté.Étape 6 . Revenons à Proteus. Créez un nouveau projet (fichier dsn) dans le dossier source . Nous sortons le composant - le microcontrôleur ATmega2560 des entrailles de la bibliothèque et l'insérons là où il convient, c'est vraiment douloureux. Remplissez les propriétés du composant dans l'image. L'installation de COMPIM n'est pas encore nécessaire, vous en aurez besoin pour travailler avec le moniteur. Ensuite, nous entrons en mode débogage Debug \ Start / Restart Debugging. Obtenez une image qui ressemble à ceci.
Eh bien, et puis, tout dépend du vol de votre imagination. Non seulement Example1.ino, mais également d'autres sources dépendantes seront disponibles dans la fenêtre source. Vous pouvez ouvrir le code assembleur, les registres du processeur, la mémoire et quelque chose d'autre comme ça. Lisez le dock sur Proteus.Étape 7 . Vous devez configurer un moniteur. Pour écrire la paresse, j'espère le faire vous-même. En bref, le sens est le suivant. Vous créez deux ports série virtuels connectés par un modem nul (de préférence avec des nombres supérieurs à COM4). Vous en prescrivez un dans le composant COMPIM Proteus et le second dans le programme terminal (PuTTY). N'oubliez pas de corriger la vitesse et l'encodage de la sortie dans le programme du terminal, en théorie, cela devrait coïncider avec l'encodage des fichiers source, si vous souhaitez effectuer une sortie sur le moniteur en russe.Étape 8 . Si vous souhaitez utiliseravr gcc 4.9.2 , vous devez mettre le contenu de l'archive à la racine du disque et corriger le chemin dans la variable AVR_TOOLS_DIR. Seulement là, la taille avr n'a pas fonctionné pour moi, semble-t-il. Vous pouvez le remplacer par celui fourni avec WinAVR (ou Arduino).Soit dit en passant, que la taille de la sortie sous la forme normale besoin d'ajouter l'option d'appel de taille AVR (fichier Arduino.mk): Liens utiles : 1. l'Arduino le 1.6.x IDE . 2. Arduino-Makefile . 3. WinAVR . 4. AVR gcc 4.9.2 . 5. Liens durs, etc. sous Windows . 6. PuTTY . 7. Bloc-notes ++ .avr_size = $(SIZE) $(SIZEFLAGS) --format=avr $(1)