संकेत के लिए धन्यवाद, निशान और क्रिस-स्ट्रैटन। सेमीहोस्टिंग विकल्प काफी सीधा था। मैं सरल लॉगिंग दिनचर्या के एक जोड़े के लिए स्रोत खोजने में कामयाब रहा, जो ओपनओसीडी कंसोल को संदेश भेज सकता है। मैं उन्हें यहाँ पोस्ट करूँगा क्योंकि (i) उन्हें काम करने के लिए कुछ संशोधन की आवश्यकता थी और (ii) मुझे लगता है कि यह जानकारी उन लोगों के लिए खोजना आसान नहीं है जो अभी शुरू कर रहे हैं।
सबसे पहले, यहाँ डी कोड आसानी से निम्नलिखित सी फ़ंक्शन प्रदान करने के लिए अनुकूलित है:
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 कंसोल को स्ट्रिंग लिखने के लिए send_command पर कॉल करने का उदाहरण:
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);
दूसरा, यहाँ टिप्पणियों में दिया गया पुष्ट कार्य ठीक काम करता है, सिवाय इसके कि मुझे 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 को शुरू करता हूं, फिर हाथ-कोई-ईबी-जीडीपी का उपयोग करके कनेक्ट करें:
target remote localhost:3333
monitor arm semihosting enable
monitor reset halt
load code.elf
continue
ध्यान दें कि संदेश OpenOCD प्रक्रिया के स्टॉपआउट पर दिखाई देते हैं, GDB कंसोल पर नहीं।