ARM, RASPBERRY PI رسپبری, پروژه های سیسوگ, توصیه شده, مقاله

آموزش برنامه‌نویسی با رزبری پای بدون سیستم‌عامل – قسمت سوم

کامپایلر

در مقاله دوم آموزش رزبری پای، به معرفی ساختار CPU نحوه اجرای برنامه در رزبری پای پرداختیم. در این مقاله قصد داریم نحوه نصب و کانفیگ ابزارهای لازم جهت کامپایل کدهای نوشته‌شده برای بردهای رزبری پای را آموزش دهیم.

همان‌طور که قبلا توضیح دادیم، پلتفرم سخت‌افزاری رزبری پای مبتنی بر پردازنده های ARM است و نمی‌توان از کامپایلرهای x86 مثل ویژوال استودیو برای کامپایل کدهای زربری استفاده کرد.

برای آشنایی با ابزارهای لازم و نحوه نصب و کانفیگ آن‌ها با سیسوگ همراه باشید.

معرفی کامپایلر‌های موجود:

واضح است برای تبدیل کدهای نوشته‌شده به بیت کدهای قابل‌فهم توسط پردانده، نیاز به ابزاری است که اصطلاحاً به آن کامپایلر می‌گویند. کامپایلری که برای تبدیل کدهای رزبری پای موردنیاز است باید قابلیت کامپایل برای پلتفرم ARM را داشته باشد. کمپایلرهای زیادی وجود ندارند که دارای چنین قابلیتی باشند. کامپایلر هایی که قادر به پشتیبانی پلتفرم ARM باشند، (معروف‌ترین آن‌ها) به شرح زیر هستند:

  1. ARM Keil
  2. ARM IAR
  3. GCC

بله، تقریبا همین سه مورد! ممکن است فکر کنید که خب Atmel Studio یا CooCox و خیلی از ایزار های دیگر قابلیت کامپایل برای ARM را دارند ولی باید خاطرنشان کنم که هم‌اکنون در خصوص کامپایلر صحبت می‌کنیم و موارد ذکرشده فقط ویرایشگر کد هستند و خود دارای کامپایلر نیستند. به‌عنوان نمونه SEGGER Embedded Studio و حتی Atmel Studio از GCC استفاده می‌کنند.

از چه کامپایلری استفاده کنیم؟

تصمیم‌گیری در خصوص کامپایلر مورداستفاده با توجه به لیست معرفی‌شده چندان دشوار نیست. کامپایلر Keil و IAR هردو غیر رایگان هستند و برای استفاده از آن‌ها باید لایسنس آن‌ها را خریداری کرد. ما در سیسوگ سعی می‌کنیم که به معرفی و استفاده از ابزارهای متن‌باز و رایگان بپردازیم. با توجه به پولی بودن کامپایلرهای Keil و IAR از آن‌ها چشم‌پوشی کرده و آموزش‌های خود را بر اساس کامپایلر رایگان GCC ادامه می‌دهیم.

اما در نظر داشته باشید که انتخاب کامپایلر رایگان GCC از روی ناچاری نیست. یکی از دلایل انتخاب این کامپایلر، انعطا‌ف‌پذیری زیاد و برتری آن نسبت به کامپایلر Keil است. شاید نتوان گفت که از IAR قوی‌تر است اما به جرئت می‌توان گفت که چیزی از آن کم ندارد و عملکردی بسیار نزدیک به یکدیگر دارند.

کامپایلر GCC چنان قدرتمند است که حتی ARM Keil امکان استفاده از آن را در محیط خود، به کاربر می‌دهد و کاربر می‌تواند بسته به نیاز از ویرایشگر Keil و کامپایلر GCC استفاده کند.

از طرفی رایگان و متن‌باز بودن کامپایلر GCC، باعث شده است که افراد زیادی در سراسر جهان از آن استفاده کنند و در بهینه‌سازی این کامپایلر مشارکت داشته باشند. با توجه به طیف وسیع استفاده‌کننده‌های این کامپایلر، اگر احیاناً در قسمتی دچار مشکل شدید به‌راحتی با جستجو در اینترنت می‌توانید  منشأ مشکل را پیدا و آن را حل کنید. از طرفی بیشتر سورس‌های منتشرشده، با استفاده از این کامپایلر انجام شده‌اند.

چگونگی نصب کامپایلر GCC:

