Autor Tema: ¿Cómo hacer Debug de programas?  (Leído 3404 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
¿Cómo hacer Debug de programas?
« en: 26 de Abril de 2017, 04:49:52 »
Yo suelo probar los programas y solucionar errores en ellos (Debug) con dos herramientas muy básicas.

1. Activar pines de salida.
Esta opción es muy rápida, prácticamente no consume tiempo (uno o dos ciclos de instrucción) y se implementa con relativa rapidez.
Tiene el inconveniente de necesitar un osciloscopio (o un multímetro según el caso) y varios cambios en el programa que hay que enviar al microcontrolador (reprogramar) y que al final hay que retirar del programa.

2. Usar printf por el puerto serie
Esta opción se parece a la anterior, pero permite enviar mucha más información.
Como desventaja es muy lenta, por lo que no sirve para hacer debug en tiempo real.
Cuando necesito tiempo real, suelo almacenar resultados intermedios en una tabla con un puntero (relativamente rápido) y al final de la rutina vuelco todos los datos a la UART.

Otra ventaja importante de estos dos métodos es que se pueden implementar en todos los microcontroladores, independientemente del programador, del microcontrolador o del software de desarrollo disponible.




Se que existen debugers mucho más sofisticados y los he usado en ocasiones para programar el PC, pero por ahora no los he necesitado para los microcontroladores.


¿Puede darme alguien su opinión sobre los debugger para microcontroladores? ¿Merece la pena el esfuerzo de comenzar a usarlos?
A ser posible me gustaría que conociese bien y utilizase todas las formas de debug (incluídas las de activar pines y usar printf).

Un saludo.
« Última modificación: 26 de Abril de 2017, 04:52:02 por Picuino »

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2976
Re:¿Cómo hacer Debug de programas?
« Respuesta #1 en: 26 de Abril de 2017, 05:00:20 »
Hola picuino, en mi opinion es muchisimo mejor un debugger completo con sus puntos de ruptura, la capacidad de meter datos en la memoria, de cambiar registros, etc etc. No es necesario un jtag, eso es demasiado pero uno por swd mucho mejor que activar pines.

Lo de printf, se usa mas que nada para sistemas operativos como la rbp2 y esas cosas donde no queremos poner un jtag.

Sin lugar a dudas lo mejor es debuguear desde el propio IDE.

En cuanto al esfuerzo,  no hay ningun esfuerzo, no tienes que aprender nada ni implementar un printf ni poner salidas en alto ni nada. La mayoria de las veces pones el punto donde quieres que se pare el programa y listo, no tiene mas es supersencillo.

Un saludo
« Última modificación: 26 de Abril de 2017, 05:09:38 por juaperser1 »
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re:¿Cómo hacer Debug de programas?
« Respuesta #2 en: 26 de Abril de 2017, 06:08:50 »
Gracias juaperser, pero muchas veces no quiero que el programa se pare, sino ver como funciona en directo.
Por ejemplo para saber cuanto tiempo de respuesta tiene una interrupción o cuántas veces salta por segundo.

¿Es útil también en esos casos?

Un saludo.

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2976
Re:¿Cómo hacer Debug de programas?
« Respuesta #3 en: 26 de Abril de 2017, 06:35:36 »
Puedes hacerlo correr sin breakpoint y darle a pausa cuando tu quieras y revisar los registros.

¿quieres ver cuantas veces entra en una interrupción? pues colocas un contador y cuando le des a pausa pues miras a ver a cuanto esta.

¿el tiempo de una interrupción? pues activas un timer y cuando salga de la interrupción revisas el tiempo vas a tener el tiempo que tarda de una manera muy precisa.

un saludo

Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re:¿Cómo hacer Debug de programas?
« Respuesta #4 en: 26 de Abril de 2017, 06:55:45 »
Gracias juaperser, pero muchas veces no quiero que el programa se pare, sino ver como funciona en directo.
Por ejemplo para saber cuanto tiempo de respuesta tiene una interrupción o cuántas veces salta por segundo.

¿Es útil también en esos casos?

Un saludo.

Eso también lo puedes hacer con el micro parado como dice juanjo. De todas formas si quieres depurar con el micro corriendo lo que necesitas es un emulador (emula el micro en una fpga) no un depurardor. Baratos no son, ejemplo:

http://www.microchipdirect.com/ProductSearch.aspx?Keywords=DV244005

Saludos!
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re:¿Cómo hacer Debug de programas?
« Respuesta #5 en: 26 de Abril de 2017, 08:16:49 »
Eso del emulador es demasiado. Da mucho trabajo y no hace falta tanto.

Por ejemplo el último problema con el que he tenido que hacer debug es de tiempos no deterministas.

Una interrupción captura datos de entrada y los deja disponibles en un buffer.
El master tiene que esperar un tiempo hasta que el slave haya ejecutado los comandos enviados a su buffer antes de enviar otra instrucción. Enviar un comando tarda como mínimo 200us (dirección de slave + byte). No merece la pena implementar un protocolo porque el tiempo medio para ejecutar los comandos está entre 100us y unos 250us y tardaría más un envío de datos por el bus que hacer una simple espera.
El problema es que en ocasiones los comandos rápidos (cada 200us) pueden pisarse unos a otros si la ejecución del anterior dura más de 200us.

En el slave, una rutina se ejecuta cíclicamente y hay que determinar en la práctica cuál es el tiempo máximo que tarda en ejecutar los comandos más lentos que pueda recibir.

Lo que hice en la práctica es dar un pulso por un pin de salida cada vez que el microcontrolador slave entraba en la rutina de decodificación y ejecución de comandos. El pin lo conecté a un osciloscopio con ventana de tiempo para que solo mostrase pulsos separados más de 200us y empecé a enviar desde el master todas las instrucciones que me parecían más lentas o que podian ocupar más al microcontrolador.
Al final medí el tiempo máximo y añadí un margen de tiempo de seguridad.

En este caso es importante que el debuger no cargue al microcontrolador con más trabajo para no alterar los tiempos de ejecución.


¿Me ayudaría un debugger a hacer este tipo de trabajo sin un emulador?

Un saludo.
« Última modificación: 26 de Abril de 2017, 08:20:36 por Picuino »

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2976
Re:¿Cómo hacer Debug de programas?
« Respuesta #6 en: 26 de Abril de 2017, 10:29:54 »

¿Me ayudaría un debugger a hacer este tipo de trabajo sin un emulador?


Ummm, ahi esta un poco mas complicada la cosa, yo para esos casos (parecidos) he usado a parte del debug un osciloscopio o un analizador lógico.
aunque para ese caso quizá no te valga solo con el debug.

Lo bueno yo creo que es utilizar la herramienta que mas te convenga o incluso mas de una a la vez, que este leyendo datos por printf no quiere decir que no uses el debug,
puedes hacerlo todo y monitorizarlo de distintas maneras.

un saludo
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re:¿Cómo hacer Debug de programas?
« Respuesta #7 en: 26 de Abril de 2017, 10:55:47 »
Yo te recomiendo un debugger también aunque tengas que utilizarlo junto a otras herramientas. El método de printf es muy sacrificado y lento. Si estás en un Linux, no te quieres calentar la cabeza con el jtag y no te importan los tiempos tira que va... pero para un microcontrolador...buuff. Ni que decir tiene que además te restringe el uso de optimizaciones...
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:¿Cómo hacer Debug de programas?
« Respuesta #8 en: 26 de Abril de 2017, 11:35:40 »
Antes de leer la problematica de Picuino:

Despues de leer sobre Unit Testing solo me quedo que el debug es malo en si... La idea es sacarse todo de encima desde antes de llegar a la parte del microcontrolador.
Esto exige un cambio bastante radical en la forma de programar, ya que uno debe hacer el test y luego escribir el codigo para ese test, a pesar que estoy o intento implementarlo siempre termino haciendo el codigo y luego haciendo un test.

Pero esta bueno porque como decia, uno debe esperar ciertas cosas, y pone el pedazo de codigo a prueba para que eso ocurra. El unico Unit testing que pude hacer funcionar es Cmocka en Eclipse.

Despues de leer el problema que tiene:

Aunque para el problema que presentas no hay mejor solucion mas que emularlo, por suerte MPLABX te permite emular el micro y decirte exactamente cuantos ciclos consume. Pero no en los demas IDE/compiladores. Esto si no queres gastar una salida/entrada mas para avisar que ya esta listo.

La otra es que el Master haga un poll al Esclavo para ver su estado, pero como decis es mayor el tiempo de envio que de espera. Pero esto no puede ser tan "loco" si es que esperas que el esclavo deba responder, si pensas que dura 200us el envio completo. Y tenes comandos de entre 150 y 250us de ejecucion, si tenes el de 150 para cuando termine ya va a responder el micro con que esta listo. Y si esta ejecutandose el de 250 ya estas enviando tu comando. Entonces el peor caso seria que la ejecucion dure 201us o proximo a este.

Si tu esclavo NO debe responder entonces ya el protocolo es malo. Tal ves es mejor actuar con un poll de una entrada. Pero esto es absurdo en el sentido de si queres actuar sobre varios esclavos.

Como decia lo mejor es un emulador, PC o un hardware dedicado y obtener los ciclos de ejecucion,
La otra seria Implementar una respuesta del esclavo y sacarte la necesidad del debugger.
Y por ultimo dependiendo del micro podes utilizar un debugger para contar la cantidad de ciclos que transcurrieron. El nucleo ARM posee un "modulo" para esto.
http://stackoverflow.com/questions/32610019/arm-m4-instructions-per-cycle-ipc-counters
« Última modificación: 26 de Abril de 2017, 12:02:14 por KILLERJC »

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re:¿Cómo hacer Debug de programas?
« Respuesta #9 en: 26 de Abril de 2017, 11:43:26 »
Bien, llegados a este punto ¿Qué debugger emplear y qué necesita para funcionar?

1. En PIC imagino que será suficiente con el MPLAB X + Pickit 3


2. En AVR (Atmega328, Attiny, etc)
¿Se puede utilizar Eclipse? (el entorno de Atmel no me gusta, aunque creo que es un Eclipse modificado)
¿Hace falta algún programador especial? (Yo tengo un simple USBASP)


3. En ST necesitaré Eclipse + Programador
¿Es suficiente con el programador de la placa discovery?


Y la pregunta del millón ¿se puede hacer algún tipo de debug desde línea de comandos?
Con la UART se pueden automatizar algunas tareas con Python Serial, aunque ráramente lo utilizo.

Un saludo.

P.D. Estoy acostumbrado a programar con un simple editor de textos y compilar en línea de comandos, así que no estoy acostumbrado a los IDE y eso es otro problema. Tengo que aprender a utilizarlos. Prefiero manejarme solo con Eclipse porque está muy difundido y no espero que vaya a cambiar con facilidad.
He manejado hace poco Eclipse para programar Java y al final lo dejé de lado para evitar problemas y me pasé a línea de coamndos y compilación con Maven, de manera que podéis haceros una idea de dónde parto.

« Última modificación: 26 de Abril de 2017, 11:49:21 por Picuino »

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2976
Re:¿Cómo hacer Debug de programas?
« Respuesta #10 en: 26 de Abril de 2017, 11:53:12 »
1- Si, aunque tienes los breakpoint limitados, cosa que no pasa con el icd3

2- Se puede usar eclipse. Yo nunca he probado atmel en eclipse así que no te puedo decir mas nada.

3- en st con el propio programador de la discovery se puede, no hay problema.

Se que hay algunos entornos de desarrollo donde se puede hacer facilmente, lo he visto para micros con mas de un nucleo, pero desconozco si se podra hacer con los micros estos desde el propio depurador.

Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:¿Cómo hacer Debug de programas?
« Respuesta #11 en: 26 de Abril de 2017, 12:17:55 »
Citar
Y la pregunta del millón ¿se puede hacer algún tipo de debug desde línea de comandos?

Si logras configurar el GDB con OpenOCD si seria desde la linea de comandos (Linux).. Pero no se si es posible implementarlo.
Pero esto significa renegar BASTANTE si es que no tenes idea de eclipse + GDB, y te aconsejaria ir por directamente el debugger grafico.

Citar
1. En PIC imagino que será suficiente con el MPLAB X + Pickit 3

Dependiendo del micro si lo podes simular aun mejor.

Citar
2. En AVR (Atmega328, Attiny, etc)
¿Se puede utilizar Eclipse? (el entorno de Atmel no me gusta, aunque creo que es un Eclipse modificado)
¿Hace falta algún programador especial? (Yo tengo un simple USBASP)

Por lo que tengo entendido el USBASP es programador solo.
« Última modificación: 26 de Abril de 2017, 12:22:07 por KILLERJC »

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:¿Cómo hacer Debug de programas?
« Respuesta #12 en: 26 de Abril de 2017, 13:04:11 »
EDITO: Me parece que mezclé un poco este tema con el otro de ARM  :?

Picuino, ten en cuenta que inicializar un uC con arquitectura ARM no es nada parecido a inicializar un PIC o un AVR.
Siempre que quieras arrancar a programar vas a necesitar un archivo de inicializacion, generalmente en ASM que te provee el mismo fabricante y te preconfigura el IDE con ese archivo y las referencias a las librerías que muy probablemente vas a utilizar.
En un principio ARM te daba las CMSIS, un conjunto de headers y algún que otro fuente con los nombres y sus direcciones de todos los registros del micro. Con eso solo uno se podía manejar bastante bien a nivel registros. Luego cada fabricante comenzó a desarrollar sus librerías.
Con la potencia que tienen estos micros es mucho más común usar librerías que registros. Contrario a lo que pasa con los uC de 8 bits. Entonces la eleccion de librería para trabajar es muy importante tambien. Sé que es agregar más lío al lío que seguro tendras en tu cabeza, pero solo quería dejarlo comentado acá para que cuando releas estos post lo recuerdes.

Yo te digo lo que para mí es el camino más rápido al mundo de loa ARM. Comprate cualquiera placa de desarrollo de ST, incluso las nucleo con micros chicos (F030, F103) cuestan monedas y tienen todo lo que necesitas para arrancar.
Bajate el systemworkbench, el IDE gratuito (windows y linux) de ST (Es de un terecero pero esta bancado por ST), bajate el CubeMX y las librerías HAL que correspondan a la placa de desarrollo que tenes (El cubeMX las descargará solo al momento de generar el codigo). Luego con esas dos herramientas, el CubeMX y el SW ya tienes todo para arrancar. El cubemx te permite configurar de forma gráfica los periféricos y el reloj y te genera el proyecto con su código para el SW. En el SW abres el proyecto y le agregas tus lineas de codigo para encender el led que trae la plaquita, hacerlo destellar y lo que quieras.
Eso te puede llevar alguna horita de ensayos. Podrás debuguear, ejecutar linea por linea, etc.
para mi es fundamental cuando arrancas con algo nuevo poder dar pasos firmes y seguros. Mas o menos igual a lo que comentamos alguna ves cuando arrancaste con GIT.
Ahí fueron mis 5 centavos!

Saludos
-
Leonardo Garberoglio

Desconectado Jorge555

  • PIC18
  • ****
  • Mensajes: 496
    • JMN
Re:¿Cómo hacer Debug de programas?
« Respuesta #13 en: 26 de Abril de 2017, 13:11:36 »
Atmel tiene un debugger que se integra en su ide y que vale para debuggear y programar sus microcontroladores, cuesta menos de 100 euros si recuerdo bien:

http://www.atmel.com/tools/jtagice3.aspx

Yo lo uso y me parece una herramienta fundamental a tener cuando se trabaja con microcontroladores, poder ejecutar las instrucciones una a una, ver el valor de las variables y registros, etc.. Aunque paras la ejecución de la alu pero no la del resto de periféricos, por lo que mientras está parada si hay un timer contando pues seguira contando, vamos que no se para el reloj del sistema.

Si estas buscando ARMs con los que empezar, como dices en el otro hilo, tienes placas de desarrollo muy baratas que constan de un debugger (que puedes usar para programar micros externos) y un microcontrolador que programar, creo que esta es la opción más barata de empezar, y a partir de ahí ir viendo decidir.

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re:¿Cómo hacer Debug de programas?
« Respuesta #14 en: 26 de Abril de 2017, 15:56:54 »
Juanjo: todos los micros tienen los BPs limitados sea cual sea el debugger (otra cosa es un emulador). Lo que pasa es que cuando se quedan sin BPs "nativos" te "hardcodean" más en el propio código de la flash. ¿esto no lo hace PK3?. Hace siglos que no lo uso...

Saludos!
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -