Estoy programando una placa de descubrimiento STM32 Cortex M0 (32F0308DISCOVERY) usando OpenOCD, arm-none-eabi-gcc y gdb. Me preguntaba si hay alguna forma sencilla de registrar mensajes de depuración a través de SWD. He leído sobre la opción de semialojamiento, pero esto parece requerir la extracción de newlib u otras bibliotecas grandes. (Solo hay flash de 64k disponible). ¿Hay alguna forma más liviana de registrar texto a través de SWD, o usar el UART es la única opción práctica?
Gracias por los consejos, markt y chris-stratton. La opción de semihosting resultó ser bastante sencilla. Logré encontrar la fuente de un par de rutinas de registro simples que pueden enviar mensajes a la consola OpenOCD. Los publicaré aquí ya que (i) requirieron algunas modificaciones para funcionar y (ii) creo que esta información no es muy fácil de encontrar para las personas que recién comienzan.
Primero, el código D aquí se adapta fácilmente para proporcionar la siguiente función C:
void send_command(int command, void *message)
{
asm("mov r0, %[cmd];"
"mov r1, %[msg];"
"bkpt #0xAB"
:
: [cmd] "r" (command), [msg] "r" (message)
: "r0", "r1", "memory");
}
Ejemplo de llamar a send_command para escribir una cadena en la consola de OpenOCD:
const char s[] = "Hello world\n";
uint32_t m[] = { 2/*stderr*/, (uint32_t)s, sizeof(s)/sizeof(char) - 1 };
send_command(0x05/* some interrupt ID */, m);
En segundo lugar, la función putChar dada en los comentarios aquí funciona bien, excepto que tuve que agregar un '#' antes de 0x03:
void put_char(char c)
{
asm (
"mov r0, #0x03\n" /* SYS_WRITEC */
"mov r1, %[msg]\n"
"bkpt #0xAB\n"
:
: [msg] "r" (&c)
: "r0", "r1"
);
}
Para ver el resultado de estas funciones, primero inicio OpenOCD, luego me conecto usando arm-none-eabi-gdb de la siguiente manera:
target remote localhost:3333
monitor arm semihosting enable
monitor reset halt
load code.elf
continue
Tenga en cuenta que los mensajes aparecen en la salida estándar del proceso OpenOCD, no en la consola GDB.
putchar
tan simple comovoid putchar(char c) { send_command(3,&c); }
mercado
chris stratton