Table of Contents
voy a confesar Aunque printf
L. a. depuración de estilo tiene una mala reputación, me encuentro recurriendo a ella en ocasiones. Por supuesto, printf
es costoso y requiere mucho código, pero si tiene el espacio y el tiempo para usarlo durante los angeles depuración, siempre puede eliminarlo antes de que termine. Sin embargo, ¿qué pasa si no tiene un dispositivo de salida o lo está usando para otra cosa? Si está utilizando los angeles mayoría de los chips ARM modernos, tiene otra opción: un canal de salida dedicado que se u.s. para varias cosas, incluida los angeles salida de depuración. Decidí que quería probar eso en el mbed de Blackpill y descubrí que no es tan fácil como podría pensar. Pero es posible, y cuando termines de leer, también podrás hacerlo.
Estoy escribiendo esto usando el {hardware} ST-LINK específico de STM32. Si u.s. otros dispositivos JTAG como los angeles sonda BlackMagic, probablemente ya tenga esto configurado para usted.
Lo que obtienes
Comenzaré con el resultado ultimate, luego hablaré sobre el device, para que estés bien y motivado cuando llegues a los requisitos de {hardware}. Alerta de spoiler: es posible que su {hardware} existente necesite un truco rápido para que funcione, aunque puede comprar algo del estante si lo prefiere.
Aquí hay un programa de prueba muy easy:
SWO_Channel debugport; // calls for #come with "SWO.h" int major() { unsigned rely=0; debugport.printf("rnHello International from SWOrn"); debugport.printf("CPU SystemCoreClock is %d Hzrn", SystemCoreClock); whilst (1) { led = !led; // turn LED if output is correct ThisThread::sleep_for(fee); // sleepy time if (rely % 10) debugport.putc('*'); else debugport.printf("%drn",rely); rely++; } }
Nada difícil de imaginar aquí. Puedes usar putc
o printf
para escribir en los angeles salida de depuración. Como puede ver en los angeles figura, obtiene una bonita ventana que muestra toda los angeles salida. En realidad, hay 32 canales de salida, pero el canal 0 está reservado para los angeles salida de depuración. En este caso, elegí Todo porque de todos modos es lo único que sale del dispositivo.
Que necesitas
Primero, necesita un chip ARM appropriate. No todos los chips ARM son compatibles con ITM, Built-in Hint Macrocell, pero eso es lo que necesita. Habrá un pin en el dispositivo marcado como SWO (y probablemente también otras cosas). Como estoy usando Blackpill con un STM32F411CE, sabemos que debería funcionar y que el pin de salida será PB3.
También necesita un dongle ST-Hyperlink que tenga un pin SWO. Desafortunadamente, los baratos que parecen un dispositivo de memoria USB que normalmente obtienes no tienen el pin SWO. Sin embargo, puedes piratearlos fácilmente. El ST-Hyperlink V2 “completo” tiene el pin resaltado, pero suele ser mucho más caro. Sin embargo, si compras en las tiendas chinas habituales, normalmente puedes encontrar una a un precio razonable. Pagué menos de $10.
Por supuesto, también necesita algún tipo de herramienta para leer los angeles salida. Una terminal standard no lo hará, pero el STM32CubeProgrammer de ST puede leer fácilmente los datos. Por supuesto, también hay otras opciones. Muchos IDE y depuradores pueden leer los angeles salida SWO. También hay algunos herramientas de código abierto, pero los paquetes de Ubuntu son demasiado antiguos y los paquetes de lanzamiento no funcionaron. Sin embargo, construirlo desde cero funcionó.
Configuración del device
Como estoy usando Mbed, lo primero que hice fue buscar una biblioteca. no me decepcionó. L. a. biblioteca es un envoltorio delgado alrededor de las funciones de ITM en CMSIS, por lo que si no está utilizando Mbed, solo eche un vistazo a esas funciones y podrá resolverlo. Si prefiere STM32Duino, Mira esto para algo similar.
Una vez que lo agregué al proyecto, tuve que arreglar una pequeña cosa. Probablemente no importó, pero hay una instancia en los angeles que se asigna una matriz para un nombre de archivo y luego se elimina incorrectamente. Nota los angeles delete
en el siguiente código:
bool SWO_Channel::declare (FILE *move) { if ( FileBase::getName() == NULL) { error("declare calls for a reputation to be given within the instantiator of the SWO example!rn"); } //Upload '/' ahead of identify: char *trail = new char[strlen(FileBase::getName()) + 2]; sprintf(trail, "/%s", FileBase::getName()); if (freopen(trail, "w", move) == NULL) { // Failed, will have to no longer occur go back false; } delete [] trail; // mounted //No buffering setvbuf(move, NULL, _IONBF, 32); go back true; }
Una vez hecho esto, estás listo para irte. Solo necesitas algo de {hardware}.
configuración de {hardware}
Si tiene el dongle ST “standard” como el blanco en los angeles imagen a continuación, los angeles configuración es solo los angeles configuración standard. Conecte los angeles alimentación, los angeles tierra y los dos pines de depuración al conector posterior del Blackpill y luego pase un cable desde SWO al pin B4 en el dispositivo.
Si tiene uno de los clones baratos como el morado junto al dispositivo blanco, tendrá que hacer algunos cirugía para sacar un pin additional.
Cargue un programa que haga una salida SWO easy y luego encienda todo. Es posible que deba actualizar el firmware de ST-Hyperlink; el device STM32CubeProgrammer también puede hacerlo.
Al conectarme al {hardware} con el programador, descubrí que el dongle blanco no se conectaba de manera confiable a 4000 kHz, por lo que tuve que seleccionar 1800 kHz. Puede que solo sea ese dispositivo o mi cableado desordenado. Puede ver los angeles información de conexión que estoy usando en los angeles captura de pantalla adyacente. Presiona Conectar para comenzar.
Cuando seleccione el elemento SWV, deberá configurar un reloj de 96 MHz para esta configuración. Presumiblemente, si está ejecutando a una frecuencia diferente, conocerá el valor correcto para su configuración. Cuando presione Inicio, debería ver los angeles salida del programa.
Lo único que debe recordar es que su device peleará por el dongle a menos que se haya hecho funcionar en el modo “compartido”. En mi caso, a Mbed Studio no pareció importarle esa configuración, por lo que debe desconectarse si desea reprogramar el chip. Por supuesto, podrías usar el programador para hacer todo. Todo dependerá de tus herramientas y configuración.
Por supuesto, una vez que lo tiene funcionando una vez, es bastante fácil de replicar para proyectos futuros. Solo tiene un cable adicional y dos archivos adicionales en su programa.
Ir más lejos
Aunque puedes ir más allá. Primero, hay una salida colorida. Si su cadena de depuración contiene #RED#, #GRN# u #ORG#, los caracteres restantes estarán en ese colour (rojo, verde o naranja) para el resto de los angeles línea. Suponiendo, por supuesto, que el espectador lo entienda y lo tengas activado. Es útil poder mostrar mensajes importantes en rojo, por ejemplo.
Sin embargo, es un desperdicio que haya tantos canales adicionales que no estamos usando. Por ejemplo, ¿por qué no tener mensajes de progreso en el canal 0 e información detallada de depuración en el canal 1? Podría tener un volcado de lo que entra desde un dispositivo externo en el canal 5. Claro, podría escribir un prefijo en los angeles línea y extraer los datos de esa manera, pero esto es más divertido.
Reescribí una parte muy pequeña de los angeles clase SWO existente y, gracias a los argumentos opcionales, todavía funciona igual. L. a. única diferencia es que puede agregar un número de canal al constructor para que sea posible crear más de una secuencia de depuración:
SWO_Channel debugport; SWO_Channel dbg2("2nd",1);
Hay muy pocos cambios en el código, pero dejaré todo el proyecto en GitHub.
Si no puede decirlo, disfruto trabajar con STM32 y Mbed. Claro, puede obtener un mejor rendimiento eludiendo a Mbed, pero lo bueno es que puede hacerlo. Por extraño que parezca, enviar datos a través de un puerto a varios canales es algo que he hecho antes de una manera completamente diferente.
Pasaporte En Linea