10 votos

¿Cómo puedo depurar un boceto de Arduino?

Empecé a codificar para Arduino hace muy poco. Y estos errores en el código me están matando. Como no hay depurador de hardware en el Arduino, serial.print() es mi único recurso. ¿Cuáles son los métodos/prácticas que implementas para depurar el código de Arduino?

0 votos

Por favor, eche un vistazo a playground.arduino.cc/Main/DevelopmentTools para las herramientas IDE y de depuración

8voto

Darren Newton Puntos 835

La modularidad es tu amiga. Escribe tu bucle principal para que haga lo suyo llamando a funciones, que llaman a funciones, ..., hasta el nivel en el que tus funciones serían simples. Comienza con el bucle principal y el siguiente nivel hacia abajo, haz funciones stub; ya sea vacías:

function foo(){
    ;
}

o falso:

function read_temperature(){
    return(95);
}

que no hacen nada más que devolver lo que el nivel que llama necesita para poder continuar. Cuando ese nivel funcione, descienda un nivel y comience a rellenar código simple que también llame a funciones stub. Poco a poco, vaya quitando una función a la vez hasta que tenga una aplicación que funcione.

Para depurar una función que devuelve un valor erróneo, o para crear una sin ninguna influencia del resto de tu aplicación, puedes construir un andamiaje - un simple sketch que simplemente alimente la función con algunos valores de ejemplo, y dentro de la función, imprimir los valores de los parámetros y algunos valores intermedios, hasta que obtengas alguna idea de qué parte de la función está fallando. Incluso he hecho funciones falsas que me piden en la terminal un valor a devolver. (Obviamente, esta técnica sólo puede funcionar si el sistema puede tolerar la velocidad relativamente glacial de nosotros los humanos). Otro uso para el andamiaje).

El "stubbing" funciona especialmente bien para sustituir a las funciones que interactúan con el hardware, lo que permite empezar a desarrollar la aplicación antes de tener que sumergirse en las hojas de datos, los problemas de sincronización y otras minucias (como, por ejemplo, no tener las piezas) que, de otro modo, podrían paralizar tu progreso.

Hablando de cuestiones de sincronización, alternar un pin de salida en un punto particular de su programa, como la entrada y salida de un ISR, le da una onda cuadrada en el pin de Arduino cuya frecuencia o ciclo de trabajo puede darle una idea de la sincronización interna de su programa. La forma directa de puerto-I/O, por ejemplo

PORTC ^= 0x01;

distorsionará menos la sincronización que si se llama a digitalWrite() . Es útil si tienes un 'scope' a mano, o uno de los DMMs con la capacidad de medir la frecuencia y/o el ciclo de trabajo.

Del mismo modo, puedes utilizar un pin de salida analógica para dar salida a un valor numérico a tu medidor desde dentro del programa sin perturbar demasiado la sincronización o inflar el código con las funciones de E/S en serie. Usa las formas de E/S directas aquí también.

6voto

user4245 Puntos 324

Uso Serial.print() y hago que los LEDs parpadeen.

Eso es prácticamente todo lo que puedes hacer.

Además, me aseguro de que el código sea legible y fácil de entender. Desglosa las cosas en pasos sencillos y crea funciones para cada paso, para que puedas ver la secuencia exacta de los acontecimientos.

5voto

Mark Turner Puntos 1452

3 Otras técnicas:

  • Construya la funcionalidad de un programa probando poco a poco en cada etapa, de esa manera sólo se enfrenta a un pequeño conjunto de errores a la vez.

  • Construir el programa alrededor de un intérprete de comandos para poder trabajar con secciones a la vez como en aquí .

  • Pulsa hacia fuera en momentos significativos y utiliza un visor.

3voto

El Micro visual para Visual Studio proporciona Depuración de Arduino . Incluye el rastreo del código fuente y la ruptura también permite que las expresiones y las variables sean "observadas" y/o modificadas.

enter image description here

1 votos

Tenga en cuenta que esto se hace a través de impresiones de serie generadas automáticamente insertadas en su código.

0 votos

Así es, excepto que las impresiones y lecturas de serie o wifi se insertan en una copia temporal del código, ¡no en el código real! Todo se explica claramente en los documentos de visualmicro.com y para los pocos que tienen depuradores de hardware (no suelen ser para Uno, etc) también son compatibles. Cada método tiene sus propias ventajas y desventajas.

0 votos

Desde Depurador para Arduino : "No permitía recorrer el código y se basaba en un código oculto insertado en su programa antes de la compilación para comunicarse con el depurador".

2voto

Avner Puntos 2065

Pasando de herramientas de lujo como ARM u otras plataformas (AVR, PIC con herramientas decentes) estoy de acuerdo en que las facilidades de depuración de Arduino son demasiado limitadas. Pero es una herramienta de arranque con una entrada baja.

Serial.print() es tu amigo. Para mi proyecto en particular (universidad), no tenía ningún LED conectado, así que Serial.print() es. Si quiero probar si el código se ejecuta correctamente a través de las declaraciones, por lo general pongo Serial.print("A"); , luego va a B, C, etc. o algo a través de la sección que estoy depurando. Comparo las letras de depuración con lo que espero que debería hacer.

Aparte de eso, no hay breakpoints ni paso de código. Arduino no es más que una placa con un chip AVR atmega, un gestor de arranque + entorno de desarrollo y una tonelada de librerías de software. Por desgracia, trabajar con un cargador de arranque limita las capacidades de depuración.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X