Terima kasih atas petunjuk, tanda dan chris-stratton. Opsi semihosting ternyata cukup mudah. Saya berhasil menemukan sumber untuk beberapa rutinitas logging sederhana yang dapat mengirim pesan ke konsol OpenOCD. Saya akan mempostingnya di sini karena (i) mereka memerlukan beberapa modifikasi untuk bekerja dan (ii) Saya pikir info ini tidak super mudah ditemukan bagi orang-orang yang baru memulai.
Pertama, kode D di sini mudah disesuaikan untuk menyediakan fungsi C berikut:
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");
}
Contoh memanggil send_command untuk menulis string ke konsol 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);
Kedua, fungsi putChar yang diberikan dalam komentar di sini berfungsi dengan baik, kecuali bahwa saya harus menambahkan '#' sebelum 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"
);
}
Untuk melihat output dari fungsi-fungsi ini, pertama-tama saya memulai OpenOCD, kemudian terhubung menggunakan arm-none-eabi-gdb sebagai berikut:
target remote localhost:3333
monitor arm semihosting enable
monitor reset halt
load code.elf
continue
Perhatikan bahwa pesan muncul di stdout dari proses OpenOCD, bukan di konsol GDB.