ขอบคุณสำหรับพอยน์เตอร์, markt และ chris-stratton ตัวเลือกการส่งสัญญาณกลับกลายเป็นเรื่องที่ค่อนข้างตรงไปตรงมา ฉันจัดการเพื่อค้นหาแหล่งที่มาสำหรับสองสามขั้นตอนการบันทึกง่าย ๆ ที่สามารถส่งข้อความไปยังคอนโซล 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