Grazie per i puntatori, markt e chris-stratton. L'opzione semihosting si è rivelata abbastanza semplice. Sono riuscito a trovare l'origine per un paio di semplici routine di registrazione che possono inviare messaggi alla console OpenOCD. Li pubblicherò qui poiché (i) hanno richiesto alcune modifiche per funzionare e (ii) penso che queste informazioni non siano super facili da trovare per le persone che hanno appena iniziato.
Innanzitutto, il codice D qui è facilmente adattabile per fornire la seguente funzione 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");
}
Esempio di chiamata send_command per scrivere una stringa sulla console 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);
In secondo luogo, la funzione putChar fornita nei commenti qui funziona perfettamente, tranne per il fatto che ho dovuto aggiungere un '#' prima di 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"
);
}
Per guardare l'output di queste funzioni, prima avvio OpenOCD, quindi mi collego usando arm-none-eabi-gdb come segue:
target remote localhost:3333
monitor arm semihosting enable
monitor reset halt
load code.elf
continue
Si noti che i messaggi vengono visualizzati sullo stdout del processo OpenOCD, non sulla console GDB.