Ich programmiere ein STM32 Cortex M0 Discovery Board (32F0308DISCOVERY) mit OpenOCD, arm-none-eabi-gcc und gdb. Ich habe mich gefragt, ob es eine einfache Möglichkeit gibt, Debug-Meldungen über SWD zu protokollieren. Ich habe über die Semihosting-Option gelesen, aber dies scheint das Einziehen von Newlib oder anderen großen Bibliotheken zu erfordern. (Es ist nur 64k-Flash verfügbar.) Gibt es eine einfachere Möglichkeit, Text über SWD zu protokollieren, oder ist die Verwendung des UART die einzige praktische Option?
Danke für die Hinweise, Markt und Chris-Stratton. Die Semihosting-Option erwies sich als recht einfach. Ich habe es geschafft, die Quelle für ein paar einfache Protokollierungsroutinen zu finden, die Nachrichten an die OpenOCD-Konsole senden können. Ich werde sie hier posten, da (i) sie einige Änderungen erforderten, um zu funktionieren, und (ii) ich denke, dass diese Informationen für Leute, die gerade erst anfangen, nicht sehr einfach zu finden sind.
Zunächst wird der D-Code hier leicht angepasst, um die folgende C-Funktion bereitzustellen:
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");
}
Beispiel für den Aufruf von send_command, um eine Zeichenfolge in die OpenOCD-Konsole zu schreiben:
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);
Zweitens funktioniert die hier in den Kommentaren angegebene putChar-Funktion einwandfrei , außer dass ich vor 0x03 ein '#' hinzufügen musste:
void put_char(char c)
{
asm (
"mov r0, #0x03\n" /* SYS_WRITEC */
"mov r1, %[msg]\n"
"bkpt #0xAB\n"
:
: [msg] "r" (&c)
: "r0", "r1"
);
}
Um die Ausgabe dieser Funktionen zu sehen, starte ich zuerst OpenOCD und verbinde mich dann mit arm-none-eabi-gdb wie folgt:
target remote localhost:3333
monitor arm semihosting enable
monitor reset halt
load code.elf
continue
Beachten Sie, dass die Meldungen auf der Standardausgabe des OpenOCD-Prozesses erscheinen, nicht auf der GDB-Konsole.
putchar
so einfach schreibenvoid putchar(char c) { send_command(3,&c); }
Markt
Chris Stratton