Depuración de código Arduino (AVR). Parte 1. Depuración virtual

Prólogo


, Arduino (AVR) , . , . , ( ) , , .
, , , Arduino (AVR).

Makefile


Antes de llegar a la descripción de la depuración en el hardware (en la segunda parte) necesitamos hacer algo de entrenamiento. Probablemente muchas personas saben que el entorno Arduino llama al compilador avr-gcc con todo el entorno, configura automáticamente los parámetros para llamarlo e inicia el proceso de compilación. Entonces, necesitamos repetir este proceso explícitamente. No haremos esto manualmente, aunque todavía se necesitarán algunos gestos. Esto es necesario para obtener el archivo de objeto de depuración en formato ELF. El entorno Arduino se limpia después de sí mismo y no tenemos acceso ni a las opciones del compilador ni a los resultados de la compilación.

avr-gcc , — Arduino. , .. , , , . , github Arduino. Arduino-Makefile. , Makefile Arduino. .

Arduino-Makefile — , . , . , .. . , IDE, Makefile. Visual Studio.

, , Makefile (Arduino.mk), . () , ( , ). , .

, (*.ino, *.pde, *.c *.cpp). , AVR Studio 4. : cpp- sources, headers. (ino), sources . . , AVR Studio (.c .cpp).


Descubrimos que podemos coleccionar bocetos. Ahora veamos cómo se organizará el proceso de montaje y depuración. Prometí mostrar dos maneras. Cada uno de ellos tiene sus pros y sus contras. Vamos a revisarlos brevemente.

Método 1 . Cree un archivo de depuración, cárguelo en Proteus, depúrelo allí. Ventajas: - relativa facilidad de depuración (con la conexión de un monitor de puerto serie, solo necesita atormentarse); - acceso al mundo exterior a través de un puerto serie; - construcción de gráficos (hay instrumentos de medición virtuales disponibles); - la capacidad de simular el circuito en tiempo real;








- En ventanas separadas, los registros mk, las áreas de memoria, las variables globales y el código fuente están disponibles, por supuesto, incluida su versión de ensamblador.

Desventajas:
- Proteus pagado;
- un conjunto limitado de periféricos;
- Los modelos complejos no pueden tener en cuenta todas las características de los componentes originales.

Método 2 . Creamos un archivo de depuración, lo cargamos en AVR Studio 4, lo depuramos utilizando el complemento especial Proteus VSM Viewer para AVR Studio 4.



, 1. , AVR Studio , , . , .

3. , AVR Studio 4, , JTAG ICE mkII (HappyJTAG2).

 

:
— «» JTAG ICE mkII ( ATmega2560);
— HappyJTAG 2.45 Windows 7 x64, , - .

Desventajas:
se notó la operación inestable de HappyJTAG2 con códigos fuente pequeños;
- trabajo inestable de AVR Studio al realizar operaciones de depuración;
- el autor de HappyJTAG2 ha abandonado por mucho tiempo su creación (aparentemente con la llegada de AVR Studio 5 y Atmel Studio);
- algunas características de la conexión (COM4 o uno de los primeros 4 puertos seriales deben estar libres o ausentes, porque AVR Studio itera a través de COM1-COM4 en busca de un depurador). Es gratis o ausente , porque HappyJTAG2 funciona, por así decirlo, desde el interior.

Como puede ver, mostré tres formas, pero en la actualidad, solo dos de ellas me han ganado prácticamente. El primer método se describirá en este artículo. Lamentablemente, no pude repetir el segundo método. Necesita encontrar una combinación "compatible" de Proteus y AVR Studio. En la imagen se utiliza el último estudio AVR Studio 4.19.730 y Proteus 7.7 SP2. Érase una vez que usé este método, pero en presencia de un depurador de hierro para usarlo no tiene mucho sentido. Dejé el tercer método para la segunda parte. Allí necesitará un adaptador y una descripción de su conexión a las placas Arduino que admiten la depuración JTAG.

¿Y qué necesitamos para toda esta cocina? Primero debe olvidarse del miserable IDE de Arduino, solo se puede usar para verificaciones de control al ensamblar bocetos. A continuación, necesitaremos:

-Arduino-Makefile — Arduino;
— - C++ (Notepad++, VS20xx, Far, ...);
— Proteus 7.x — (-) ;
— (PuTTY, ZOC Pro), ;
— , - (VSPD, ...);
Arduino IDE 1.6.x ( avr-gcc);
WinAVR ( binutils , unix Windows);
avr gcc 4.9.2(el compilador es más reciente si no desea utilizar el que viene con el IDE de Arduino);
- AVR Studio 4.19.730 : la última versión del entorno de desarrollo de Atmel antes de cambiar a Visual Studio (solo se necesita para la segunda parte);
- HappyJTAG 2.45 (necesario solo para la segunda parte).

Asumiremos que usted sabe cómo preguntarle a Google dónde obtener toda esta granja. Por si acaso, proporcionaré enlaces útiles al final del artículo. Algunos comentarios sobre el kit de herramientas.

