Cảm ơn các con trỏ, markt và chris-stratton. Tùy chọn semihosting hóa ra khá đơn giản. Tôi quản lý để tìm nguồn cho một vài thói quen ghi nhật ký đơn giản có thể gửi tin nhắn đến bảng điều khiển OpenOCD. Tôi sẽ đăng chúng ở đây vì (i) họ yêu cầu một số sửa đổi để hoạt động và (ii) Tôi nghĩ rằng thông tin này không dễ tìm thấy đối với những người mới bắt đầu.
Đầu tiên, mã D ở đây dễ dàng được điều chỉnh để cung cấp chức năng C sau:
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");
}
Ví dụ về cách gọi send_command để viết một chuỗi vào bảng điều khiển 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);
Thứ hai, hàm putChar được đưa ra trong các nhận xét ở đây hoạt động tốt, ngoại trừ việc tôi phải thêm '#' trước 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"
);
}
Để xem kết quả đầu ra từ các chức năng này, trước tiên tôi khởi động OpenOCD, sau đó kết nối bằng arm-none-eabi-gdb như sau:
target remote localhost:3333
monitor arm semihosting enable
monitor reset halt
load code.elf
continue
Lưu ý rằng các thông báo xuất hiện trên thiết bị xuất chuẩn của quy trình OpenOCD, không phải trong bảng điều khiển GDB.