Existen varias alternativas para realizar el debug. Cuando programamos para el escritorio la primera forma y la más sencilla para realizar el debug es por medio de impresiones a pantalla con instrucciones printf. Es la más sencilla pero también la más intrusiva.
En los sistemas embebidos, esto es totalmente distinto, porque de alguna forma le tenemos que comunicar eso que queremos mostrar a nuestra PC de desarrollo.
Aunque parezca fácil, necesitamos crear una infraestructura para soportar el envío de esa información a la PC, y podría llegar a ser demasiado intrusiva y consumir recursos innecesarios. Para ello los ARM Cortex ofrecen varias formas de realizar el debug, siendo los más comunes el JTAG y el SWD, soportados, ambos, por OpenOCD, el cual fue instalado siguiendo las instrucciones en la parte primera de este tutorial.
En esta primera entrega nos enfocaremos en como iniciar el proceso usando OpenOCD.
OpenOCD
Para ejecutar openOCD, es necesario pasarle como parámetro un archivo de configuración, por lo general estos archivos de configuración los encontramos dentro de /usr/local/share/opencd/scripts/boards, aunque no siempre vamos a encontrar la configuración de nuestra tarjeta, por lo que tenemos que copiar y modificar una existente.
Por ejemplo, para la tarjeta que estoy usando de ejemplo más el st-link v2, ese archivo de configuración quedaría de la siguiente forma.
Colocamos este archivo dentro del directorio del proyecto
Nota: En caso de que la tarjeta que tengamos este soportada, simplemente apuntamos openocd al lugar indicado.
En este momento ya tenemos preparado todo lo necesario para realizar nuestro primera sesión de debug, para este paso tenemos que abrir 3 terminales en el directorio del proyecto.
En la primera terminal ejecutamos
O en mi caso particular
Si todo ha ido bien veremos algo como
Uno de los aspectos que nos informa del MCU es la cantidad de breakpoints disponibles en el hardware.
Cuando veamos esa información, abrimos otra consola y ejecutamos
Salida
En estos momentos ya estamos preparados para tomar el control del MCU por medio de un reset halt
En la tarjeta presionamos el boton de reset
Con esto ya tenemos el control total del MCU y podemos observar el contenido de los registros del sistema con reg
Con help, obtenemos una lista detallada de los comandos disponibles
Enseguida abrimos una tercera terminal para ejecutar arm-none-eabi-gdb
Y nos enlazamos con el target remoto
Aunque probablemente quieran usar una GUI, por lo que tenemos varias alternativas, una de ellas es ddd, que está incluida en los repositorios de ubuntu y en lugar de
Hacemos un
En la siguiente entrega mostraré como imprimir secciones de memoria del MCU al igual que variables.