Debugging Con OpenOCD Y GDB (Pt I)
Llegó el momento de sacar mayor provecho al programador de nuestra tarjeta y es que nos solo sirve para programar. ST-Link nos sirve para depurar nuestro programa, realizar cosas como ejecuciones paso a paso, colocar breakpoints, revisar el contenido de una variable o registro, etc.
Antes de empezar deberemos tener un proyecto con el cual trabajar, así que tomaremos el proyecto del post Primer Programa con CMSIS. Asegúrate de que compile sin errores ( puedes probarlo antes en la tarjeta ).
Bien, hora de conectarse a nuestra Nucleo-f072 usando OpenOCD
1 2 |
|
Wow!! Espera un segundo, mejor en vez de hacerlo de la manera tradicional, escribamos un archivo .cfg con las instrucciones para que OpenOCD se conecte. Si ya te conectaste solo presiona Ctrl+C
para desconectarte.
En la misma carpeta de tu proyecto crea el archivo openocd.cfg
1
|
|
Abre el archivo recién creado con tu editor de texto favorito y escribe lo siguiente
1 2 3 4 5 6 7 8 |
|
Ahora si, nos conectamos usando OpenOCD y el archivo que acabamos de crear.
1 2 |
|
Si tienes dudas de lo anterior, solo recuerda que lo explicamos en el anterior post Programando con OpenOCD.
Usando GDB
GDB es uno de los programas que vienen con tu compilador GNU ARM el cual instalaste en el primer post y basicamente nos servira para ejecutar nuestro programa de manera guiada por asi decirlo. Solo continua con las instrucciones y te daras cuenta a que me refiero.
Abrimos otra terminal y en ella ejecutaremos gdb invocando el archivo .elf que nos arrojó la compilación de nuestro proyecto ( Revisa la carpeta Output de tu proyecto )
1 2 |
|
gdb nos arrojará la siguiente información por pantalla.
1 2 3 4 5 6 7 8 9 10 11 |
|
En la terminal tendremos el prompt correspondiente a gdb el cual nos indica que se esta ejecutando y que podremos escribir un comando para poner en funcionamiento nuestro programa.
Lo primero que debemos hacer es conectarnos al puerto 3333 que tiene disponible OpenOCD
1 2 3 |
|
Ya conectado OpenOCD con GDB lo siguiente es cargar a la memoria del micro nuestro programa. Lo hacemos con el comando load
1 2 3 4 5 6 7 8 9 |
|
Aplicamos un reset para iniciar desde la primera dirección de nuestro programa
1 2 3 4 |
|
A partir de este punto podemos empezar la ejecución del programa que tiene en memoria el micro. Podemos simplemente poner a correr el programa, pero mejor le diremos que solo lo corra hasta cierto punto.
Insertaremos un breakpoint justo en la línea del programa que invierte el estado del led. Revisa tu archivo main.c
y fijate bien que numero de linea es donde se encuentra la instrucción GPIOA->ODR ^= (1 << LED_PIN);
. En gdb escribe. ( en nuestro caso es la línea 19 )
1 2 |
|
Ponemos a correr al micro con el comando c
de continue
1 2 3 4 5 6 |
|
Puedes observar en la terminal como gdb te indica que el programa se detuvo justo en la línea donde colocaste el breakpoint.
Vuelve a correr el programa con el comando c
y observaras de nueva cuenta que se detiene en el breakpoint, observa tu tarjeta y ve como cada que presionas el comando c
el led se invierte.
Puedes colocar mas breakpoints en diferentes lugares de tu código, solo no te olvides donde los pusiste, y si se te olvide solo escribe info break
1 2 3 4 |
|
Si quieres que el program no se detenga y se ejecute de manera continua tendrás que borrar el breakpoint. Lo puedes hacer con clear
1 2 |
|
En este caso el breakpoint estaba en el archivo main.c
, linea 19
Escribe c
para que tu program empiece a correr, ya sin ningun breakpoint que lo detenga. Mira como parpadea el led!!.
Para detener la ejecución de tu programa tendrás que ejecutar un Ctrl+C
. El programa se detendrá justo en la instrucción que estaba ejecutando. En nuestro caso fue el ciclo for
1 2 3 4 |
|
Para salir de gdb solo escribe q
, nos pedira confirmacion asi que tecleamos y
1 2 3 4 5 6 7 8 |
|
Que tal, a que no sabias que se podía hacer. Nah, probablemente si. Para terminar GDB es una herramienta muy buena para depurar y encontrar errores en tu programa cuando estas en la fase de desarrollo. Hay muchas cosas mas interesantes que se pueden hacer con gdb, pero eso lo veremos mas adelante.