نصب و راه‌اندازی GCC کار پیچیده ای نیست و به‌راحتی قابل انجام است. اگر از لینوکس استفاده می‌کنید، لبخند بزنید چرا که برای نصب و پیکر‌بندی کافی ست فقط خط زیر را در ترمینال تایپ کنید:

دقت داشته باشید که دستور فوق برای نصب بر روی توزیع‌های مبتنی بر دبیان است.

اما کاربران ویندوز نیاز است که یکی دو مرحله بیشتر طی کنند. ولی جای نگرانی نیست. مراحل خیلی ساده هستند و می‌توان به‌راحتی آن‌ها را انجام داد.

در مرحله اول با مراجعه به سایت GCC ARM Embedded ، آخرین نسخه مبتنی بر ویندوز خود را دریافت کنید.

نکته : دقت کنید که حتما نسخه نصبی را دانلود کنید. 

بعد از دانلود فایل نصبی کامپایلر GCC، به‌راحتی مثل نصب دیگر نرم‌افزار‌‌ها، مطابق ویدئو زیر کافی ست که بر روی دکمه Next کلیک کنید تا کار نصب خودکار انجام شود:

 

بعد از تمام شدن مراحل نصب، برای بررسی نصب صحیح می‌توان دستور زیر را در خط فرمان (Command Prompt ویندوز یا ترمینال لینوکس) وارد کرد:

در صورت نصب صحیح برنامه‌های موردنیاز، با اجرای دستور فوق، خروجی مطابق زیر خواهد بود:

این خروجی یعنی تمام کارهای مربوط به نصب و پیکربندی به‌درستی انجام شده است.

نوشتن اولین برنامه

همیشه سخت‌ترین قسمت کار، نوشتن اولین برنامه است؛ چرا که پارامترهای زیادی وجود دارد که ممکن است در کار نکردن یک برنامه دخیل باشند و پیدا کردن مشکل را سخت کنند.

برای همین هم است که معمولاً اولین برنامه را در ساده‌ترین حالت ممکن انتخاب می‌کنند. در دنیای کامپیوتر برنامه شروع را  Hello world می‌نامند و به‌سادگی کد زیر است:

اما در دنیای الکترونیک وضع مقداری فرق دارد. پیاده‌سازی فرمان printf خود مستلزم آگاهی بسیار زیادی از اجزاء سخت‌افزاری و نرم‌افزاری است. به همین دلیل معمولاً برنامه شروع در دنیای الکترونیک خیلی متفاوت از آن چیزی است که در دنیای کامپیوتر وجود دارد. در دنیای الکترونیک برای شروع با هر سخت‌افزار و یا میکرو کنترلر، ابتدا سعی می‌شود برنامه یک چشمک‌زن نوشته شود. یعنی برنامه ای که با صفر و یک کردن یکی از پورت های موجود بر روی سخت‌افزار، بتوان به صحت اجرای برنامه پی برد. در واقع ساده‌ترین برنامه‌ای که می‌توان نوشت، برنامه یک چشمک‌زن است. برای همین است که در اکثر بردهای آموزشی، حداقل یک LED وجود دارد که می‌توان وضعیت آن را با استفاده از پردازنده مرکزی کنترل کرد. سخت‌افزار رزبری پای نیز از این قاعده جدا نبوده و خوشبختانه یک LED به نام ACT بر روی آن تعبیه شده است.

برای شروع، باید بدانیم که این LED به کدام پایه از پردازنده متصل شده است. با توجه به سخت‌افزار های متفاوت در ورژن های مختلف برد رزبری، لازم است که یکی را به‌عنوان سخت‌افزار پیش‌فرض در نظر بگیریم و آموزش را بر اساس آن جلو ببریم. با توجه به قدیمی شدن ورژن 1 و کمیاب شدن آن در بازار، سخت‌افزار پیش‌فرض را Raspberry pi 2 در نظر می‌گیریم.

قبل از هر چیز برای دانستن وضعیت اتصال ACT LED، باید شماتیک برد را داشته باشیم. خوشبختانه شماتیک آن توسط تیم توسعه‌ی رزبری پای در دسترس قرار گرفته است. برای دانلود شماتیک میتوانید به سایت رزبری پای مراجعه کنید.

