পয়েন্টার, মার্কেট এবং ক্রিস-স্ট্রাটনের জন্য ধন্যবাদ। সেমহোস্টিং বিকল্পটি বেশ সোজা হয়ে উঠল। আমি বেশ কয়েকটি সহজ লগিং রুটিনের উত্স সন্ধান করতে সক্ষম হয়েছি যা ওপেনওসিডি কনসোলে বার্তা প্রেরণ করতে পারে। আমি তাদের এখানে পোস্ট করব যেহেতু (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");
}
ওপেনওসিডি কনসোলে একটি স্ট্রিং লিখতে সেন্ড কম্যান্ডকে কল করার উদাহরণ:
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"
);
}
এই ফাংশনগুলি থেকে আউটপুটটি দেখতে, আমি প্রথমে ওপেনওসিডি শুরু করব, তারপরে আর্ম-নন-ইবি-জিডিবি ব্যবহার করে সংযোগ করব:
target remote localhost:3333
monitor arm semihosting enable
monitor reset halt
load code.elf
continue
নোট করুন যে বার্তাগুলি জিডিবি কনসোলে নয়, ওপেনওসিডি প্রক্রিয়াটির স্ট্যান্ডআউটে প্রদর্শিত হবে।