Спасибо за указатели, Маркт и Крис-Страттон. Вариант полухостинга оказался довольно простым. Мне удалось найти источник для пары простых процедур регистрации, которые могут отправлять сообщения на консоль OpenOCD. Я опубликую их здесь, так как (i) они требуют некоторой модификации для работы и (ii) я думаю, что эту информацию не так просто найти людям, которые только начинают работать.
Во- первых, D - код здесь легко приспосабливается предоставить следующую функцию 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");
}
Пример вызова send_command для записи строки в консоль 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);
Во- вторых, функция putChar дается в комментариях здесь работает отлично, за исключением того, что мне пришлось добавить «#» перед тем 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"
);
}
Чтобы посмотреть на вывод этих функций, я сначала запускаю OpenOCD, затем подключаюсь с помощью arm-none-eabi-gdb следующим образом:
target remote localhost:3333
monitor arm semihosting enable
monitor reset halt
load code.elf
continue
Обратите внимание, что сообщения появляются в stdout процесса OpenOCD, а не в консоли GDB.