RTOS, آموزش RTOS با STM32, توصیه شده

کامپایلر GCC چیست؟ + بررسی نحوه عملکرد | آموزش RTOS با STM32 قسمت 1

کامپایلر GCC

این اولین قسمت از فصل اول آموزش FreeRTOS در STM32 نوشتن یک سیستم‌عامل بلادرنگ برای میکروکنترلرهاست. در این قسمت به بررسی کامپایلر GCC می پردازیم. همان‌طور که قبلاً گفتم فصل اول درباره پیش‌نیازهای نوشتن یک سیستم‌عامل بلادرنگ است. تمامی کسانی می‌خواهند به‌عنوان توسعه‌دهنده در حوزه میکروکنترلرها فعالیت کنند، باید با یک سری نرم‌افزارها و ابزارها و یک سری مفاهیم مرتبط با میکروکنترلرها آشنایی داشته باشند.

پس داشتن شناخت عمیق در هر حوزه‌ای برای یک توسعه‌دهنده آن حوزه از نون شب واجب تره. در این قسمت میخوام دررابطه‌با ابزاری صحبت کنم که اگه ساخته نمیشد ما باید با صفر و یک برنامه می‌نوشتیم. درست حدس زدید کامپایلرها . کامپایلر مفهومی است که امروزه به لطف توسعه‌دهندگان سیار گسترده و بزرگ شده؛ اما در این قسمت ما با کامپایلرها و تفاوتشان با IDEها آشنا میشیم و به سؤالاتی از قبیل اینکه اصلاً IDE چی هست؟ کامپایلر چیست؟ از کدوم کامپایلر استفاده کنیم بهتره؟ چطور یک کامپایلر نصب کنیم؟ حالا که نصب کردیم چطور ازش استفاده کنیم؟ و سؤالاتی ازاین‌قبیل پاسخ میدیم. این سؤالات اولین و ابتدایی‌ترین سؤالاتی هستند که با ورود به دنیای برنامه‌نویسی برامون ایجاد میشه که قراره باحوصله به اونها پاسخ بدیم. پس با سیسوگ همراه باشید.

کامپایلر چیست؟؟؟

کامپایلر در واقع یک ابزار نرم‌افزاری است که برنامه ما رو به فایلی تبدیل می‌کند که توسط کامپیوتر،Socها یا MCUها قابل‌اجرا باشد و از اونجا که ما با میکروکنترلر کار می‌کنیم، اغلب منظورمون از برنامه، کدی است که به زبان C یا ++C نوشته شده باشد.پس کامپایلر اون نرم‌افزاری نیس که بتونی کدت رو داخلش ادیت کنی.

خوب کامپایلرهای متفاوتی برای تبدیل کد C یا ++C برای سیستم‌عامل وجود دارد.مانند:

  • کامپایلر GCC که مخفف GNU Compiler Collection هست و توسط ریچارد استالمن توسعه داده شده و یک کامپایلر تمام‌عیار با همه ابزارهایی است که یک برنامه‌نویس به آن نیاز دارد.
  • کامپایلر Clang که بر مبنای پروژه LLVM توسعه داده شده و بسیار شبیه به کامپایلر GCC است.
  • کامپایلر MSVS که مخفف MicroSoft Visual Studio هست و توسط مایکروسافت توسعه داده شده است.

کامپایلر های C و C++

ما در این آموزش از کامپایلر GCC استفاده می‌کنیم.حالا چرا؟

زیرا کامپایلر GCC یک کامپایلر Open Platform هست. یعنی این کامپایلر قابلیتش رو داره که برنامه شما رو برای هر CPU کامپایل کنه.برای مثال اگه شما برنامه‌ای نوشته باشید و بخواهید توسط کامپایلر GCC(GCC compiler) کامپایل برنامتون رو انجام بدید، میتونید اون برنامه رو برای کامپیوتری که مثلاً سی پی یوش اینتل هست کامپایل کنید، یا برای رزبری پای که سی پی یوش آرم هست یا حتی میکروکنترلری که سی پی یوش ARM Cortex M3 هست.

شاید برای شما مفید باشد: آموزش رزبری پای از 0 تا 100

