জিডিবি, ওপেনওসিডি এবং আর্ম-নন-ইবি-জিসিসি ব্যবহার করে আমি কীভাবে এসটিএম 32 আবিষ্কার বোর্ডের সাথে জিডিবি কনসোলে ডিবাগ বার্তা প্রিন্ট করব?


15

আমি ওপেনওসিডি, আর্ম-নন-ইবি-জিসিসি এবং জিডিবি ব্যবহার করে একটি এসটিএম 32 কর্টেক্স এম0 আবিষ্কার বোর্ড (32F0308 ডিসকভারি) প্রোগ্রাম করছি। আমি ভাবছিলাম এসডাব্লুডির মাধ্যমে ডিবাগ বার্তাগুলি লগ করার কোনও সোজা উপায় আছে কিনা। আমি সেমহোস্টিং বিকল্পটি পড়েছি, তবে মনে হয় এটির জন্য নতুনলিব বা অন্যান্য বড় লাইব্রেরিগুলিতে টানা দরকার। (কেবলমাত্র 64৪ কে ফ্ল্যাশ উপলব্ধ রয়েছে)) এসডাব্লুডিতে পাঠ্য লগ করার জন্য কি আর কোনও হালকা উপায় আছে, বা ইউআরটি একমাত্র ব্যবহারিক বিকল্পটি ব্যবহার করছে?


1
আমি আপনাকে সেমহোস্টিং বিকল্পটি ব্যবহার করার পরামর্শ দিচ্ছি। ইঙ্গিত দেওয়ার মাধ্যমে, এম 3/4 এর জন্য কুকক্স (একটি বিনামূল্যে উইন্ডোজ কর্টেক্স-এম পরিবেশ) প্রদত্ত লাইব্রেরিগুলি বেশ ন্যূনতম, তাদের একক-বাইট স্থানান্তর 17 বিধানসভা নির্দেশনা। তাদের সেমহোস্টিং এবং -O0 সহ একটি পুরানো (STM32F4) প্রকল্পের একটি পুনর্নির্মাণ কোড আকারে 48 বাইট যুক্ত করেছে।
16:38

আপনার লিঙ্কার অব্যবহৃত কোড স্ট্রিপিং নাও করতে পারে। বিকল্প হিসাবে, stlink সরঞ্জাম ড্রাইভিং জন্য টেক্সেনের গিথুব রেপো একটি সাধারণ মেলবক্সিং স্কিম আছে, যদিও আমি এখনও এটি চেষ্টা করে দেখিনি।
ক্রিস স্ট্রাটন

উত্তর:


15

পয়েন্টার, মার্কেট এবং ক্রিস-স্ট্রাটনের জন্য ধন্যবাদ। সেমহোস্টিং বিকল্পটি বেশ সোজা হয়ে উঠল। আমি বেশ কয়েকটি সহজ লগিং রুটিনের উত্স সন্ধান করতে সক্ষম হয়েছি যা ওপেনওসিডি কনসোলে বার্তা প্রেরণ করতে পারে। আমি তাদের এখানে পোস্ট করব যেহেতু (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

নোট করুন যে বার্তাগুলি জিডিবি কনসোলে নয়, ওপেনওসিডি প্রক্রিয়াটির স্ট্যান্ডআউটে প্রদর্শিত হবে।


1
একটি ত্রুটি রয়েছে, আকার () এর স্ট্রেন () হওয়া উচিত।

1
ধন্যবাদ ব্যবহারকারী 107642। আসলে মাপের ব্যবহার এখানে সম্ভব যদি 's' বিন্দুর পরিবর্তে অ্যারে হয়, তাই আমি সেভাবে এটি পরিবর্তন করেছি।
ভাঁজ করুন

দুর্দান্ত উত্তর! এছাড়াও আপনি লিখতে পারেন putcharএর মত সহজvoid putchar(char c) { send_command(3,&c); }
mvds

1
"আকার" স্ট্রিংয়ের পেছনের \ 0 গণনা করবে, তবে স্ট্রেলেন তা করবে না। ওপেনোকড যদি কেবল স্টডআউট এবং এক্সটার্ম টার্মিনাল উইন্ডোতে প্রিন্ট করে তবে সম্ভবত এটি একটি উল্লেখযোগ্য পার্থক্য তৈরি করবে না কারণ সম্ভবত টার্মিনাল এটিকে উপেক্ষা করবে। তবে আপনি যদি কোনও ফাইলে জিনিস রাখেন তবে আমার মনে হয় আপনি সেখানে এই শূন্যগুলি খুঁজে পেয়ে অবাক হবেন। বা প্রোটোকলটি উল্লেখ করে যে আপনার পিছনের টার্মিনেটরের সাথে স্ট্রিং প্রেরণ করা দরকার?
ব্যবহারকারী 242579

আহ, ভাল পয়েন্ট ব্যবহারকারী 242579। আমি পিছনে থাকা account 0 টি অ্যাকাউন্টে নিতে '-1' যুক্ত করেছি।
ভাঁজ করুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.