STM32F4: Depuración con OpenOCD de programas con múltiples hebras

Dentro de la serie de publicaciones relacionadas con la placa de desarrollo STM32F411-DISCOVERY, hoy os traemos un breve tutorial para activar la opción de soporte de RTOS del depurador OpenOCD, que es el que viene por defecto con el entorno de desarrollo SW4STM32. Esta opción facilita enormemente la depuración de programas en los que existen múltiples hebras corriendo en paralelo, ya que en cada paso nos proporciona información del estado de cada una de ellas. Esta técnica se conoce como thread awareness. Los sistemas operativos soportados por OpenOCD a día de hoy son: FreeRTOS, Linux, ChibiOS, embKernel, eCos, ThreadX, mqx y uCOS-III.

Para activar esta opción, que por defecto viene deshabilitada, debemos seguir los siguientes pasos:

1.- Editar el fichero stm32f4x.cfg, o el correspondiente a nuestro microcontrolador de la serie STM32, añadiendo la opción -rtos auto en la siguiente línea:

Este fichero se encuentra en la siguiente ruta:

 

2.- En Debug Configurations, en la pestaña de Startup, hay que cambiar la función donde se pone el breakpoint inicial al lanzar la depuración. Por defecto, esta función es main(), pero para que esta opción funcione correctamente, necesitamos que la función en la que pare sea posterior a la inicialización y puesta en marcha del sistema operativo, es decir, debe ser una función dentro de una hebra.

Figura 1. Captura de Debug Configurations. En este caso el punto de parada se pone en la función InitTask_main, que es la primera función de la primera hebra que se lanza.
Figura 1. Captura de Debug Configurations. En este caso el punto de parada se pone en la función InitTask_main, que es la primera función de la primera hebra que se lanza.

 

3.- Por último, al menos para el caso concreto de FreeRTOS, hay que añadir la siguiente línea en el fichero en el que se halle la función en la que hemos fijado el punto de parada anterior. En concreto, hay que colocarlo en las declaraciones globales, de forma que pueda ser leída por el depurador. De lo contrario, fallará al intentar parar la ejecución.

Esto se debe a que, en versiones anteriores de FreeRTOS, la variable uxTopUsedPriority contenía el máximo nivel de prioridad de las tareas, necesario al adquirir la información de las mismas. Esta variable cambió de nombre, pero los desarrolladores de OpenOCD aún no lo han corregido.

 

Una vez hayamos hecho todo lo anterior, al lanzar la depuración debemos poder ver todas nuestras hebras en la ventana de Debug.

Imagen 2. Captura de la ventana de Debug con el soporte de RTOS de OpenOCD activado.
Imagen 2. Captura de la ventana de Debug con el soporte de RTOS de OpenOCD activado.

 

Puede ser que, en ocasiones, sea necesario parar la ejecución antes de que se llegue a la función fijada en el punto 2, o pararla en cualquier momento antes del inicio del planificador del sistema operativo. En estos casos, será necesario revertir el argumento del paso 1 para desactivar el thread awareness, ya que si no lo hacemos OpenOCD fallará al intentar leer las hebras.