همچین دلایل مهمتری از این دلیلی که من گفتم هم وجود دارد که توصیه میکنم قبل از هر اقدامی این مطالب “کامپایلر Codevisionavr در مقابل کامپایلر GCC و مقایسه تخصصی آنها” و “مقایسه تخصصی کامپایلر کیل و GCC“مطالعه کنید.

خب حالا که یکم با GCC آشنا شدید همین اول بگم که نگید نگفتم :(کلاً کامپایلر GCC در سیستم‌عامل‌هایی که کرنل اونها بر مبنای UNIX نوشته شده باشد عملکرد بهتری دارد مثل لینوکس یا مک) اما کلاً عملکردش در ویندوز کندتره.

IDE چیست؟؟؟

بعضی نرم‌افزارها هستند که هم میشه داخلشون برنامه مون رو ویرایش کنیم و هم میشه با زدن یک کلید برنامه رو کامپایل کرد و هم بعد از اون میشه برنامه رو دیباگ هم کرد، مثل Arduino IDE یا STM32CubeIDE یا Keil . به این نرم‌افزارها IDE گفته می‌شود.IDE ها یک محیط یکپارچه از ابزارهای ادیتور کد، کامپایلر و دیباگر رو برای ما فراهم می‌کنند تا بتونیم راحت‌تر و بهتر برنامه‌نویسی کنیم.

خوب حالا قراره بریم سراغ عملیاتی‌کردن حرفامون و کامپایلر gcc رو نصب کنیم و با اون کار کنیم تا پیچ‌وخم کار تا حدودی دستمون بیاد اما قبلش باید بگم که کلاً از این به بعد ماجرا خبری از یک محیط گرافیکی قشنگ که حضرات مرحمت بفرمایند و کلید کامپایل رو بزنند و کامپایل انجام بشه نیس و ما قراره همه کارهامون رو با ترمینال لینوکس انجام بدیم. چون ترمینال دسترسی‌های بیش‌تری برای کامپایل به ما میده و بهتر میتونیم با قابلیت‌های کامپایلر آشنا بشیم. بزن بریم…

چطور کامپایلر GCC رو نصب کنیم؟

کامپایلر gcc در بعضی توزیع‌های لینوکس مثل Mint به‌صورت خودکار نصب هست؛ اما برای بقیه توزیع‌ها مثل Ubuntu باید از یه یار قدیمی و همیشگی به نام دستور apt استفاده کنیم و کامپایلر gcc رو از ریپوزیتوری دریافت و نصب کنیم. به همین سادگی.

حالا میخوایم یه کد خیلی ساده به زبان C رو توسط این کامپایلر ، کامپایل کنیم که کد به‌صورت زیر هست:

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

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

دقت کنید نامی که پس از سوئیچ o- می‌آید،نام فایل خروجی است. خوب حالا که فایل خروجی ساخته شد، برای اجرای آن کافی است که نام فایل خروجی را در ترمینال فراخوانی کنیم:

نکتهیک فایل اجرایی در لینوکس مانند یک فایل اجرایی در ویندوز نیس که حتماً نیاز به پسوند داشته باشد. ممکنه یک فایل اجرایی در لینوکس هیچ پسوندی نداشته باشد و تنها این مهمه که اون فایل دسترسی اجراشدن داشته باشد؛ مانند فایل زیر:

حالا می‌خواهیم یکم کار روسخت تر کنیم و یک هدر فایل به برنامه اضافه کنیم که در این صورت برناممون به‌صورت زیر می‌شود:

همونطور که می‌بینید ما فایل کتابخانه metech.h رو که در داخل دایرکتوری برناممون بود، به برنامه اضافه کردیم و از تابع print آن استفاده کردیم.حالا برنامه رو مثل قبل کامپایل می‌کنیم و می‌بینیم که اجرا می‌شود .

حالا سؤال اینجاست که چرا کتابخانه metech.h رو داخل کوتیشن قرار دادیم و کتابخانه stdio.h رو داخل براکت زاویه‌دار؟ تفاوتشون چیه؟

