تاکنون، ما از ابزارهای جداگانهای مانند GCC ،make و یک ویرایشگر متن برای ساخت برنامههایمان استفاده کردهایم. این کار به شما اجازه میدهد تا ببینید هر ابزار چه کاری انجام میدهد و همچنین در مورد جزئیات توسعه نرمافزار یاد بگیرید.
اکنون شما با استفاده از یک محیط توسعه یکپارچه (IDE) آشنا خواهید شد. IDE برنامهای است که برای استفاده از تمام آن ابزارها (و برخی دیگر) در پشت یک رابط کاربری یکپارچه طراحی شده است.
مزیت اصلی این رویکرد این است که شما میتوانید از یک ابزار گرافیکی برای انجام همه کارها استفاده کنید. عیب بزرگ این است که فقط در صورتی بهخوبی کار میکند که شما مطابق با انتظارات IDE رفتار کنید. همچنین، چیزهای زیادی را از شما پنهان میکند. بهعنوانمثال، برای دریافت یک (linker map)، باید از چندین لایه GUI عبور کنید و linker map را در باکس مشخص شده وارد کنید.
نکات کلیدی در مورد IDE
- IDE مخفف Integrated Development Environment است.
- IDE ابزاری است که تمام ابزارهای لازم برای توسعه نرمافزار را در یک رابط کاربری واحد ادغام میکند.
- مزیت اصلی IDE این است که استفاده از آن آسان است و میتوانید تمام کارهای خود را در یک مکان انجام دهید.
- عیب اصلی IDE این است که میتواند انعطافپذیری کمتری داشته باشد و برخی از جزئیات فنی را از شما پنهان کند.
در ادامه این فصل، با جزئیات بیشتری به IDEها و نحوه استفاده از آنها خواهیم پرداخت.
محیط توسعه یکپارچه System Workbench for STM32: راحتی در کنار چالش
این دوره شما را با محیط توسعه یکپارچه System Workbench for STM32 که به طور خاص برای میکروکنترلرهای STM32 طراحی شده است، راهنمایی میکند. این IDE بر پایه Eclipse، یک IDE محبوب، ساخته شده و مجموعه کاملی از ویرایشگر، دیباگر و کامپایلر را ارائه میدهد.
این IDE بهویژه در دیباگ، بهخصوص برای میکروکنترلرها قدرتمند است. دیباگ از راه دور به طور سنتی نیازمند استفاده از چندین ابزار است، اما IDE با ادغام یکپارچه آنها، این فرایند را ساده میکند.
برای آشنایی با IDE، برنامه “Hello World” را که در فصل 1 نوشتید، دوباره اجرا خواهید کرد. البته این بار کل فرآیند توسعه در یک رابط کاربری گرافیکی (GUI) کاربرپسند اتفاق میافتد.
ایدهآل یا پیچیده؟ راحتی در مقابل کنترل
IDE راحتی و کنترل را با هم تراز میکند. درحالیکه با پنهانکردن کامپایلر و ابزارهای اساسی، کارها را سادهتر میکند، اما زمانی که نیاز به دسترسی و تنظیم دقیق آنها دارید، میتواند پیچیدگیهایی را نیز به همراه آورد.
برای مثال، اضافهکردن پرچم-Wextra به خط فرمان کامپایلر بدون استفاده از IDE بسیار آسان است – فقط کافی است makefile را ویرایش کنید. اما در هنگام استفاده از IDE، برای یافتن تنظیمات خاص باید یک مسیر پر پیچوخم را در میان منوها طی کنید.
راهنما:
Project ▶ Properties ▶ C/C++ Build ▶ Settings ▶ Tool Settings ▶ GCC Compiler ▶ All Options
این بخش ماهیت دوگانه IDEها را برجسته میکند: آنها سهولت استفاده را ارائه میدهند؛ اما ممکن است کنترل مستقیم بر ابزارهای توسعه را محدود کنند.
دانلود System Workbench for STM32
System Workbench for STM32 یک محیط توسعه یکپارچه (IDE) است که برای نوشتن برنامههای C برای دستگاههای تعبیهشده از آن استفاده میشود. برای دانلود به وبسایت https://www.openstm32.org بروید، لینک مربوط به System Workbench for STM32 را پیدا کرده و روی آن کلیک کنید. ثبتنام کنید (رایگان است) یا اگر حساب کاربری دارید وارد شوید، سپس لینکهای مربوط به دستورالعملهای نصب را دنبال کنید IDE را از نصبکننده آن و نه از Eclipse نصب کنید.
استفاده از System Workbench for STM32
تابهحال از یک ویرایشگر متن، کامپایلری به نام GCC و برنامهای به نام make برای اجرای کامپایلر استفاده کردهایم. با ورود به برنامههای پیچیدهتر، به یک دیباگر نیز نیاز خواهیم داشت.
System Workbench for STM32 همه این ابزارها را در یک محیط توسعه یکپارچه (IDE) که بر پایه Eclipse IDE ساخته شده است، ادغام میکند. در واقع، Eclipse با بسیاری از ابزارهای تخصصی مرتبط با STM32 همراه است و در ادامه بحث به آن بهعنوان Eclipse اشاره خواهیم کرد. ما در فصل ۳ بیشتر با جنبههای STM32 آشنا خواهیم شد. فعلاً بیایید با نوشتن یک برنامه IDE “Hello World” را بررسی کنیم.
شروع IDE
بعد از دانلود System Workbench for STM32 طبق دستورالعملهای وبسایت آن را نصب کنید. نصب این نرمافزار در حالت Standard یک آیکون روی دسکتاپ و یک آیتم در منوی استارت ایجاد میکند، بنابراین باید بتوانید IDE را بهراحتی مانند برنامههای دیگر اجرا کنید.
هنگام راهاندازی برای اولینبار، Eclipse از شما محل فضای کاری (workspace) را میپرسد. دایرکتوری موردنظر خود را، وارد کنید. سپس، Eclipse باید صفحه خوش آمد گویی را نمایش دهد. با کلیک بر روی نماد بستن (X کوچک کنار زبانه) صفحه را ببندید.
باید پنجرهای ظاهر شود که نشان میدهد سیستم ابزارهای اضافی برای پردازنده ARM را دانلود میکند. پس از اتمام کار سیستم، باید نمایی از یک پروژه خالی C/C++ ، همانطور که در شکل زیر نشاندادهشده است، را مشاهده کنید.
Eclipse رابط کاربری برای بسیاری از ابزارها است. نمایش آنها بهصورت سازمانیافته کار دشواری است. برای مقابله با این موضوع، Eclipse از view استفاده میکند. view، چیدمان پنجرهای است که برای یک کار خاص طراحی شده است. برای مثال، یک برنامهنویس جاوا ممکن است نمای متفاوتی نسبت به یک برنامهنویس C داشته باشد. به همین ترتیب، دیباگکردن نیاز به نمای متفاوتی نسبت به کدنویسی دارد.
نمای پیشفرض در این نسخه از Eclipse نمای مربوط به پروژه C/C++ است. (شما میتوانید در هر زمان با استفاده از منوی Window ▶ View، نما را تغییر دهید.) در سمت چپنما، Project Explorer (که در حال حاضر خالی است) قرار دارد که به شما امکان میدهد پروژههای خود و جزئیات آنها را مشاهده کنید. در وسط بالا، یک ویرایشگر متن دارید. در سمت راست یک پنجره با سه تب وجود دارد: Outline،Build Targets و Task List که ما در پروژههای پیچیدهتر به سراغ آنها میرویم.
در پایین یک پنجره کوچک و عریض با تبهای Problems ،Tasks ،Console ،Properties و Call Graph وجود دارد. پنجره Problems حاوی لیستی از خطاها و هشدارهایی است که توسط کد در پروژه جاری شما ایجاد میشود. پنجره Console حاوی خروجی فرایند ساخت (build) است. ما در مورد سایر تبها زمانی نگران خواهیم بود که شروع به ساخت برنامههای پیچیدهتر کنیم.
ساخت برنامه Hello World
در این بخش یک پروژه “Hello World” دیگر را با هم ایجاد خواهیم کرد. هر زمان که یک پروژه C (native) ایجاد میکنید، باید مراحل خاصی را طی کنید (native به این معنی است که برنامه روی ماشینی که روی آن کامپایل شده اجرا میشود؛ اگر آن را روی یک ماشین کامپایل کنید و روی ماشین دیگری اجرا کنید، به آن کراس کامپایل (cross-compilation) گفته میشود)، و در این قسمت به طور مفصل به آنها میپردازیم. شما این مراحل را بارها طی خواهید کرد؛ بنابراین برای اینکه مجبور نباشید همه آنها را بهخاطر بسپارید، میتوانید این مطلب رو در مرورگر خود بوکمارک کنید.
با انتخاب File ▶ New ▶ C Project از منو، یک پروژه جدید را شروع کنید. این کار پنجره C Project را باز میکند.
برای پروژه خود نام hello-ide.02 را انتخاب کنید، زیرا منحصر به فرد و توصیف کننده است. نام پروژه می تواند هر کاراکتری را به جز فاصله و کاراکترهای ویژه مانند اسلش رو به جلو (/)، بک اسلش (\)، سمی کالن (:) و سایر کاراکترهایی که معنای خاصی برای سیستم فایل شما دارند، داشته باشد. حروف، اعداد، خط تیره، نقطه و آندرلاین اشکالی ندارند.
هشدار📍
Eclipse به شما امکان ایجاد پروژهای با وجود Space در نام را میدهد؛ ولی بهدرستی آن را کامپایل نمیکند، بنابراین از فاصله استفاده نکنید.
برای نوع پروژه، Hello World ANSI C Project را انتخاب کنید. برای toolchains،toolchain مناسب سیستمعامل خود را انتخاب کنید، همانطور که در شکل ۲-۲ نشاندادهشده است. روی Next کلیک کنید.
اکنون، باکس کانفیگ اولیه را مشاهده میکنید. این کانفیگها را تغییر ندهید و فقط روی گزینه Next کلیک کنید.
شما گزینههای زیادی برای ساخت پروژه خود دارید. Eclipse این گزینهها را در پیکربندیهای پروژه گروهبندی میکند. دو موردی که به طور پیشفرض تعریف شدهاند Release و Debug هستند. Release کد بسیار بهینهسازیشدهای تولید میکند که دیباگکردن آن دشوار یا غیرممکن است. Debug کد بهینهسازی نشده و قابل دیباگ آسان تولید میکند و نمادهای دیباگ را ایجاد میکند.
ازآنجاییکه شما در حال یادگیری هستید، با پیکربندی Debug کار خواهیم کرد. پیکربندی Release را انتخاب نکنید و فقط Debug را انتخاب کنید و روی Finish کلیک کنید.
IDE پروژه ما را ایجاد میکند و چندین فایل تولید میکند. یکی از این فایلها کد سورس ما است که مطابق شکل زیر از قبل با نسخهای از برنامه “Hello World” پر شده است.
اگر خودتان کدی وارد کنید، توجه داشته باشید که ویرایشگر Eclipse به طور پیشفرض از اندازه تب ۴ استفاده میکند، به این معنی که وقتی از یک تب برای تورفتگی یک خط در کد منبع استفاده میکنید، عرض تب چهار فاصله خواهد داشت. تقریباً تمام ویرایشگرها و ابزارهای دیگر از هشت فاصله استفاده میکنند. میتوانید این مشکل را در بخش Window ▶ Preferences برطرف کنید.
در این مرحله کار ما تمام میشد – اگر با جاوا کد مینوشتیم. Eclipse برای جاوا طراحی شده است. C یک افزونه است که تقریباً به طور کامل کار میکند فقط ما باید یک کار دیگر انجام دهیم.
ابتدا با انتخاب Project ▶ Build Project پروژه را کامپایل کنید. سپس Run ▶ Run Configurations را انتخاب کنید که باید پنجره Run Configurations را باز کند. بعد، روی C/C++ Application در سمت چپ کلیک کنید، سپس روی نماد کوچک در سمت چپ ردیف نمادها برای ایجاد یک پیکربندی جدید کلیک کنید. در نهایت، زیر C/C++ Application، روی Browse کلیک کنید، همانطور که در شکل زیر نشاندادهشده است.
از مرورگر فایل برای یافتن فایل اجرایی خود در پوشه Debug استفاده کنید. IDE یکپوشه پروژه برای شما در فضای کاری (محل آن به سیستم بستگی دارد) ایجاد کرده است که نام آن با پروژه شما مطابقت دارد. تمام فایلهای پروژه شما در این فهرست قرار دارند. در داخل پوشه پروژه، یکپوشه Debug حاوی تمام فایلهای ساخته شده بهعنوان بخشی از ساخت Debug (تنها نوع ساخت ما) قرار دارد. در داخل آن پوشه، .hello-ide02 را در macOS و Linux یا 02.hello-ide.exe را در Windows پیدا خواهید کرد. این فایل را انتخاب کنید، همانطور که در شکل زیر نشاندادهشده است و سپس روی OK کلیک کنید.
بعد از انتخاب فایل اجرایی در پنجره Application Selection، روی Apply و سپس Close کلیک کنید. این کار به IDE میگوید که برنامه شما واقعاً در کجا قرار دارد.
حالا بیایید برنامه را اجرا کنیم. Run ▶ Run را انتخاب کنید. نتایج باید مانند شکل زیر در پنجره Console ظاهر شوند.
دیباگکردن برنامه
حالا برای یک معرفی کوتاه به debugger میپردازیم که برنامه ما را در حین اجرا نظارت میکند و به ما امکان میدهد ببینیم چه اتفاقی در داخل آن میافتد. ابتدا، با تکرار خط ۱۵ (puts(“!!!Hello World!!!”);) کد بیشتری را برای دیباگ تولید کنید و سپس با انتخاب File ▶ Save All پروژه را ذخیره کنید.
مهم است که بعد از هر ویرایش، File ▶ Save All را انجام دهید. اگر بخواهید برنامه را قبل از ذخیره همه فایلها اجرا کنید، کامپایلر فایل قدیمی و ذخیره نشده روی دیسک را میبیند و آن را کامپایل میکند. برنامه حاصل تنها یکبار بهجای دو بار، !!! Hello World!!! چاپ میکند که میتواند بسیار گیجکننده باشد. کدی که جلوی ماست صحیح است؛ کدی که اجرا میکنیم صحیح نیست. تا زمانی که File ▶ Save All را انتخاب نکنید، فایلها یکسان نیستند.
حالا بیایید دیباگ را با Run ▶ Debug (نگاهی به شکل زیر بیندازید.) شروع کنیم.
IDE در حال رفتن به حالت دیباگ است که ظاهر رابط کاربری را از توسعه به دیباگکردن تغییر میدهد. این به معنای یک چیدمان پنجرهای کاملاً جدید است. سیستم به شما هشدار میدهد که این اتفاق در حال رخدادن است، همانطور که در شکل زیر نشاندادهشده است.
به یاد داشته باشید که همیشه میتوانید با دستور
Window ▶ Perspective ▶ C/C++ یا Window ▶ Perspective ▶ Debug
رابط کاربری را تغییر دهید.
روی Yes در پنجره باز شده کلیک کنید. نمای دیباگ باید باز شود، همانطور که در شکل زیر نشاندادهشده است.
در بالا سمت چپ، پنجره Stack Trace قرار دارد که برنامه در حال اجرا و میزان پیشرفت آن را نشان میدهد. این اطلاعات زمانی که در قسمتهای بعدی در مورداستفاده از stack صحبت میکنیم، مفیدتر خواهد بود.
در کنار آن پنجره Variables/Breakpoints/Registers/I/O Registers/Modules قرار دارد که حاوی موارد زیر است:
متغیرها (Variables)
اطلاعاتی در مورد متغیرهای برنامه میباشد.
نقاط شکست (Breakpoints)
breakpoint در برنامه جایی است که میخواهیم در زمان دیباگ برنامه پس از رسیدن به آن و قبل ا اجرای آن خط متوقف شود تا بررسیهای بیشتری را در زمان دیباگ انجام دهیم. شما میتوانید با دو بار کلیککردن روی شماره خط قابل اجرای برنامه خود، یک breakpoint تنظیم کنید. ما در فصل ۳ شروع به استفاده از آنها خواهیم کرد.
رجیسترها
اطلاعاتی در مورد وضعیت فعلی رجیسترهای پردازنده. (در فصل ۱۰ در مورد آنها صحبت میکنیم.)
ماژولها
ماژولهای لینک شده پویا. ازآنجاییکه این ویژگی برای برنامهنویسان امبدد سیستم در دسترس نیست، ما در مورد آن بحث نخواهیم کرد.
در وسط صفحه، پنجره Source برنامه ما را نمایش میدهد. خط برجسته کد نشان میدهد که دیباگر برنامه را تا این خط اجرا کرده و متوقف کرده است.
در کنار پنجره Source، پنل Outline وجود دارد. این شبیه به یک فهرست مطالب است که نشان میدهد کدام فایلها به برنامه ما وارد میشوند. من فایلهای stdio.h و stdlib.h را اضافه کردهام تا در اینجا نمایش داده شوند.
در پایین صفحه، پنجره Console/Tasks/Problems/Executables/Memory وجود دارد. پنجره Console خروجی برنامه را نمایش میدهد.
حالا ما برنامه را مرحلهبهمرحله طی خواهیم کرد، به این معنی که با استفاده از دیباگر تکتک دستورالعملها را اجرا خواهیم کرد. روی نماد Step Over در بالای صفحه (شکل زیر) کلیک کنید یا برای Step Over کلید F6 را فشار دهید.
خط برجسته شده در پنجره Source یک خط جلو میرود و !!!Hello World!!! در پنجره Console ظاهر میشود (شکل زیر).
اگر به قدمبهقدم اجراکردن برنامه (step-by-step) ادامه دهید، اجرای دستور puts دوم و سپس دستور return را مشاهده خواهید کرد. پس از آن، برنامه برای انجام کارهای پاکسازی وارد کتابخانه سیستم میشود. ازآنجاییکه ما کد منبع این کتابخانه را نداریم، دیباگر نمیتواند هیچ اطلاعاتی در مورد آن نمایش دهد.
دو نماد مهم دیگر در نوارابزار وجود دارد (به شکل زیر مراجعه کنید). نماد Resume (یا کلید F8) برنامه را تا زمانی که به پایان برسد یا به breakpoint برسد، اجرا میکند. نماد Debug دیباگکردن را مجدداً راهاندازی میکند.
ما در فصلهای آینده از دیباگر زیاد استفاده خواهیم کرد. این ابزار روشی بسیار مفید برای بهدستآوردن اطلاعات از برنامه در حال اجرا و مشاهدهی اتفاقات درون آن در اختیار ما قرار میدهد.
برای بازگشت به نمای اصلی C++/C
++Window ▶ Perspective ▶ Open Perspective ▶C
را انتخاب کنید.
IDE کد منبع C را به همراه توابع puts برای چاپ “Hello World” تولید کرد. همچنین فایلی به نام Debug/makefile ایجاد کرد که بهعنوان ورودی برای برنامه make استفاده میشود. در ادامه قسمتی از این فایل را میبینیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | ########################################################## ################# # Automatically-generated file. Do not edit! ########################################################## ################# -include ../makefile.init RM := rm -rf # All of the sources participating in the build are defined here -include 1 sources.mk -include src/subdir.mk -include subdir.mk -include 2 objects.mk ifneq ($(MAKECMDGOALS),clean) ifneq ($(strip $(C_DEPS)),) -include $(C_DEPS) endif endif -include ../makefile.defs # Add inputs and outputs from these tool invocations to the build variables # All Target all: 02.hello-ide |
فایل Debug/makefile
این makefile در دایرکتوری Debug قرار دارد. IDE از چندین کانفیگ Build، پشتیبانی میکند و برای هر کدام یک makefile در دایرکتوری جداگانه ایجاد میکند. (برای این پروژه، فقط یک پیکربندی Debug ایجاد کردیم. ممکن است پروژههای دیگر از پیکربندی Release هم استفاده کنند.)
این makefile پیچیدهتر از makefileای است که در فصل 1 خودمان ایجاد کردیم، زیرا IDE از مقدار زیادی سینتکس پیشرفته make استفاده میکند. IDE همچنین فایلهای sources.mk 1 و objects.mk 2 را ایجاد کرده که در makefile اصلی include شدهاند. از این فایلها میتوانیم بفهمیم که چیزهای تولید شده توسط کامپیوتر برای انعطافپذیری بالا طراحی شدهاند، حتی اگر این کار خواندن آنها را تقریباً غیرممکن کند.
در حال حاضر، IDE اطلاعات زیادی را تولید یا دانلود نمیکند. اما زمانی که شروع به برنامهنویسی امبدد میکنیم، این موضوع به طور چشمگیری تغییر خواهد کرد.
خلاصه
IDE یک ابزار دو لبه است. ازیکطرف، لازم نیست نگران تمام ابزارهایی باشید که برای ساخت یک برنامه نیاز دارید. شما مجبور نبودید makefile را ایجاد کنید، بهصورت دستی عملیات build را انجام دهید یا debugger را اجرا کنید.
اما این رویکرد خودکار هزینهای دارد. برای اضافهکردن یک flag زمان کامپایل به برنامهی خود از فصل ۱، شما فقط کافی بود flag را به makefile اضافه کنید. با IDE، نمیتوانید این کار را انجام دهید، زیرا IDE بهصورت خودکار makefile را تولید میکند. باید گزینهی پیکربندی درست را برای انجام این کار در IDE پیدا کنید، و همانطور که خواهیم دید،IDE گزینههای زیادی دارد.
در این دوره، ما سعی کردهایم تاحدامکان سادگی را با استفاده از چکلیستها (مانند لیست که در آخر این مطلب میتوانید دانلود نمایید) و رویههای استاندارد حفظ کنیم. Eclipse سعی میکند همه چیز به طور ایدهآل کار کند.