Merci pour les pointeurs, Markt et Chris-Stratton. L'option de semi-hébergement s'est avérée assez simple. J'ai réussi à trouver la source de quelques routines de journalisation simples qui peuvent envoyer des messages à la console OpenOCD. Je les posterai ici car (i) ils ont nécessité quelques modifications pour fonctionner et (ii) je pense que cette information n'est pas super facile à trouver pour les personnes qui débutent.
Tout d'abord, le code D ici est facilement adapté pour fournir la fonction C suivante:
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");
}
Exemple d'appel de send_command pour écrire une chaîne dans la 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);
Deuxièmement, la fonction putChar donnée dans les commentaires ici fonctionne bien, sauf que j'ai dû ajouter un «#» avant 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"
);
}
Pour regarder la sortie de ces fonctions, je démarre d'abord OpenOCD, puis je me connecte en utilisant arm-none-eabi-gdb comme suit:
target remote localhost:3333
monitor arm semihosting enable
monitor reset halt
load code.elf
continue
Notez que les messages apparaissent sur la sortie standard du processus OpenOCD, pas sur la console GDB.