در برنامه نویسی برای الحاق فایل های کتابخانه به برنامه با استفاده از دستور include# دو حالت وجود دارد که این دو حالت بر عملکرد کامپایلر در پیداکردن فایل کتابخانه تاثیرگذار است:

در برنامه‌نویسی برای الحاق فایل‌های کتابخانه به برنامه با استفاده از دستور include# دو حالت وجود دارد که این دو حالت بر عملکرد کامپایلر در پیداکردن فایل کتابخانه تأثیرگذار است:

1.Quotation Mode : در این حالت برای الحاق کتابخانه به برنامه از ” ” استفاده می‌کنیم و برای کامپایل اگر:

  • فایل کتابخانه در دایرکتوری سورس کد قرار داشته باشد، از دستور gcc به‌صورت زیر استفاده می‌کنیم:
  • فایل کتابخانه در دایرکتوری دیگری قرار داشته باشد، از دستور gcc به‌صورت زیر استفاده می‌کنیم:

در این حالت در واقع کامپایلر برای یافتن فایل کتابخانه به روش زیر عمل می‌کند:

روش یافتن کتابخانه

2.Angle Bracket Mode : در این حالت برای الحاق کتابخانه به برنامه از <> استفاده می‌کنیم و از این روش بیشتر برای الحاق کتابخانه‌های استاندارد سیستم مانند stdio.h استفاده می‌شود.حالا اگه بخواهیم کتابخانه‌ای که خودمون نوشتیم رو به این روش به سورس کد اضافه کنیم، از دستور gcc به‌صورت زیر استفاده می‌کنیم:

در این حالت در واقع کامپایلر برای یافتن فایل کتابخانه به روش زیر عمل می‌کند:

روش کامپایلر برای یافتن فایل کتابخانه

در واقع در این حالت تنها در بین کتابخانه‌های استاندارد سیستم جستجو انجام می‌شود و به همین دلیل است که بیشتر کتابخانه‌های از پیش تعریف شده را به این روش به برنامه الحاق می‌کنند.حالا محل این کتابخانه‌های استاندارد کجاست و شامل چه کتابخانه‌هایی می‌شود؟

محل کتابخانه ها

کتابخانه‌های استاندارد در واقع تعدادی از کتابخانه‌های زبان C هستند که توسط برنامه‌نویسان توسعه داده شده‌اند و به آنها کتابخانه‌های از پیش تعریف شده نیز گفته می‌شود.

حالا که یک مثال ساده زدیم و کمی با کامپایلر GCC در محیط ترمینال آشنا شدیم، میخوایم جزئی‌تر فرایند کامپایل برنامه را دنبال کنیم. پس با ما همراه باشید.

 

مراحل کامپایل یک برنامه توسط کامپایلر GCC

1.پیش‌پردازش (PreProcessing) 

این مرحله اولین مرحله از فرایند کامپایل یک برنامه است. در این مرحله دستورات پیش‌پردازنده با مقادیر واقعی‌شان جایگزین می‌شوند.حالا این دستورات پیش‌پردازنده چی هست اصلاً؟ دستورات پیش‌پردازنده به کلیه دستوراتی در زبان C گفته می‌شود که با علامت # شروع می‌شوند و در واقع کارشان جایگزینی یک مقدار یا فایل با یک نام است که در مرحله پیش‌پردازش این اسامی با مقادیر واقعی‌شان جایگزین می‌شوند. برای مثال دستورات پیش‌پردازنده مثال قبل:

حالا می‌خواهیم یک مثال ساده بزنیم و فایل خروجی پیش‌پردازنده رو از کامپایلر استخراج کنیم تا منظور حرفم رو بهتر متوجه بشید.

خب پس از کامپایل خواهیم دید که برنامه به‌درستی اجرا می‌شود و اما برای استخراج فایل پیش‌پردازش شده باید از دستور gcc به‌صورت زیر استفاده کنیم:

مانند:

معمولاً فایل‌های پیش‌پردازش شده دارای پسوند “i.” هستند.

حال اگر پس از اجرای دستور بالا فایل خروجی پیش‌پردازش شده را به‌صورت فایل متنی باز کنیم خواهیم دید که :

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