Como sabes, Proteus es pagado, pero esto no es lo más triste. Desafortunadamente, sus bibliotecas no son tan cercanas al mundo real como nos gustaría. Por ejemplo, no puede modelar el escudo de Ethernet W5100 en él (al menos en la versión 7.x). Por lo tanto, queridos seguidores de Arduino, sigan el camino verdadero. Solo la depuración y solo en hardware salvará a sus almas de las preguntas planteadas incorrectamente. Usaremos Proteus como herramienta de capacitación y en el campo, solo JTAG.

Depuración de bocetos de Arduino (AVR) en Proteus 7.x


Suficiente para palabras comunes, ahora específicas. Hay muchas opciones para comenzar el proceso de ensamblaje, no puede escribirlas todas, por lo que me concentraré en una y trataré de describirla claramente. Al ver el esquema general, puede aplicarlo a su conjunto de herramientas de desarrollo. Por conveniencia, desglosaré la descripción de todo el proceso en pasos, algunos se pueden omitir. Espero que incluso los usuarios más inexpertos de Arduino entiendan de qué se trata.

Paso 1 . Descargar Arduino. , 1.6.x. . , Arduino . , ( C# C++ , , C++/CLI, ). , , . , , Arduino , Serial.print() . .

, , , . , Arduino (C:\Arduino). makefile, «Program Files». , «Program Files» Windows — junction point . , , .

, , : C:\Program Files\Arduino.

2. y desempaquete el Arduino-Makefile. Descomprima el contenido de la carpeta Arduino-Makefile-master en C: \ Arduino-Makefile. Quiero señalar de inmediato que dentro hay un archivo README.md, que es mejor mirar github, donde se describen muchas cosas. También debe tomar nota del archivo arduino-mk-vars.md, que contiene una descripción de las variables utilizadas en el Makefile de usuario (proyecto).

Para que la utilidad make funcione, necesita el kit gnu bin utils, que era parte de WinAVR . Windows, . WinAVR utils, . , WinAVR ( avr-gcc, ).

, , c:\avr-gcc utils . PATH ( ) C:\avr-gcc\utils\bin:

set PATH=C:\avr-gcc\utils\bin;%PATH%

. , .. , .

3. Usted mismo sabe de dónde obtiene / compra Proteus [7.2 - 7.8]. ¿Por qué exactamente esta serie y tal intervalo de versiones? Debido a que los probé y aparentemente en proyectos simples, son bastante buenos. Las versiones anteriores a 7.8 no pudieron cargar el archivo de objeto de uno de mis proyectos en el IAR, y a continuación no lo intenté. El ocho está lleno de errores por ahora, tal vez alguien escriba algo sobre ella. Aquí tomaremos específicamente Proteus 7.8 SP2.

Paso 4 . Usando el artículo , cree un punto de unión en la carpeta con el entorno Arduino instalado, es decir. C: \ Arduino debe hacer referencia a C: \ Archivos de programa \ Arduino. Esto es necesario para no ser más sabio con el apoyo de espacios en archivos MAKE. Por lo tanto, sin copiar la carpeta con Arduino, obtuvimos una copia en el lugar correcto. Quien usa Far puede usar la combinación Alt + F6 en la carpeta.

Arduino. : C:\Arduino-Makefile\examples. (Notepd++, ...), . Arduino . Arduino Mega 2560 ATmega2560 ( , ).

Arduino, Example1 :

void setup()
{
DDRD |= ( 1 << DDD2 );
}

void loop()
{
PIND |= ( 1 << PIND2 );
}

, . Arduino 1.6.7 (ld.exe) , (, , ).

5. C:\Arduino-Makefile\examples\WebServer\Makefile : C:\Arduino-Makefile\examples\Example1. :

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

, Arduino.h ( , , ARDUINO_LIBS):

#include "Arduino.h"

void setup()
{
DDRD |= ( 1 << DDD2 );
}

void loop()
{
PIND |= ( 1 << PIND2 );
}

Makefile. , Example1, make ( Far', ), , , Arduino IDE . , - , , .

Makefile ARDUINO_QUIET = 1, Makefile. , . Makefile .

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


, , build-mega, Example1.elf — , . « » Proteus … .

6. Proteus. (dsn-) . — ATmega2560 , . . COMPIM , .



Debug\Start/Restart Debugging. , .



, , . Example1.ino, . , , - . Proteus.

7. . , . , , . , - ( COM4). COMPIM Proteus, (PuTTY). , , -.

8. avr gcc 4.9.2, AVR_TOOLS_DIR. avr-size, . , WinAVR ( Arduino).

, avr-size ( Arduino.mk):

avr_size = $(SIZE) $(SIZEFLAGS) --format=avr $(1)


:

1. Arduino IDE 1.6.x.
2. Arduino-Makefile.
3. WinAVR.
4. avr gcc 4.9.2.
5. Hard links . Windows.
6. PuTTY.
7. Notepad++.

Source: https://habr.com/ru/post/es390427/


All Articles