Danke für die Hinweise, Markt und Chris-Stratton. Die Semihosting-Option erwies sich als recht einfach. Ich konnte die Quelle für einige einfache Protokollierungsroutinen finden, die Nachrichten an die OpenOCD-Konsole senden können. Ich werde sie hier posten, da (i) sie einige Modifikationen für die Arbeit benötigten und (ii) ich denke, dass diese Informationen für Leute, die gerade erst anfangen, nicht sehr einfach zu finden sind.
Erstens kann der D-Code hier leicht angepasst werden, 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 einen String 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, da die putchar Funktion in den Kommentaren hier funktioniert gut, außer dass ich ein ‚#‘ hinzuzufügen , bevor 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"
);
}
Um die Ausgabe dieser Funktionen zu betrachten, 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 im Standard des OpenOCD-Prozesses und nicht in der GDB-Konsole angezeigt werden.