همان‌طور که در تصویر فوق مشاهده می‌کنید، ACT LED که در شماتیک به‌صورت Status LED از آن نام برده شده به GPIO16 از پردازنده متصل شده است. در گام بعدی برای این‌که بتوانیم وضعیت یک GPIO را کنترل کنیم لازم است با ساز و کار مربوط به آن آشنا شویم و در واقع نیاز به دیتاشیت پردازنده داریم که خوشبختانه آن نیز در دسترس قرار گرفته است.

با توجه به اطلاعات به‌دست‌آمده در خصوص سخت‌افزار و هم‌چنین رجیسترهای کنترلی پردازنده، به‌راحتی می‌توان برنامه مورد‌نظر را نوشت. در این بخش از مقاله بیش از این وارد جزئیات نوشتن و عملکرد برنامه نمی‌شویم. در مقالات بعدی با توضیحات بیشتر، به نحوه پیاده‌سازی و کار با رجیستر های پردازنده خواهیم پرداخت.

چگونگی کامپایل برنامه

برنامه فوق را با اسم blinkact.c ذخیره می‌کنیم. برای کامپایل برنامه قبل از هر مسئله‌ای نیاز است که یک سری تنظیمات را در خصوص پلتفرم مورد‌استفاده انجام بدهیم که خوشبختانه با توجه به کامند لاین بودن کامپایلر GCC، تمام تنظیمات مربوطه به‌صورت پارامترهای ورودی دریافت می کند. برای کامپایل برنامه فقط کافی است که دستور زیر را یا در ترمینال یا کامند پرامپت اجرا کنیم:

کلید -mtune=cortex-a7 به کامپایلر می‌گوید که کد موردنظر را برای پردازنده‌های خانواده‌ی Cortex-a7 کامپایل کند و کلید -march=armv7-a به نوع معماری این خانواده اشاره دارد. بعد از اجرای دستور فوق، برنامه کامپایل شده و خروجی kernel.elf ایجاد می‌شود. فایل‌های elf، حاوی اطلاعات زیادی در خصوص کتابخانه‌های مورد‌‌استفاده، پارامترهایی جهت خطایابی و هم‌چنین اطلاعات اجرایی هستند. برای استخراج کدهای اجرایی نیاز است که دستور زیر را اجرا کنیم:

بعد از اجرای دستور فوق، فایل اجرایی kernel.img ایجاد می‎شود.

هم‌اکنون برنامه آماده اجرا است.

 

در مقاله‌ی بعد، ابزارهای مورد‌استفاده را کامل‌تر خواهیم کرد و نحوه کانفیگ ادیتور Eclipse را نیز توضیح خواهیم داد.

نوشته های مشابه

