İşaretçiler için teşekkürler, markt ve chris-stratton. Yarı barındırma seçeneğinin oldukça basit olduğu ortaya çıktı. OpenOCD konsoluna mesaj gönderebilen birkaç basit günlük rutininin kaynağını bulmayı başardım. Onları buraya göndereceğim çünkü (i) çalışmak için bazı değişiklikler gerekli ve (ii) Bence bu bilgi yeni başlayan insanlar için bulmak çok kolay değil.
İlk olarak, D kodu burada kolayca aşağıdaki C fonksiyonu sağlamak üzere adapte edilir:
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");
}
OpenOCD konsoluna dize yazmak için send_command çağrısı örneği:
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);
İkincisi, burada yorumlarda verilen putChar işlevi iyi çalışır, ancak 0x03 önce bir '#' eklemek zorunda kaldım:
void put_char(char c)
{
asm (
"mov r0, #0x03\n" /* SYS_WRITEC */
"mov r1, %[msg]\n"
"bkpt #0xAB\n"
:
: [msg] "r" (&c)
: "r0", "r1"
);
}
Bu işlevlerden çıktıya bakmak için, önce OpenOCD'yi başlattım, sonra arm-none-eabi-gdb kullanarak aşağıdaki gibi bağlanıyorum:
target remote localhost:3333
monitor arm semihosting enable
monitor reset halt
load code.elf
continue
İletilerin GDB konsolunda değil, OpenOCD işleminin stdout'unda göründüğünü unutmayın.