10 دیدگاه در “آموزش برنامه‌نویسی با رزبری پای بدون سیستم‌عامل – قسمت سوم

  1. سینا گفت:

    با سلام

    بنده 1 سوال و 1 مشکل برام پیش اومده.

    مشکل اینه که موقع کامپایل این خطا رو دریاف میکنم:

    ‘GPIO_GPFSEL4’ undeclared (first use in this function); did you mean ‘GPIO_BASE’?
    #define LED_GPFSEL GPIO_GPFSEL4

    التبه تعداد دیگه ای خطا هست که به نظرم با حل شدن این خطا همگی با هم رفع شن.

    و سوال اینه که برای رزبری از یه آرم کورتکس A استفاده شده، اما این کامپایلر داخل توضیحاتش چیزی در مورد اینکه میتونه کد روبرای این سری هم کامپایل کنه نگفته! پس چطور میتونه این کارو انجام بده!؟

    متن داخل صفحه ی دانلود:

    The toolchains support Arm Cortex-M0, Cortex-M0+, Cortex-M3, Cortex-M4, Cortex-M7, Cortex-M23, Cortex-M33, Cortex-R4, Cortex-R5, Cortex-R7, Cortex-R8 and Cortex-R52 processors.

    1. زئوس Zeus زئوس Zeus گفت:

      سلام دوست عزیز ، خطای مربوطه داره میگه که GPIO_GPFSEL4 ماکرو تعریف نشده ، احتمالا فایل رو include نکردید یا در مسیری نیست که کامپایلر ببیندش ، مشکل احتمالا از آدرس دهی است.
      در خصوص کامپایلر و توانایی کامپایل برای Cortex-A باید بگم که اگر به معماری و ساختار ARM نگاه کنید ، فارغ از نام گذاری Cortex-x ، هر ساختاری یک ورژن از این پردازنده رو استفاده می کنه ، به عنوان نمونه هسته های Cortex-M از ورژن ARMv7 و ARMv6 استفاده می کنه و Cortex-R عموما از ARMv7 استفاده میکنه ، خانواده Cortex-A هم از ARMv7 استفاده میکنه !
      البته ARMv7 با اون آرم هفت (مثل پردازنده های LPC2368) که در اصل ARM-TDMI هست فرق میکنه و پردازنده ARM-TDMI در واقع ARMv4 هست. باری به هر جهت ، وقتی هسته ها یک ورژن باشند دیگه فرقی نمیکنه ، و کامپایلر قادر به تولید ماشین کد مناسب برای اون معماری خواهد بود.
      برای اصلاعات بیشتر در خصوص ورژن های ARM به صفحه List of ARM microarchitectures مراجعه کنید.

  2. علی گفت:

    سلام
    تشکر از مطلب فوق العاده تون اتفاقا دنبالش بودم که با ناامیدی از منابع فارسی سرچ کردم و اومد خیلی خوشحال شدم! به اندازه یکی دو هفته کارم رو جلو انداختید ممنون! 🙂
    من الان دارم برای برد nano pi m1 همچین کاری میکنم! برنامه اش رو نوشتم (به کمک دیتاشیت و…)
    ولی نمیدونم فرایند بوت شدن توی Nano PI چطوریه! 🙁
    شما درباره بوت شدن توی Nani PI M1 اطلاعی دارید؟!
    چجوری میتونم برنامه ای که نوشتم رو اجرا کنم؟!
    با تشکر

    1. زئوس Zeus زئوس Zeus گفت:

      خواهش میکنم دوست عزیز ، خیلی خوشحالم که این مطالب مورد استقبال دوستان قرار گرده
      ببینید در خصوص برد مورد نظر شما ، اطلاع چندانی ندارم ، ولی معمولا تمام سیستم های Soc از یک رویه پیروی میکنند ، اول دنیال یه پراتیشن بوت روی استوریج مورد نظر می گردند و از اونجا فایل های مربوطه رو لود می کنند ، پردازنده مورد استفاده شما H3 است که اتفاقا طرف دار های زیادی داره ، شاید به این پردازنده هم بپردازیم
      در مورد اجرا ، ببینید فکر میکنم همین رویه که برای رزبری پای در پیش گرفتیم رو پیش برید با این تفاوت که احتمالا باید نوع کامپایل رو با توجه به پردازنده تغییر بدید.

  3. میر مهدی گفت:

    سلام.
    خیلی عالی بود!
    دستتون درد نکنه….
    منتظر قسمت بعدی هستیم…..

    1. زئوس Zeus زئوس Zeus گفت:

      سلام.
      متشکرم ، دوست عزیز ، خوشحالم که مطلب مورد توجه شما قرار گرفته است
      قسمت چهارم آموزش آماده و منتشره شده است
      برای مشاهده می توانید بر روی این لینک کلیک کنید.

  4. Pouria Rezaee Pouria Rezaee گفت:

    سلام قسمت بعدی کی میاد؟

    1. زئوس Zeus زئوس Zeus گفت:

      به زودی منتشر میشه
      در حال آماده سازی مطلب هستیم

  5. Pouria Rezaee Pouria گفت:

    ممنون از مطالب مفید سایتتون. وقتی میبینم یه سایت ایرانی هم میتونه خوب توضیح بده و ترجمه کنه خوشحال میشم. فقط سعی کنید مخصوصا تو این پست حجم مطالب قسمت های بعدی رو افزایش بدید تا از زیاد شدن قسمت ها و سردرگمی ها کم بشه باتشکر.

    1. زئوس Zeus زئوس Zeus گفت:

      خواهش میکنم دوست عزیز
      باعث افتخاره اگر توانسته باشیم نظر کاربران را جلب کنیم.
      در انتشار آموزش ها سعی میکنیم تا جای ممکن مطالب مفید باشند و در انتهای هر بخش به پایان کلی برسیم که باعث سردرگمی کاربران نشود
      متشکرم از نظر سازنده شما. حضور کاربرانی مثل شما باعث دلگرمی ما برای ادامه فعالیت میشه.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *